OpenKruise の SidecarSet 機能を使用すると、仮想ノードにスケジュールされる Pod へサイドカーコンテナーを自動的に挿入できます。これにより、アプリケーションコンテナーと補助機能コンテナーが分離されます。本トピックでは、サイドカーコンテナーを定義する SidecarSet の作成方法および仮想ノードの Pod への自動挿入方法について説明します。
用語
サイドカー:アプリケーション自体から補助的なアプリケーション機能を分離し、別個のプロセスまたはコンテナーとして実装する設計パターンです。このパターンにより、サードパーティ製コンポーネントの要件を満たすための追加構成コードを記述することなく、アプリケーションにさまざまな機能を非侵入型で追加できます。
サイドカーコンテナー:メインコンテナーを変更せずに拡張・強化するために Pod に追加される追加のコンテナーです。
SidecarSet: Alibaba Cloud のオープンソースのクラウドネイティブアプリケーション自動化エンジン OpenKruise のコア機能です。SidecarSet は、対象となる Pod にサイドカーコンテナーを自動的に挿入します。これにより、モニタリングおよびログエージェントなどのサイドカーコンテナーの定義とライフサイクルが、アプリケーションコンテナーから分離されます。
適用範囲
ACK 仮想ノードは、ECI および ACS の両方の計算能力をサポートしています。ACS を使用する場合、CPU および GPU の計算能力がともにサポートされます。
前提条件
クラスターのバージョンが 1.22 以降であり、クラスタータイプが ACK マネージドクラスター Pro または ACK 専用クラスター である必要があります。
ack-virtual-node コンポーネントを v2.10.0 以降のバージョンでインストール済みである必要があります。詳細については、「ACK 仮想ノード」をご参照ください。
ack-kruise コンポーネントをインストール済みであり、そのバージョンが v1.3.0 以降である必要があります。詳細については、「OpenKruise」をご参照ください。
重要注:仮想ノードのシナリオでは、OpenKruise v1.3.0 以前のバージョンで提供されるすべての SidecarSet 機能がサポートされています。ただし、v1.3.0 より後のバージョンで追加された新しい SidecarSet 機能はサポートされていません。
Kube API Server コンポーネントのパラメーター設定をカスタマイズし、featureGates 内で
SidecarSetServerlessPod=trueを設定して、SidecarSet 機能のフィーチャーゲートを有効化する必要があります。詳細については、「コントロールプレーンコンポーネントのパラメーターのカスタマイズ」をご参照ください。
特徴
SidecarSet
仮想ノードにスケジュールされるすべての Pod をマッチさせるには、ラベル serverless.alibabacloud.com/virtual-node: "true" を指定します。これはデフォルトの SidecarSet と同様の方法です。このラベルは、Pod が仮想ノードにスケジュールされることを確認した後に追加されます。デフォルトの SidecarSet の使用方法について詳しくは、「SidecarSet」をご参照ください。
もう一つの一般的な SidecarSet 機能は、ConfigMap および Secret の名前空間をまたいだ参照です。DaemonSet のコアコンテナーは、多くの場合、ConfigMap(例:パラメーター設定)に依存します。DaemonSet のコアコンテナーをアプリケーション Pod に挿入する際、アプリケーション Pod と ConfigMap は通常異なる名前空間に配置されます。仮想ノードのシナリオでは DaemonSet がサポートされないため、代わりにサイドカーコンテナーを使用します。サイドカーコンテナーのボリューム内では、名前空間/名前 形式で ConfigMap および Secret を名前空間をまたいで参照できます。
ConfigMap および Secret の名前空間をまたいだ参照を行うには、事前に権限付与を完了する必要があります。詳細については、「SidecarSetResourceBinding」をご参照ください。
SidecarSetResourceBinding
セキュリティ上の理由から、他の名前空間から ConfigMap や Secret をサイドカーコンテナーのボリュームに取り込む場合は、SidecarSetResourceBinding を明示的に権限付与する必要があります。
この権限付与により、ConfigMap および Secret に対する読み取り専用権限(Get、List、Watch)が付与されます。
コンテナーの起動およびシャットダウン順序
サイドカーコンテナーは、アプリケーションコンテナーの起動前に起動し、終了後にシャットダウンする必要があります。この動作は、「コンテナーの起動およびシャットダウン順序の設定(ECI)」および「サイドカーコンテナーの起動およびシャットダウン順序の設定(ACS)」をご参照ください。
サイドカーコンテナーの自動終了
ジョブ型の Pod では、アプリケーションコンテナーの完了後もサイドカーコンテナーが実行を継続し、ジョブの終了を妨げる場合があります。この問題は、「サイドカーコンテナーを強制終了し、コンテナーの終了コードを無視する」ことで解決できます。
サイドカーコンテナーのアップグレード
Sidecar パターンを使用した後、サイドカーコンテナーをアップグレードする必要がある場合があります。OpenKruise の既存の Sidecar ホットアップグレード 機能を使用できます。この機能により、Pod の可用性に影響を与えることなく、サイドカーコンテナーをシームレスにアップグレードでき、現在の仮想ノード メソッドと完全に互換です。
標準出力ログの収集
仮想ノードの Pod の標準出力ログ(stdlog ボリュームとして)をサイドカーコンテナー内の指定ディレクトリにマウントすることで、アプリケーションコンテナーの標準出力ログを収集できます。詳細については、「stdlog ボリュームをマウントしてコンテナーの標準出力ログを収集する」をご参照ください。
操作手順
本セクションでは、アプリケーション Pod(echo-server)へサイドカーコンテナー(filebeat コンテナー)を挿入する方法を説明します。本例を参考に、ご自身のアプリケーション設計を行ってください。
仮想ノード上で実行されるアプリケーション Pod へサイドカーコンテナーを自動的に挿入する SidecarSet をデプロイできます。
後続のサイドカーコンテナーへのマウント用に ConfigMap をデプロイできます。
kubectl apply -f filebeat-config.yamlfilebeat-config.yaml の内容は以下のとおりです。この例では、構成ファイル(filebeat.yml)をサイドカーコンテナーにマウントして出力するのみであり、関連する変数は有効ではありません。必要に応じて置き換えを行ってください。
apiVersion: v1 kind: ConfigMap metadata: name: filebeat-config namespace: kube-system labels: k8s-app: filebeat data: filebeat.yml: |- filebeat.inputs: - type: log paths: - /var/log/std/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} # 有効ではありません。変更しないでください。そのまま使用してください。 matchers: - logs_path: logs_path: "/var/log/std/" # ヒントベースの自動検出を有効にするには、`filebeat.inputs` の構成を削除し、以下のコメントを解除してください: #filebeat.autodiscover: # providers: # - type: kubernetes # node: ${NODE_NAME} # hints.enabled: true # hints.default_config: # type: container # paths: # - /var/log/containers/*${data.kubernetes.container.id}.log processors: - add_cloud_metadata: - add_host_metadata: cloud.id: ${ELASTIC_CLOUD_ID} # 有効ではありません。変更しないでください。そのまま使用してください。 cloud.auth: ${ELASTIC_CLOUD_AUTH} # 有効ではありません。変更しないでください。そのまま使用してください。 output.elasticsearch: hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}'] username: ${ELASTICSEARCH_USERNAME} # 有効ではありません。変更しないでください。そのまま使用してください。 password: ${ELASTICSEARCH_PASSWORD} # 有効ではありません。変更しないでください。そのまま使用してください。サイドカーコンテナーを記述する SidecarSet をデプロイできます。
kubectl apply -f sidecarset.yamlsidecarset.yaml の内容は以下のとおりです。この例では、filebeat コンテナーをサイドカーコンテナーとして使用し、構成ファイルの内容を出力するとともに、stdlog ボリュームをマウントしてアプリケーション Pod の標準出力ログを収集します。
apiVersion: apps.kruise.io/v1alpha1 kind: SidecarSet metadata: name: filebeat-sidecarset spec: selector: matchLabels: serverless.alibabacloud.com/virtual-node: "true" # 仮想ノードにスケジュールされるすべての Pod をマッチさせます。 updateStrategy: type: NotUpdate containers: # この例では、実際に filebeat を実行せず、busybox cat を使用します。 #- name: filebeat # image: docker.elastic.co/beats/filebeat:8.6.1 # args: [ # "-c", "/etc/filebeat.yml", # "-e", # ] - name: filebeat image: busybox imagePullPolicy: IfNotPresent args: [ "/bin/sh", "-c", "cat /etc/filebeat.yml && sleep 36000", ] env: - name: ECI_SIDECAR_CONTAINER # サイドカーコンテナーがアプリケーションコンテナーの終了後に終了することを示します。 value: "true" volumeMounts: - name: config mountPath: /etc/filebeat.yml readOnly: true subPath: filebeat.yml - name: stdlog # Pod の標準出力ログを、サイドカーコンテナーが読み取れるようにマウントします。 mountPath: /var/log/std readOnly: true volumes: - name: config configMap: name: kube-system/filebeat-config # 別の名前空間内の ConfigMap を「名前空間/名前」形式で参照します。 - name: stdlog csi: driver: stdlogplugin.csi.alibabacloud.comサイドカーコンテナーが ConfigMap にアクセスできるよう権限付与できます。
アプリケーション Pod と ConfigMap が異なる名前空間にある場合、SidecarSetResourceBinding を使用して、アプリケーション Pod に挿入されたサイドカーコンテナーが ConfigMap にアクセスできるよう明示的に権限付与する必要があります。
kubectl apply -f sidecarset-resourcebinding.yamlsidecarset-resourcebinding.yaml の内容は以下のとおりです。この例では、アプリケーション Pod を
default名前空間にデプロイし、ConfigMap をkube-system名前空間に配置する予定です。そのため、権限付与が必要です。# filebeat-sidecarset を権限付与します。SidecarSet に一致する Pod は、kube-system 名前空間内の filebeat-config ConfigMap にアクセスできます。 apiVersion: sidecarset.alibabacloud.com/v1alpha1 kind: SidecarSetResourceBinding metadata: name: filebeat-sidecarset-resourcebinding namespace: kube-system # この SidecarSetResourceBinding は、kube-system 名前空間内のリソースのみを権限付与します。 labels: spec: subjects: - kind: SidecarSet name: filebeat-sidecarset resourceRefs: - kind: ConfigMap name: filebeat-config
仮想ノードにスケジュールされるアプリケーション Pod をデプロイできます。
kubectl apply -f echo-server.yamlecho-server.yaml の内容は以下のとおりです。この Deployment は 1 つのレプリカを含み、Pod には単一のコンテナーが含まれます。
alibabacloud.com/eci: "true"ラベルを追加することで、Pod が仮想ノードにスケジュールされます。apiVersion: apps/v1 kind: Deployment metadata: name: echo-server labels: app: echo-server spec: replicas: 1 selector: matchLabels: app: echo-server template: metadata: labels: app: echo-server alibabacloud.com/eci: "true" spec: containers: - name: echo-server image: hashicorp/http-echo imagePullPolicy: IfNotPresent args: - -listen=:8080 - -text="hello world"サイドカーコンテナーがアプリケーション Pod へ自動挿入されたことを確認し、マウント結果を検証できます。
アプリケーション Pod を表示できます。
kubectl get pod期待される出力は以下のとおりです。アプリケーション Pod に 2 つのコンテナーが含まれており、サイドカーコンテナーの挿入が正常に完了したことを示します。
NAME READY STATUS RESTARTS AGE echo-server-f8bdc5844-r44nj 2/2 Running 0 14mサイドカーコンテナーがアプリケーション Pod の標準出力ログをマウントしていることを検証できます。
kubectl exec echo-server-f8bdc5844-r44nj -c filebeat -- cat /var/log/std/echo-server/0.log期待される出力は以下のとおりです。アプリケーション Pod の標準出力ログを確認できます。
2025-04-29T11:26:06.783205694+08:00 stderr F 2025/04/29 03:26:06 Server is listening on :8080サイドカーコンテナーが名前空間をまたいだ構成ファイルをマウントしていることを検証できます。
kubectl exec echo-server-f8bdc5844-r44nj -c filebeat -- cat /etc/filebeat.yml期待される出力は以下のとおりであり、マウントが正常に行われていることを示します。