InitContainer
初始化容器
在Pod中,容器是共享存儲資源和網絡資源的,所以Init Container容器產生的數據是可以被其他容器作用到的。初始化容器有點類似於postStart 鈎子的作用,在Pod沒有啟動之前,為應用容器做一些准備工作,但是跟鈎子的啟動處於不同的階段,在Pod生命周期圖中可以明顯看出。Pod中可以啟動一個或多個容器,也可以有一個或多個initContainer 容器。
initContainer 容器和普通容器幾乎一樣,除了一下兩點:
- 總是運行到完成
- 必須在Pod啟動下一個容器之前運行完成
如果init容器啟動失敗,容器根據restartPolicy策略重啟,如果有多個,它們會按順序,一次執行一個,每個init容器都必須運行成功了才會運行下一個。init容器不支持readnessProbe,因為它們必須在Pod就緒前運行完成。
initContainer能做什么?
- 等他其他容器Ready: 比如web服務器需要等待mysql數據庫服務器啟動完成,可以啟動一個initContainer 容器檢測mysql服務啟動,成功后退出,運行主容器
- 環境構建:為主容器運行提供配置和初始化等操作。
- 可以包含運行使用工具:處於安全考慮,在鏡像中是不建議包含這些工具的。
- 構建工具和代碼:在鏡像中沒有,而服務需要用到的工具可以用init Container構建
- 構建和部署分離: 不需要重新將兩步打包成一個鏡像
- 提供一種阻塞容器啟動的方式:必須在initContainer容器啟動成功后,才會運行下一個容器,保證了一組條件運行成功的方式
示例
apiVersino: v1
kind: Pod
metadata:
name: myapp
spec:
initContainers:
- name: init-server
image: busybox
command: ["/bin/bash","-c","chown -R apache:apache /var/www"]
volumeMount:
- name: wwwroot
mountPath: /var/www
containers:
- name: my-service
image: httpd
containerPort:
- name: http
port: 80
protocol: TCP
volumeMount:
- name: wwwroot
mountPath: /var/www
volumes:
- name: wwwroot
hostPath:
path: /home/wwwroot
可以通過init Container修改主容器應用中的共享存儲文件權限,讓/var/www 路徑成為apache用戶和組擁有。這是我們利用initContainer起到的作用之一。
官方文檔示例
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']