初始化容器即應用程式的主容器啟動之前要運作的容器,常用于為主容器執行一些預置操作,它們具有兩種典型特征
- 初始化容器必須運作完成直至結束,若某初始化容器運作失敗,那麼k8s需要重新開機它直到成功完成
- 每個初始化容器都必須按定義的順序串行運作
- 如果pod對應的restartPolicy為never,它就不會重新啟動
有不少場景都需要在應用容器啟動之前進行部分初始化操作,例如,等待其他相關聯元件服務可 用、基于環境變量或配置模闆為應用程式生成配置檔案、從配置中心擷取配置等。初始化容器的典型應 用需求具體包含如下幾種。
- 用于運作特定的工具程式,出于安全等方面的原因,這些程式不适于包含在主容器鏡像中
- 提供主容器鏡像中不具備的工具程式或自定義代碼
- 為容器鏡像的建構和部署人員提供了分離、獨立工作的途徑,使得它們不必協同起來制作單個鏡像檔案
- 初始化容器和主容器處于不同的檔案系統視圖中,是以可以分别安全地使用敏感資料,例如secrets資源
- 初始化容器要先于應用容器串行啟動并運作完成,是以可用于延後應用容器的啟動直至其依賴的條件得到滿足
案例
準備鏡像
docker pull busybox:1.32.0
docker pull nginx:1.17.10-alpine
initcpod.yml
apiVersion: v1
kind: Pod
metadata:
name: initcpod-test
labels:
app: initcpod-test
spec:
containers:
- name: initcpod-test
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: [ 'sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;' ]
- name: init-mydb
image: busybox:1.32.0
command: [ 'sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;' ]
restartPolicy: Always
initcservice1.yml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myservice
ports:
- port: 80
targetPort: 9376
protocol: TCP
initcservice2.yml
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
selector:
app: mydb
ports:
- port: 80
targetPort: 9377
protocol: TCP
檢視
先檢視pod啟動情況
kubectl get pods
詳細檢視pod啟動情況
kubectl describe pod initcpod-test
檢視initcpod-test中的第一個initContainer日志
kubectl logs myapp-pod -c init-myservice
運作init-myservice服務
kubectl apply -f initcservice1.yml
檢視init-myservice服務運作情況
kubectl get svc
檢視myapp-pod運作情況,需要耐心等一會,會發現pod的第一個init已經就緒
kubectl get pods
運作init-mydb服務
kubectl apply -f initcservice2.yml
檢視init-myservice服務運作情況
kubectl get svc
檢視myapp-pod運作情況,需要耐心等一會,會發現pod的兩個init已經就緒,pod狀态ready
kubectl get pod -w
每個人都有潛在的能量,隻是很容易被習慣所掩蓋,被時間所迷離,被惰性所消磨~