前言
前面我們知道一個Pod中其實可以運行多個容器洞坑,之前說的都是普通的工作容器心软,但其實還有一種特殊的容器叫作Init Container 初始化容器扎瓶,它再普通容器之前運行颗祝∽巧粒可以有多個初始化容器恼布,所有初始化容器按順序依次運行直到完成,所有容器都運行完成后搁宾,普通容器才開始運行折汞。
Init Container不支持探測,因為在Pod就緒之前它們必須運行完成猛铅。
Init Container 在1.3引入的Alpha版本字支,1.5之后更新為Beta版本。主要是完成應用容器需要的前置條件奸忽。比如需要其它關聯(lián)組件正確運行才能啟動(如數(shù)據(jù)庫)
下面我們來使用 Init Container
使用
準備 kube-nginx.yml 內容如下堕伪。
假設初始化容器需要提前給Nginx容器創(chuàng)建一個請求頁面 /root/index/initContainer.html,頁面的內容為 Init Container is Running栗菜,將該頁面以共享存儲的方式掛載在Nginx的/usr/share/nginx/html目錄欠雌,那么啟動之后可以通過 127.0.0.1/initContainer.html 訪問。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
initContainers:
- name: create
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh','-c','sleep 10; mkdir -p /root/index; echo "Init Container is Running" > /root/index/initContainer.html']
volumeMounts:
- name: init-test
mountPath: /root/index
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
volumeMounts:
- name: init-test
mountPath: /usr/share/nginx/html
volumes:
- name: init-test
emptyDir: {}
啟動Pod疙筹,觀察Pod狀態(tài)富俄,觀察Pod創(chuàng)建過程
# 啟動
[root@master init-container]# kubectl apply -f kube-nginx.yml
pod/nginx created
# 查看Pod狀態(tài)
[root@master init-container]# kubectl get pods nginx
NAME READY STATUS RESTARTS AGE
nginx 0/1 Init:0/1 0 10s
[root@master init-container]# kubectl get pods nginx
NAME READY STATUS RESTARTS AGE
nginx 0/1 PodInitializing 0 11s
[root@master init-container]# kubectl get pods nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 14s
#Pod創(chuàng)建過程
[root@master init-container]# kubectl describe pod nginx|grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 49s default-scheduler Successfully assigned default/nginx to node01
Normal Pulled 49s kubelet Container image "busybox" already present on machine
Normal Created 49s kubelet Created container create
Normal Started 49s kubelet Started container create
Normal Pulled 38s kubelet Container image "nginx" already present on machine
Normal Created 38s kubelet Created container nginx
Normal Started 38s kubelet Started container nginx
# 請求
[root@master init-container]# kubectl exec -it nginx -c nginx -- curl 127.0.0.1/initContainer.html
Init Container is Running
從上面的結果可看出,當初始化容器還沒執(zhí)行完成時而咆,Pod狀態(tài)為 Init:0/1霍比,完成之后開始運行nginx容器,此時狀態(tài)為 PodInitializing暴备,稍等一小會Pod狀態(tài)為 Running 表示業(yè)務容器也已經(jīng)運行成功悠瞬。
通過觀察Pod的創(chuàng)建過程知道,先是拉取 busybox 鏡像運行涯捻,運行成功后才是拉取nginx鏡像運行浅妆,表明初始化容器在業(yè)務容器之前運行
上面只是一個簡單入門案例,假如是一個tomcat障癌,那么是不是可以把業(yè)務的 war 包放到某個可以下載的地方凌外,每次代碼更新只需要初始化容器通過 wget 去拉取并通過掛載方式掛載到tomcat的webapp目錄下。這樣就不需要每次將 tomcat涛浙,jdk康辑,war包重新打鏡像了。
注意點
Pod的重啟會導致Init Container重新運行蝗拿,如果是一些要保證冪等性的操作需要謹慎使用
Init Container鏡像發(fā)生改變會引起Pod的重啟晾捏,業(yè)務容器鏡像的變更只會重啟業(yè)務容器
Init Container也可以定義資源,會作為Pod的有效初始資源哀托,取所有Init Container的最大limits/requests, 如果這個值比所有應用容器之和還大,那么最終Pod的有效limits/requests為初始化容器的值劳秋,否則為所有應用容器之和仓手。
Init Container就介紹到這胖齐,后面將介紹Pod的調度。
歡迎關注嗽冒,學習不迷路呀伙!