すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:仮想ノードの Pod へのサイドカーコンテナーの挿入

最終更新日:Feb 06, 2026

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」をご参照ください。

ConfigMap のマウントを示す SidecarSet の YAML 例を展開

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:
  - name: filebeat
    image: busybox
    imagePullPolicy: IfNotPresent    
    args: [
      "/bin/sh",
      "-c",
      "cat /etc/filebeat.yml && sleep 36000", # この例では、filebeat の設定内容のみを出力します。
    ]    
    volumeMounts:
    - name: config
      mountPath: /etc/filebeat.yml
      readOnly: true
      subPath: filebeat.yml    
  volumes:
  - name: config
    configMap:
      name: kube-system/filebeat-config # namespace/name 形式を使用して、別の名前空間の ConfigMap を参照します。

SidecarSetResourceBinding

セキュリティ上の理由から、他の名前空間から ConfigMap や Secret をサイドカーコンテナーのボリュームに取り込む場合は、SidecarSetResourceBinding を明示的に権限付与する必要があります。

説明

この権限付与により、ConfigMap および Secret に対する読み取り専用権限(Get、List、Watch)が付与されます。

SidecarSetResourceBinding の YAML 例を展開

# 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 # 読み取り専用権限(Get、List、Watch)のみを付与します。
      name: filebeat-config

コンテナーの起動およびシャットダウン順序

サイドカーコンテナーは、アプリケーションコンテナーの起動前に起動し、終了後にシャットダウンする必要があります。この動作は、「コンテナーの起動およびシャットダウン順序の設定(ECI)」および「サイドカーコンテナーの起動およびシャットダウン順序の設定(ACS)」をご参照ください。

サイドカーコンテナーの自動終了

ジョブ型の Pod では、アプリケーションコンテナーの完了後もサイドカーコンテナーが実行を継続し、ジョブの終了を妨げる場合があります。この問題は、「サイドカーコンテナーを強制終了し、コンテナーの終了コードを無視する」ことで解決できます。

サイドカーコンテナーのアップグレード

Sidecar パターンを使用した後、サイドカーコンテナーをアップグレードする必要がある場合があります。OpenKruise の既存の Sidecar ホットアップグレード 機能を使用できます。この機能により、Pod の可用性に影響を与えることなく、サイドカーコンテナーをシームレスにアップグレードでき、現在の仮想ノード メソッドと完全に互換です。

標準出力ログの収集

仮想ノードの Pod の標準出力ログ(stdlog ボリュームとして)をサイドカーコンテナー内の指定ディレクトリにマウントすることで、アプリケーションコンテナーの標準出力ログを収集できます。詳細については、「stdlog ボリュームをマウントしてコンテナーの標準出力ログを収集する」をご参照ください。

stdlog のマウントを示す SidecarSet の YAML 例を展開

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:
  # この例では、サイドカーコンテナーのログ内容を出力するのみです。
  - name: filebeat
    image: busybox
    imagePullPolicy: IfNotPresent
    args: [
      "/bin/sh",
      "-c",
      "cat /var/log/std/filebeat/0.log && sleep 36000",
    ]    
    volumeMounts:    
    - name: stdlog # Pod の標準出力ログボリューム /var/log/std ディレクトリを、サイドカーコンテナーが読み取れるようにマウントします。
      mountPath: /var/log/std
      readOnly: true
  volumes:  
  - name: stdlog
    csi:
      driver: stdlogplugin.csi.alibabacloud.com

操作手順

本セクションでは、アプリケーション Pod(echo-server)へサイドカーコンテナー(filebeat コンテナー)を挿入する方法を説明します。本例を参考に、ご自身のアプリケーション設計を行ってください。

  1. 仮想ノード上で実行されるアプリケーション Pod へサイドカーコンテナーを自動的に挿入する SidecarSet をデプロイできます。

    1. 後続のサイドカーコンテナーへのマウント用に ConfigMap をデプロイできます。

      kubectl apply -f filebeat-config.yaml

      filebeat-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}  # 有効ではありません。変更しないでください。そのまま使用してください。
    2. サイドカーコンテナーを記述する SidecarSet をデプロイできます。

      kubectl apply -f sidecarset.yaml

      sidecarset.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
    3. サイドカーコンテナーが ConfigMap にアクセスできるよう権限付与できます。

      アプリケーション Pod と ConfigMap が異なる名前空間にある場合、SidecarSetResourceBinding を使用して、アプリケーション Pod に挿入されたサイドカーコンテナーが ConfigMap にアクセスできるよう明示的に権限付与する必要があります。

      kubectl apply -f sidecarset-resourcebinding.yaml

      sidecarset-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
  2. 仮想ノードにスケジュールされるアプリケーション Pod をデプロイできます。

    kubectl apply -f echo-server.yaml

    echo-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"
  3. サイドカーコンテナーがアプリケーション Pod へ自動挿入されたことを確認し、マウント結果を検証できます。

    1. アプリケーション Pod を表示できます。

      kubectl get pod

      期待される出力は以下のとおりです。アプリケーション Pod に 2 つのコンテナーが含まれており、サイドカーコンテナーの挿入が正常に完了したことを示します。

      NAME                          READY   STATUS    RESTARTS   AGE
      echo-server-f8bdc5844-r44nj   2/2     Running   0          14m
    2. サイドカーコンテナーがアプリケーション 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
    3. サイドカーコンテナーが名前空間をまたいだ構成ファイルをマウントしていることを検証できます。

      kubectl exec echo-server-f8bdc5844-r44nj -c filebeat -- cat /etc/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}  # 有効ではありません。変更しないでください。そのまま使用してください。