Kubernetes Init Container (初始化容器)

Kubernetes Init Container (初始化容器)

摘選abcdocker運維博客

摘選:https://i4t.com/4434.html


一、初始化容器應用場景

在很多場景中,應用在啟動之前都需要進行初始化操作

  • 可以包含並運行實用工具,出於安全考慮,是不建議在應用容器鏡像中包含
  • 定製化代碼和安裝工具(例如需要使用sed、awk、Python、或dig)
  • 從遠處數據庫獲取本地所需配置,或者例如將服務註冊到服務中心/配置中心等

Init容器與普通容器的不同之處是支持應用容器的全部字段和特性,包括資源限制、數據卷和安全設置。然後,Init容器對資源請求和容器處理不同,並且它們必須在Pod就緒之前完成運行

理解Init容器
Pod 能夠具有多個容器,應用運行在容器裡面,但是它也可能有一個或多個領先於應用容器啟動的Init容器

Init容器與普通容器非常像,除了以下兩點:

  • Init容器總是運行到完成 (例如執行wget、curl、ping等命令)
  • 如果有多個Init容器的情況下都必須要在下一個啟動之前結束運行

如果Pod中的Init容器啟動失敗,Kubernetes會不斷重啟該Pod,指導Init容器成功為止,如果Pod對應的restartPolicy值為Never(只要退出就不再重啟),則它不會重新啟動。


二、初始化容器介紹

在Kubernetes v1.3引用了Alpha版本的新特性init container(在Kubernetes v1.5時被更新為Beta版本),用於在啟動應用容器之前啟動一個或多個初始化容器,完成應用程序所需的預置條件。Init container與應用容器本質上是一樣的,但它們是僅運行一次就結束的任務,並且必須在執行完成後,系統才能繼續執行下一個容器。

Kubernetes Init Container (初始化容器)

摘選abcdocker運維博客


三、項目演示

本次演示使用busybox鏡像作為init鏡像,應用程序使用nginx進行演示,通過掛載的方式將init鏡像獲取到文件掛載到nginx html目錄,這樣我們訪問的nginx 默認index.html就是我們init提前拉取出來的地址

cat >>init.yaml <---
apiVersion: v1
kind: Pod
metadata:
name: init-demo
labels:
app: init
spec:
initContainers:
- name: init
image: busybox
command:
- wget
- "-O"
- "/tmp/index.html"
- http://k.i4t.com
volumeMounts:
- name: initdir
mountPath: "/tmp"

containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: initdir
mountPath: /usr/share/nginx/html
volumes:
- name: initdir
emptyDir: {}
EOF

使用命令直接創建即可,init也可以使用命名空間,我這裡就使用默認的default進行演示

#創建
[root@abcdocker yaml]# kubectl apply -f init.yaml
pod/init-demo created

#此時init容器進行啟動工作
[root@abcdocker yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
init-demo 0/1 Init:0/1 0 5s

#當init容器完成後,應用容器啟動並進行工作
[root@abcdocker yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
init-demo 1/1 Running 0 21s

當我們Pod正常Running之後,我們可以通過kubectl describe pod [pod-name]查看到init容器的一個狀態

如果失敗init容器默認會在State中顯示CrashLoopBackOff (重啟/異常),在Reason會顯示Error

State 代表狀態
Reason 原因
Terminated 終止
Completed 完成

Kubernetes Init Container (初始化容器)

摘選abcdocker運維博客

接下來我們進行驗證掛在是否正常

#可以先通過curl一下 pod的IP:80,檢查服務是否正常和掛載是否正常
[root@abcdocker ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
init-demo 1/1 Running 0 18m 172.30.144.2 k8s-master03 <none> <none>

[root@abcdocker ~]# curl -s 172.30.144.2|head
/<none>/<none>

我們還可以進入容器進行查看

[root@abcdocker ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
init-demo 1/1 Running 0 19m

[root@abcdocker ~]# kubectl exec -it init-demo /bin/bash
root@init-demo:/# cat /usr/share/nginx/html/index.html

官方文檔還給出了使用其他命令的方式

apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

本文參考官方文檔:https://kubernetes.io/docs/concepts/workloads/pods/init-containers


分享到:


相關文章: