Kubernetes実戦(九)-初期化容器(Init Container)
6807 ワード
Kubernetes 1.3バージョンでは、Alphaバージョンの新しいプロパティinit container(Kubernetes 1.5でBateバージョンに更新された初期化コンテナ)が導入され、アプリケーションコンテナ(app container)を起動する前に1つ以上の初期化コンテナを起動するために使用されます.init containerはアプリケーションコンテナと本質的に同じですが、1回だけ実行して終了するタスクです.次のコンテナの実行を続行するには、正常に実行された後にシステムが必要です.
多くのアプリケーションシーンでは、アプリケーションは起動する前に次の初期化操作を行う必要があります.データベースまたはバックグラウンドサービスなどの他の関連コンポーネントが正しく動作するのを待つ .環境変数または構成テンプレートに基づいてプロファイル を生成する.リモート・データベースからローカルに必要な構成を取得するか、またはある中央データベースにサイレントを登録する .関連依存パッケージをダウンロードするか、システムに対していくつかの事前構成操作 を行う.
次に、Nginxアプリケーションを例として、Nginxを起動する前に、コンテナbusyboxを初期化することにより、Nginxにindexを作成する.htmlホームページファイル.ここではinit containerとNginxの共有Volume,initを設定する.yamlコードは次のとおりです.
このPodを作成するには:
Init containerを実行中にPodのステータスを確認すると、initプロセスがまだ完了していないことがわかります.
Init containerが正常に実行された後、システムは引き続きNginxコンテナを起動し、Podの状態を再度確認します.
Podのイベントを表示すると、システムがinit containerコンテナを最初に作成して実行し、成功した後、Nginxコンテナの作成と実行を続行することがわかります.
起動に成功すると、Nginxコンテナにログインし、/usr/share/nginx/htmlディレクトリのindexが表示されます.htmlファイル:
Init containerとアプリケーションコンテナの違い
公式ドキュメントでは、他のコマンドを使用する方法も示しています.
ここで初期化コンテナ(Init Container)の説明を完了します.
多くのアプリケーションシーンでは、アプリケーションは起動する前に次の初期化操作を行う必要があります.
次に、Nginxアプリケーションを例として、Nginxを起動する前に、コンテナbusyboxを初期化することにより、Nginxにindexを作成する.htmlホームページファイル.ここではinit containerとNginxの共有Volume,initを設定する.yamlコードは次のとおりです.
apiVersion: v1
kind: Pod
metadata:
name: init-demo
labels:
app: init
spec:
initContainers:
- name: init
image: busybox
command:
- wget
- "-O"
- "/init-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: initdir
mountPath: "/init-dir"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: initdir
mountPath: /usr/share/nginx/html
volumes:
- name: initdir
emptyDir: {}
このPodを作成するには:
[root@master yaml]# kubectl apply -f init.yaml
pod/init-demo created
Init containerを実行中にPodのステータスを確認すると、initプロセスがまだ完了していないことがわかります.
[root@master yaml]# kubectl get po
NAME READY STATUS RESTARTS AGE
init-demo 0/1 Init:0/1 0 5s
Init containerが正常に実行された後、システムは引き続きNginxコンテナを起動し、Podの状態を再度確認します.
[root@master yaml]# kubectl get po
NAME READY STATUS RESTARTS AGE
init-demo 1/1 Running 0 21s
Podのイベントを表示すると、システムがinit containerコンテナを最初に作成して実行し、成功した後、Nginxコンテナの作成と実行を続行することがわかります.
[root@master ~]# kubectl describe po init-demo
Name: init-demo
Namespace: pulsar
Priority: 0
PriorityClassName:
Node: tengine2test/10.12.1.222
Start Time: Sat, 11 Jul 2020 16:03:08 +0800
Labels: app=init
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"init"},"name":"init-demo","namespace":"pulsar"},"spec":{"con...
Status: Running
IP: 10.33.0.7
Init Containers:
init:
Container ID: docker://84db647286a417cf8749bff62b811a6df2871d2976f98117b36ee6556f385d77
Image: busybox
Image ID: docker-pullable://busybox@sha256:9ddee63a712cea977267342e8750ecbc60d3aab25f04ceacfa795e6fce341793
Port:
Host Port:
Command:
wget
-O
/init-dir/index.html
http://kubernetes.io
State: Terminated
Reason: Completed
Exit Code: 0
Started: Sat, 11 Jul 2020 16:03:17 +0800
Finished: Sat, 11 Jul 2020 16:03:29 +0800
Ready: True
Restart Count: 0
Environment:
Mounts:
/init-dir from initdir (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-nhp9x (ro)
Containers:
nginx:
Container ID: docker://6641a1e669ee7a7bdeac56ba902e3274586b57d04b238494cae50012b9f7db8b
Image: nginx
Image ID: docker-pullable://nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sat, 11 Jul 2020 16:03:45 +0800
Ready: True
Restart Count: 0
Environment:
Mounts:
/usr/share/nginx/html from initdir (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-nhp9x (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
initdir:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit:
default-token-nhp9x:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-nhp9x
Optional: false
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 59s default-scheduler Successfully assigned pulsar/init-demo to tengine2test
Normal Pulling 44s kubelet, tengine2test Pulling image "busybox"
Normal Pulled 37s kubelet, tengine2test Successfully pulled image "busybox"
Normal Created 37s kubelet, tengine2test Created container init
Normal Started 37s kubelet, tengine2test Started container init
Normal Pulling 23s kubelet, tengine2test Pulling image "nginx"
Normal Pulled 10s kubelet, tengine2test Successfully pulled image "nginx"
Normal Created 10s kubelet, tengine2test Created container nginx
Normal Started 9s kubelet, tengine2test Started container nginx
起動に成功すると、Nginxコンテナにログインし、/usr/share/nginx/htmlディレクトリのindexが表示されます.htmlファイル:
[root@master ~]# kubectl exec -it init-demo /bin/bash
root@init-demo:/usr/share/nginx/html# ls /usr/share/nginx/html
index.html
Init containerとアプリケーションコンテナの違い
1) , , init container ,
, init container ,kubernetes Pod 。
2) init container ,volume ,
3)init container readinessProbe , Pod
4) Pod ,init container
公式ドキュメントでは、他のコマンドを使用する方法も示しています.
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;']
ここで初期化コンテナ(Init Container)の説明を完了します.