Kubernetes で Init コンテナを使用する方法

Kubernetes で Init コンテナを使用する方法

Pod には、アプリケーションが実行される複数のコンテナを含めることができ、また、アプリケーション コンテナの前に起動される 1 つ以上の Init コンテナを含めることもできます。

Initコンテナとは

Init Container は特別なコンテナです。名前の通り、初期化作業に使われるコンテナです。 Init Container は 1 つ以上存在できます。複数の Init Container がある場合、これらのコンテナは定義された順序で実行されます。すべての Init Container が実行された後にのみ、メイン コンテナが起動されます。

Pod 内のすべてのコンテナはデータ ボリュームとネットワーク名前空間を共有するため、Init コンテナで生成されたデータはメイン コンテナで使用できます。 Init コンテナは、次の 2 つの点を除いて、基本的にアプリケーション コンテナと同じです。

  • Init Container は、lifecycle、livenessProbe、readinessProbe、startupProbe をサポートしていません。これらは、Pod の準備ができる前に完了するまで実行する必要があるため、一度だけ実行されて終了するタスクです。
  • システムは、実行が正常に完了した後にのみ、次のコンテナの実行を続行できます。

Pod の Init コンテナが失敗した場合、Kubernetes は Init コンテナが成功するまで Pod を再起動し続けます。 Pod に対応する restartPolicy が Never の場合、Pod は再起動されません。

ポッドのライフサイクル:

上の図から、Init コンテナはメイン コンテナから独立していますが、両方とも Pod ライフサイクルに属していることが直感的にわかります。

アプリケーションシナリオ

  • 他の依存サービス(データベースやバックグラウンドサービスなど)が正しく実行されるのを待機しています
  • 環境変数または構成テンプレートに基づいて、サービスに必要な構成ファイルを生成します。
  • 必要なローカル構成をリモートデータベースから取得するか、中央データベースに登録します。
  • 関連する依存パッケージをダウンロードするか、システム上でいくつかの事前構成操作を実行します。

簡単な例

アプリケーション コンテナーは Pod.Spec.Containers で定義され、必須フィールドです。一方、init は Pod.Spec.initContainers で定義され、オプション フィールドです。

次の例では、2 つの Init コンテナを持つ単純な Pod を定義します。最初のものは myservice の起動を待機し、2 番目のものは mydb の起動を待機します。両方の Init コンテナが起動すると、Pod は仕様セクションでアプリケーション コンテナを起動します。

myapp.yaml:

 apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app.kubernetes.io/name: 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.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"] - name: init-mydb image: busybox:1.28 command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

作成する:

 [root@localhost ~]# kubectl apply -f myapp.yaml pod/myapp-pod created

ステータスを確認します:

 [root@localhost ~]# kubectl get -f myapp.yaml NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 8s

出力の詳細:

 [root@localhost ~]# kubectl describe -f myapp.yaml Name: myapp-pod Namespace: default [...] Labels: app.kubernetes.io/name=MyApp Annotations: <none> Status: Pending [...] Init Containers: init-myservice: [...] State: Running [...] init-mydb: [...] State: Waiting Reason: PodInitializing Ready: False [...] Containers: myapp-container: [...] State: Waiting Reason: PodInitializing Ready: False [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 20s default-scheduler Successfully assigned default/myapp-pod to localhost.localdomain Normal Pulling 17s kubelet Pulling image "busybox:1.28" Normal Pulled 8s kubelet Successfully pulled image "busybox:1.28" in 9.30472043s Normal Created 7s kubelet Created container init-myservice Normal Started 6s kubelet Started container init-myservice

Pod 内の Init コンテナのログを表示します。

 [root@localhost ~]# kubectl logs myapp-pod -c init-myservice # 查看第一个Init 容器nslookup: can't resolve 'myservice.default.svc.cluster.local' Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local waiting for myservice [root@localhost ~]# kubectl logs myapp-pod -c init-mydb # 查看第二个Init 容器Error from server (BadRequest): container "init-mydb" in pod "myapp-pod" is waiting to start: PodInitializing

この時点で、init-mydb コンテナは、init-myservice が完了するまで待機してから実行されます。これらのサービスを作成するための構成ファイル services.yaml は次のとおりです。

 --- apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376 --- apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377

作成する:

 [root@localhost ~]# kubectl apply -f services.yaml service/myservice created service/mydb created

ステータスを再度確認します。実行中になります。

 [root@localhost ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 2m35s

詳細をもう一度確認すると、init-myservice と init-mydb の両方が終了していることがわかります。

 Init Containers: init-myservice: [...] State: Terminated Reason: Completed Exit Code: 0 [...] init-mydb: [...] State: Terminated Reason: Completed Exit Code: 0

新しいサイドカー機能

Kubernetes 1.28 のリリースでは、多くの重要な機能がサポートされていますが、その中で最も印象的なのは、現在アルファ バージョンである新しい Sidecar です。以前は、サイドカーという用語は、K8s の通常のコンテナと何ら変わらない、単なるマルチコンテナ設計パターンでした。しかし、そのライフサイクルはビジネス コンテナのライフサイクルと一致していないため、Sidecar のライフサイクル管理は常に問題となっていました。

Sidecar の新しいバージョンは initContainers に配置されます。 restartPolicy を Always に指定すると、Sidecar が有効になります。ライフサイクルや再起動管理は通常のコンテナと同様です。この機能はジョブの実行にも使用できます。

以下は、Sidecar を使用したデプロイメントの例です。ログサイドカーコンテナはターミナルにログを出力するために使用され、メインコンテナはログの書き込みをシミュレートします: sidecar.yaml:

 apiVersion: apps/v1 kind: Deployment metadata: name: myapp labels: app: myapp spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: alpine:latest command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done'] volumeMounts: - name: data mountPath: /opt initContainers: - name: logshipper # sidecar 容器image: alpine:latest restartPolicy: Always # 必须指定restartPolicy为Always才能开启sidecar command: ['sh', '-c', 'tail -f /opt/logs.txt'] volumeMounts: - name: data mountPath: /opt volumes: - name: data emptyDir: {}

K8s クラスターにデプロイすると、initContainers[*].restartPolicy フィールドが表示されます。

 [root@localhost ~]# kubectl create -f sidecar.yaml deployment.apps/myapp created [root@localhost ~]# kubectl get po -l app=myapp -ojsonpath='{.items[0].spec.initContainers[0].restartPolicy}' Always [root@localhost ~]# kubectl get po -l app=myapp NAME READY STATUS RESTARTS AGE myapp-215h3248d-p4z6 2/2 Running 0 1m5s

myapp Pod 内の両方のコンテナが準備完了です (2/2)。ログを確認すると、ログサイドカーが常にログを出力していることがわかります。

 [root@localhost ~]# kubectl logs -l app=myapp -c logshipper -f logging logging

<<:  エッジコンピューティングは IoT の状況をどのように変えているのでしょうか?

>>:  マルチクラウドコンピューティングとフェデレーテッドラーニングを活用するにはどうすればよいでしょうか?

推薦する

集中することが正解です。自分の「小さくて美しい」ウェブサイトを構築する方法についてお話ししましょう。

最近、「小さくて美しい」という言葉が流行っています。タオバオでは、この言葉の普及に力を入れており、多...

Shumai Technology: 香港の物理サーバー、最低350元、30M CMIまたは10M cn2、無制限のトラフィック

Shumai Technology は 5 月に、香港の自社データセンターにある香港サーバーを超低価...

ソーシャルネットワークマーケティング(II)国内ソーシャルネットワーキングサイトの特徴(その1)

ソーシャルネットワークマーケティング(II)国内SNSの特徴(第1部)前回の記事が公開されてから2か...

テンセントはWeiboやOasisに対抗するために「Youji」を立ち上げるのか?

インスタグラムは国内で長年人気を博してきたが、ついにソーシャルサークル型製品に大手インターネット企業...

決済会社の加盟店審査の抜け穴:注文操作

食料、衣服、住居、交通などの生活必需品の支払いがオンラインチャネルを通じて行われるようになるにつれ、...

中小規模のウェブマスターの皆様、地方の小規模ウェブサイトで年間150万元を稼ぐ4つの方法をご紹介します。

Discuz! 愛好家が4月15日に報告(文/ウェブマスター Ajian)今日、あるウェブマスターが...

重慶ショッピングマッドネスウェディングコラムの分析例から、フォーラムSEOの作成方法を学ぶ

私は重慶に出張していたので、当然地元のウェブサイトに注目していました。「重慶ショッピングホリック」と...

ガートナー:世界のパブリッククラウドのエンドユーザー支出は2023年に6,000億ドルに達する

ガートナーの最新予測によると、パブリッククラウドサービスに対する世界のエンドユーザー支出は、2022...

Google Analytics の新しい秘密 – 訪問を定義する方法

【はじめに】訪問指標はウェブサイト分析の基礎となります。しかし、このような基本的な指標であっても、G...

ウェブサイトを最適化するためのテクニックは本当に存在するのでしょうか?

A5 フォーラムで、SEO 最適化のためのコツがあるかどうか尋ねる初心者を見ました。私の答えは、はい...

ウェブマスターネットワークニュース:4Gライセンスが正式に発行され、WeChatモーメンツが「ビジネスサークル」になる

1. 3Q戦争の2番目の事件が今日審理される。最高裁判所の副長官が裁判長を務める。 12月4日早朝、...

百度の重み付け計算方法はトラフィック計算だけに基づいているわけではない

記事「Baidu Weight」の計算方法と脆弱性分析では、AizhanのBaidu Weightと...

A5トピック:天猫がダブルイレブンで勝利、タオバオの顧客は恩恵を受けるが、来年はイベントが中止される可能性あり

ウェブマスターネットワークは15日、天猫が1日の取引高で191億の記録を樹立した後、来年の「双十一」...