Kubernetes実戦(九)-初期化容器(Init Container)


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コードは次のとおりです.
    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)の説明を完了します.