サイドカーコンテナを使用して DaemonSet のような効果を実現し、ロギング、モニタリング、セキュリティ、トラフィックルーティングなどの追加のサービスや機能を提供したい場合は、メインアプリケーションコンテナに対するサイドカーコンテナの起動と終了の優先度を設定する必要があります。このトピックでは、サイドカーコンテナの起動と終了の優先度を設定する方法について説明します。
機能説明
Alibaba Cloud Container Compute Service (ACS) クラスターは、仮想ノードの制限により DaemonSet をサポートしていません。DaemonSet のような効果を実現するために、ACS クラスターの Pod にサイドカーコンテナを追加できます。Pod に追加されたサイドカーコンテナのライフサイクルは、Pod のライフサイクルから独立していません。DaemonSet のような効果を実現するには、サイドカーコンテナの起動と終了の優先度を設定する必要があります。たとえば、Pod の作成中に、メインアプリケーションコンテナの前にサイドカーコンテナを起動する必要がある場合があります。ジョブタイプの Pod を使用する場合、メインアプリケーションコンテナが終了した後に、サイドカーコンテナを強制終了する必要がある場合があります。
これらの要件を満たすために、ACS はサイドカーコンテナの起動と終了の優先度を設定するための以下の方法を提供します。
-
Kubernetes ネイティブのサイドカーコンテナ構成
Kubernetes 1.29 以降では、ネイティブのサイドカー構成のサポートがデフォルトで有効になっています。サイドカーを init コンテナとして定義し、その
restartPolicyを Always に設定することで、サイドカーを構成できます。説明ネイティブのアプローチでは、サイドカーコンテナを特別な init コンテナとして実装します。Pod の起動中、アプリケーションコンテナはサイドカーコンテナが起動するまで待機します。
restartPolicy: Alwaysの設定により、サイドカーコンテナはメインアプリケーションコンテナや他の init コンテナに影響を与えることなく、起動、停止、再起動ができます。 -
ACS 最適化サイドカーコンテナ構成
Kubernetes バージョン 1.28 以前の場合、ACS では特別な環境変数
__IS_SIDECAR__を設定して、通常のコンテナをサイドカーコンテナとしてマークすることができます。重要ACS 最適化構成では、通常のコンテナをサイドカーとして宣言できます。他の通常のコンテナより先に起動し、失敗時には
restartPolicyがAlwaysであるかのように自動的に再試行されます。さらに、以前の Kubernetes バージョン (1.28 以下) の ACS クラスターには、コンテナのステータスが正しく更新されることを保証するための互換性機能が含まれています。しかし、新しい Kubernetes バージョンや他のクラスタータイプでは、この方法はコンテナステータスの更新に関する Kubernetes の制限を受けます。ACS 最適化方法を使用して構成されたサイドカーが失敗して再起動した後、その
containerStatusと Pod のステータスは Running に更新されません。正確なステータスについては、実際の Pod の状態に依存してください。クラスターをバージョン 1.29 以降にアップグレードし、Kubernetes ネイティブのサイドカーコンテナ構成を使用することを推奨します。
サイドカーコンテナの構成方法
構成方法 | パラメーター/環境変数 | 説明 |
Kubernetes ネイティブのサイドカーコンテナ構成 |
init コンテナの |
|
ACS 最適化サイドカーコンテナ構成 |
通常のコンテナの環境変数: |
|
例
test-sidecar.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、app と sidecar という 2 つのコンテナをプロビジョニングするジョブを作成するために使用されます。app コンテナはアプリケーションコンテナです。sidecar コンテナはサイドカーコンテナです。
ACS 最適化サイドカーコンテナ構成
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] env: - name: __IS_SIDECAR__ # コンテナに環境変数を追加します。 value: "true" # コンテナをサイドカーコンテナとして指定します。 restartPolicy: Never backoffLimit: 2Kubernetes ネイティブのサイドカーコンテナ構成
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: initContainers: - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] restartPolicy: Always # コンテナをサイドカーコンテナとして指定します。 containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] restartPolicy: Never backoffLimit: 2次のコマンドを実行してジョブを作成します:
kubectl apply -f test-sidecar.yaml-
ジョブと Pod の詳細を表示し、環境変数の効果を観察します。
-
ジョブが完了し、そのステータスが
Succeededであることを確認します。kubectl describe job <job-name>例:
Parallelism: 1 Completions: 1 Completion Mode: NonIndexed Start Time: Tue, 29 Oct 2024 11:24:18 +0800 Completed At: Tue, 29 Oct 2024 11:25:17 +0800 Duration: 59s Pods Statuses: 0 Active (0 Ready) / 1 Succeeded / 0 Failed Pod Template:
-
-
サイドカーコンテナの詳細を表示し、コンテナの起動シーケンスと実際の終了コードを確認します。
kubectl describe pod <pod-name>-
次の図は、sidecar コンテナが app コンテナの前に起動されたことを示しています。これにより、メインコンテナが必要とするトラフィックルーティングなどの依存機能が事前に準備されていることが保証されます。次の図はまた、sidecar コンテナが app コンテナの実行停止から 10 秒後に終了したことを示しています。これにより、ジョブによってプロビジョニングされた Pod が正常に終了できることが保証されます。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m11s default-scheduler Successfully assigned default/test-729nd to virtual-kubelet-cn-shenzhen-f Normal Pulling 5m13s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 384ms Normal Created 5m12s kubelet Created container sidecar Normal Started 5m12s kubelet Started container sidecar Normal Pulling 5m12s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 342ms Normal Created 5m12s kubelet Created container app Normal Started 5m12s kubelet Started container app Normal Killing 5m1s kubelet Stopping container sidecar -
次の図は、sidecar コンテナが強制終了され、終了コードが 0 であることを示しています。これにより、Pod がサイドカーコンテナの影響を受けることなく、正常に成功または失敗として終了できることが保証されます。
sidecar: Container ID: containerd://bd85de5ad7ee1cb5a4807b094f2d41fa90881916857172 0e73ef0dfbd26f1dfb Image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 Image ID: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox@sha256:141c253bc4c3fd0a20 Port: <none> Host Port: <none> Command: sh -c touch /var/logs.txt && tail -F /var/logs.txt State: Terminated Reason: Completed Message: Force this container to be success(137, Error, ) Exit Code: 0 Started: Tue, 29 Oct 2024 11:24:32 +0800 Finished: Tue, 29 Oct 2024 11:25:13 +0800 Ready: False Restart Count: 0
-