【三】Kubernetes學習筆記-Pod 生命周期與 Init C 介紹


一、容器生命周期

  • Init C(初始化容器)只是用於 Pod 初始化的,不會一直隨着 Pod 生命周期存在,Init C 在初始化完成之后就會死亡。
  • 一個 Pod 可以有多個 Init C,也可以不需要 Init C。
  • Init C 是依次執行的,第一個執行成功后才可以執行下一個 Init C,不能同時執行。

image

Main C 退出后 Pod 生命周期就會結束,Init C 正常退出后 Pod 生命周期並不會結束,但是 Init C 不是正常退出(返回0)的話,是不會執行到 Main C 這一步的。
如果 Pod 的 Init 容器失敗,Kubernetes 會不斷的重啟該 Pod,直到 Init 容器成功為止。
如果 Pod 對應的 restartPolicy 為 Never,它不會重新啟動。

二、Init 容器

Pod 能夠具有多個容器,應用運行在容器里面,但是它也可能有一個或多個先於應用容器啟動的 Init 容器。

Init 容器與普通容器非常相似,除了如下兩點:

  • Init 容器總是運行到成功完成為止;
  • 每個 Init 容器都必須在下一個Init容器啟動之前成功完成。

Init 容器使用案例

Init 模板:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod   # Pod 名稱
  labels:  
    app: myapp      # Pod 標簽
spec:
  containers:
  - name: myapp-container   # Pod 里面第一個容器名稱
    image: busybox          # 該容器使用的鏡像名稱
    command: ['sh','-c','echo The app is running! && sleep 3600']
    # 執行命令,輸出一句話結束后該容器休眠6分鍾
  initContainers:         # 對容器初始化
  - name: init-myservice  # 第一個初始化容器名稱
    image: busybox        # 初始化容器鏡像
    command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
    # 解析 myservice ,until 當條件為真的時候退出循環;
    # 如果解析不成功,輸出一句話,休眠2s繼續循環。
  - name: init-mydb   # 第二個初始化容器名稱
    image: busybox
    command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
    # 跟第一個類似,不多追溯。

創建 Pod :

image

READY:總共一個需要就緒的,現在就緒狀態為0;
STAUS:總共兩個初始化容器,現在一個都沒有成功;

查看 Init 容器日志:

image

解析不成功,導致 Init 容器在不斷循環解析:

image

接下來創建一個 Service 使得 Init 容器可以解析成功:

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
    port: 80
    targetPort: 9376

image

再次查看 Pod 狀態:

image

其中第一個 Init 容器已經執行成功了,由於第二個 Init 容器還是沒有解析成功,所以 Pod 就緒狀態還是為0。

接下來創建 mydb Service :

kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
    - protocol: TCP
    port: 80
    targetPort: 9377

image

此時再次查看 Pod 狀態:

image

只有兩個 Init 容器初始化都成功了,Main C (也就是這里的 myapp-pod)才會運行成功。

特殊說明

  • 在 Pod 啟動過程中,Init 容器會按順序在 網絡數據卷 初始化之后啟動,每個容器必須在下一個容器啟動之前成功退出。

這里的“網絡”和“數據卷”是指 Pause 容器,真正 Pod 第一個啟動的容器不是 Init 容器,而是 Pause 容器。

  • 如果由於運行時或失敗退出,將導致容器啟動失敗,它會根據 Pod 的 restartPolicy 指定的策略進行重試。然而,如果 Pod 的 restartPolicy 設置為 Always,Init 容器失敗時會使用RestartPolicy 策略。

  • 在所有的 Init 容器沒有成功之前,Pod 將不會變成 Ready 狀態。Init 容器的端口將不會在 Service 中進行聚集。正在初始化中的 Pod 處於 Pending 狀態,但應該會將 Initializing 狀態設置為 true。

  • 如果 Pod 重啟,所有 Init 容器必須重新執行。

  • 在 Pod 中的每個 app 和 Init 容器的名稱必須唯一,與任何其他容器共享同一個名稱,會在驗證時拋出錯誤。

同一組 Init 容器端口是可以相同的,因為第一個 Init 容器啟動成功后就會退出,端口就不會被占用。

以上有不恰當或者講得不對的地方,希望各位留言指正,謝謝!
站在巨人的肩膀上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM