當咱們在運用一個服務以前,一般會作一些初始化的工做,而這些工做通常只須要運行一次,成功後就再也不運行。爲此kubernetes 引入了Init Container,用於在啓動應用容器以前啓動一個或多個「初始化」容器,完成應用容器的所需的預製條件。html
Init Containers與常規的容器很是相似,可是它一些獨有的特徵:nginx
Init Container 一般有以下應用方式:git
具體的應用場景示例:shell
這裏定義一個nginx,在nginx容器啓動前更改默認起始頁面內容:api
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: initContainers: - name: init-myservice image: busybox command: ['sh', '-c', 'echo "this init-container test page" > /html/index.html'] volumeMounts: - name: index-dir mountPath: "/html" containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: index-dir mountPath: /usr/share/nginx/html volumes: - name: index-dir emptyDir: {}
建立容器後,能夠看到,先執行初始化操做:安全
# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/1 0 12s # 顯示正在初始化: # kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 PodInitializing 0 22s # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE myapp-pod 1/1 Running 0 38s 10.2.74.5 10.0.0.3 #日誌信息: # kubectl describe pod Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 29s default-scheduler Successfully assigned myapp-pod to 10.0.0.3 Normal SuccessfulMountVolume 29s kubelet, 10.0.0.3 MountVolume.SetUp succeeded for volume "index-dir" Normal SuccessfulMountVolume 29s kubelet, 10.0.0.3 MountVolume.SetUp succeeded for volume "default-token-hmvnc" Normal Pulling 28s kubelet, 10.0.0.3 pulling image "busybox" Normal Pulled 16s kubelet, 10.0.0.3 Successfully pulled image "busybox" Normal Created 16s kubelet, 10.0.0.3 Created container Normal Started 16s kubelet, 10.0.0.3 Started container Normal Pulling 15s kubelet, 10.0.0.3 pulling image "nginx" Normal Pulled 1s kubelet, 10.0.0.3 Successfully pulled image "nginx" Normal Created 1s kubelet, 10.0.0.3 Created container Normal Started 1s kubelet, 10.0.0.3 Started container
Pod中的每一個應用程序和Init Container的名稱必須是惟一的; 任何Container與另外一個Container共享一個名稱都會引起驗證錯誤。服務器
在Pod從新啓動時, init Container 將會從新運行,那麼所執行的初始化操做也會再次執行,這就要求Init Container的操做是能夠重複執行的。例如上面的示例中,在對掛載目錄中文件的添加前,能夠先判斷文件是否已經存在的處理,來防止出錯。
常見的Pod重啓場景以下:markdown