K8S中Pod的生命周期與init container初始化容器詳解
主機配置規劃
| 服務器名稱(hostname) | 系統版本 | 配置 | 內網IP | 外網IP(模擬) |
|---|---|---|---|---|
| k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
| k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
| k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
Pod容器生命周期

Pause容器說明
每個Pod里運行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網路堆疊和Volume掛載卷,因此他們之間通信和資料交換更為高效,在設計時可以充分利用這一特性,將一組密切相關的服務行程放入同一個Pod中;同一個Pod里的容器之間僅需通過localhost就能互相通信,
kubernetes中的pause容器主要為每個業務容器提供以下功能:
PID命名空間:Pod中的不同應用程式可以看到其他應用程式的行程ID,
網路命名空間:Pod中的多個容器能夠訪問同一個IP和埠范圍,
IPC命名空間:Pod中的多個容器能夠使用System V IPC或POSIX訊息佇列進行通信,
UTS命名空間:Pod中的多個容器共享一個主機名;Volumes(共享存盤卷),
Pod中的各個容器可以訪問在Pod級別定義的Volumes,
Init Container容器
Pod可以包含多個容器,應用運行在這些容器里面,同時 Pod 也可以有一個或多個先于應用容器啟動的 Init 容器,
如果為一個 Pod 指定了多個 Init 容器,這些Init容器會按順序逐個運行,每個 Init 容器都必須運行成功,下一個才能夠運行,當所有的 Init 容器運行完成時,Kubernetes 才會為 Pod 初始化應用容器并像平常一樣運行,
Init容器與普通的容器非常像,除了以下兩點:
1、Init容器總是運行到成功完成且正常退出為止
2、只有前一個Init容器成功完成并正常退出,才能運行下一個Init容器,
如果Pod的Init容器失敗,Kubernetes會不斷地重啟Pod,直到Init容器成功為止,但如果Pod對應的restartPolicy為Never,則不會重新啟動,
在所有的 Init 容器沒有成功之前,Pod 將不會變成 Ready 狀態, Init 容器的埠將不會在 Service 中進行聚集, 正在初始化中的 Pod 處于 Pending 狀態,但會將條件 Initializing 設定為 true,
如果 Pod 重啟,所有 Init 容器必須重新執行,
在 Pod 中的每個應用容器和 Init 容器的名稱必須唯一;與任何其它容器共享同一個名稱,會在校驗時拋出錯誤,
Init 容器能做什么?
因為 Init 容器是與應用容器分離的單獨鏡像,其啟動相關代碼具有如下優勢:
1、Init 容器可以包含一些安裝程序中應用容器不存在的實用工具或個性化代碼,例如,在安裝程序中要使用類似 sed、 awk、 python 或 dig 這樣的工具,那么放到Init容器去安裝這些工具;再例如,應用容器需要一些必要的目錄或者組態檔甚至涉及敏感資訊,那么放到Init容器去執行,而不是在主容器執行,
2、Init 容器可以安全地運行這些工具,避免這些工具導致應用鏡像的安全性降低,
3、應用鏡像的創建者和部署者可以各自獨立作業,而沒有必要聯合構建一個單獨的應用鏡像,
4、Init 容器能以不同于Pod內應用容器的檔案系統視圖運行,因此,Init容器可具有訪問 Secrets 的權限,而應用容器不能夠訪問,
5、由于 Init 容器必須在應用容器啟動之前運行完成,因此 Init 容器提供了一種機制來阻塞或延遲應用容器的啟動,直到滿足了一組先決條件,一旦前置條件滿足,Pod內的所有的應用容器會并行啟動,
Init 容器示例
下面的例子定義了一個具有 2 個 Init 容器的簡單 Pod, 第一個等待 myservice 啟動,第二個等待 mydb 啟動, 一旦這兩個 Init容器都啟動完成,Pod 將啟動spec區域中的應用容器,
Pod yaml檔案
1 [root@k8s-master lifecycle]# pwd 2 /root/k8s_practice/lifecycle 3 [root@k8s-master lifecycle]# cat init_C_pod.yaml 4 apiVersion: v1 5 kind: Pod 6 metadata: 7 name: myapp-busybox-pod 8 labels: 9 app: myapp 10 spec: 11 containers: 12 - name: myapp-container 13 image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 14 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] 15 initContainers: 16 - name: init-myservice 17 image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 18 command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 60; done"] 19 - name: init-mydb 20 image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 21 command: ['sh', '-c', "until nslookup mydb; do echo waiting for mydb; sleep 60; done"]
啟動這個 Pod,并檢查其狀態,可以執行如下命令:
1 [root@k8s-master lifecycle]# kubectl apply -f init_C_pod.yaml 2 pod/myapp-busybox-pod created 3 [root@k8s-master lifecycle]# kubectl get -f init_C_pod.yaml -o wide # 或者kubectl get pod myapp-busybox-pod -o wide 4 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 5 myapp-busybox-pod 0/1 Init:0/2 0 55s 10.244.4.16 k8s-node01 <none> <none>
如需更詳細的資訊:
1 [root@k8s-master lifecycle]# kubectl describe pod myapp-busybox-pod 2 Name: myapp-busybox-pod 3 Namespace: default 4 Priority: 0 5 ………… 6 Node-Selectors: <none> 7 Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s 8 node.kubernetes.io/unreachable:NoExecute for 300s 9 Events: 10 Type Reason Age From Message 11 ---- ------ ---- ---- ------- 12 Normal Scheduled 2m18s default-scheduler Successfully assigned default/myapp-busybox-pod to k8s-node01 13 Normal Pulled 2m17s kubelet, k8s-node01 Container image "registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24" already present on machine 14 Normal Created 2m17s kubelet, k8s-node01 Created container init-myservice 15 Normal Started 2m17s kubelet, k8s-node01 Started container init-myservice
如需查看Pod內 Init 容器的日志,請執行:
1 [root@k8s-master lifecycle]# kubectl logs -f --tail 500 myapp-busybox-pod -c init-myservice # 第一個 init container 詳情 2 Server: 10.96.0.10 3 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 4 5 waiting for myservice 6 nslookup: can't resolve 'myservice' 7 Server: 10.96.0.10 8 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 9 ……………… 10 [root@k8s-master lifecycle]# kubectl logs myapp-busybox-pod -c init-mydb # 第二個 init container 詳情 11 Error from server (BadRequest): container "init-mydb" in pod "myapp-busybox-pod" is waiting to start: PodInitializing
此時Init 容器將會等待直至發現名稱為mydb和myservice的 Service,
Service yaml檔案
1 [root@k8s-master lifecycle]# pwd 2 /root/k8s_practice/lifecycle 3 [root@k8s-master lifecycle]# cat init_C_service.yaml 4 --- 5 kind: Service 6 apiVersion: v1 7 metadata: 8 name: myservice 9 spec: 10 ports: 11 - protocol: TCP 12 port: 80 13 targetPort: 9376 14 --- 15 kind: Service 16 apiVersion: v1 17 metadata: 18 name: mydb 19 spec: 20 ports: 21 - protocol: TCP 22 port: 80 23 targetPort: 9377
創建mydb和myservice的 service 命令:
1 [root@k8s-master lifecycle]# kubectl create -f init_C_service.yaml 2 service/myservice created 3 service/mydb created
之后查看pod狀態和service狀態,能看到這些 Init容器執行完畢后,隨后myapp-busybox-pod的Pod轉移進入 Running 狀態:
1 [root@k8s-master lifecycle]# kubectl get svc -o wide mydb myservice 2 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 3 mydb ClusterIP 10.108.24.84 <none> 80/TCP 72s <none> 4 myservice ClusterIP 10.105.252.196 <none> 80/TCP 72s <none> 5 [root@k8s-master lifecycle]# 6 [root@k8s-master lifecycle]# kubectl get pod myapp-busybox-pod -o wide 7 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 8 myapp-busybox-pod 1/1 Running 0 7m33s 10.244.4.17 k8s-node01 <none> <none>
由上可知:一旦我們啟動了 mydb 和 myservice 這兩個 Service,我們就能夠看到 Init 容器完成,并且 myapp-busybox-pod 被創建,
進入myapp-busybox-pod容器,并通過nslookup查看這兩個Service的DNS記錄,
1 [root@k8s-master lifecycle]# kubectl exec -it myapp-busybox-pod sh 2 / # nslookup mydb 3 Server: 10.96.0.10 4 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 5 6 Name: mydb 7 Address 1: 10.108.24.84 mydb.default.svc.cluster.local 8 / # 9 / # 10 / # 11 / # nslookup myservice 12 Server: 10.96.0.10 13 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 14 15 Name: myservice 16 Address 1: 10.105.252.196 myservice.default.svc.cluster.local
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/4926.html
標籤:Linux
上一篇:Linux中.bashrc與.bash_profile的對比
下一篇:添加zabbix華為鏡像源
