kubernetes雜談之(二)Pod初談

wzj_110發表於2020-10-14

一    Pod的概念

(1)pod和容器的關係

pod和容器'containers'的關係 --> '一個pod至少包含兩個容器'-->'一個pause容器,一個業務容器'

Pod:Kubernetes部署和管理的最小單位,也是'最小的排程單位'

(2)pause容器

Pause容器的'作用'  --> 所有的'業務容器''共享'pause的'網路名稱空間和資料卷'

pause:沙盒容器,它永遠是pod中'第一個被建立'的容器,其它定義的容器都是通過'join network namespace'的方式,與infra容器'關聯'在一起的
 
1)所有的業務容器-->'網路模式類似Docker container模式'-->'同一個pod內容器共享同一個網路棧(名稱空間)' -->'共享ip和port'

效果1:一個POD裡的容器都可以通過'localhost'訪問

效果2:'流量進出'都是通過infra容器

2)Pod中的所有容器都可以'訪問共享的volume'

所以:pause總是先啟動,自然'網路和資料卷會先建立' --> '因為要為其它業務容器提供'

###############  '原理'  ###############

每當'一個Pod被建立',那麼首先建立一個 'pause' 容器,之後這個pod裡面的其他容器通過'共享'這個pause容器的網路棧,實現與外部pod'進行通訊',然後通過'localhost'進行pod內部的'container的通訊'

(3)Kubernetes為什麼讓一個POD裡放置多個容器

Docker的理念:'一個容器一個程式'

為什麼:KUbernetes設計出一個'全新的Pod概念',並且Pod有這樣'特殊的組成結構'?

1) 引入'業務無關且不易死亡'的Pause容器作為'Pod的根容器',通過pasue狀態代表'整個容器的狀態',作為pod是否'健康的標準'

2) Pod裡多個業務容器共享Pause的IP和Port,共享Pause容器掛接的Volume,簡化了'緊密關聯'的業務容器之間的'通訊問'題,很好的解決容器間'檔案共享'

*******************  'pod多容器的劣勢'  *******************

違反'一個容器一個程式'的原則

因為同一個容器中有'多個程式',系統將很難排錯,因為來自不同程式的'日誌'將'被混合在一起',很難管理程式的'生命週期'

二    Pod定義詳解

說明:'Deployment、DaemonSet、StatefulSet'都是基於'pod',所以必須詳細瞭解pod的'配置檔案'

1)Pod屬於'namespace'級別的資源

2)從Pod的配置檔案引出一些'核心的概念'-->'Annoations等'

3)pod是k8s'最小的排程單位'

(1)常見的

apiVersion: v1   --YAML描述檔案'所使用的Kubernetes API版本'-->kubectl explain pods -->'不同版本可能不一樣'
kind: Pod        --Kubernetes '物件資源'
metadata:        --pod'後設資料'(名稱、標籤和註解)
  labels:
    run: httpd        --'pod的自定義標籤,方便標籤選擇器進行選擇'
  name: httpd-gv4bl   --'pod的名字'-->'後續貼出規範'
  namespace: default  --'pod所處的名稱空間'
spec:                 --'pod中容器的詳細定義' --> '規格/內容(pod的容器列表、volume)'
  containers:
  - image: httpd             -- '容器的映象名稱' -->'倉庫:標籤'
    imagePullPolicy: Always  -- '映象的拉取策略'
    name: httpd              -- '容器的映象名稱'
    ports:                   -- '容器暴露的埠列表'
    - containerPort: 80      -- '容器需要監聽的埠號'
      protocol: TCP          -- '埠協議,預設是TCP'
    resources: {}            -- '資源限制和資源請求-->後續講解'
  dnsPolicy: ClusterFirst    -- 'DNS策略' --> '後續自定義DNS引入kubernetes'
  nodeName: minikube         -- '定向排程-->非必須'
  restartPolicy: Always      -- 'pod的重啟策略'
  securityContext: {}        -- '安全上下文'
  serviceAccount: default    -- '使用者身份'

(2)網路

(3)儲存

(3)安全

(4)賬戶

(5)健康檢查