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

Container Service for Kubernetes:Pod に静的 IP アドレス、独立した vSwitch、およびセキュリティグループを設定する

最終更新日:Mar 26, 2026

デフォルトでは、ノード上のすべての Pod がそのノードのセキュリティグループと IP アドレスプールを共有します。これにより、Pod レベルでの細かいネットワーク分離が不可能となり、ノード上の任意の Pod が同一のリソースにアクセスできるようになります。Terway の Trunk ENI 機能は、各 Pod に専用の ENI、vSwitch、およびセキュリティグループを割り当てることでこの課題を解決します。同時に、同一ノード上の他の Pod のデプロイ密度を低下させることはありません。

以下の手順では、Terway Trunk ENI 機能を有効化し、PodNetworking カスタムリソース定義 (CRD) を使用して Pod 単位のネットワーク分離を構成する方法について説明します。

仕組み

Trunk ENI 機能を有効化すると、クラスター内に terway-controlplane コンポーネントがデプロイされます。Pod が作成されると、Terway はそのラベルを PodNetworking CRD と照合します。一致が見つかった場合、Terway は該当する PodNetworking で定義された vSwitch およびセキュリティグループから、Pod に専用の ENI を割り当てます。PodNetworking と一致しない Pod は、共有 ENI から IP アドレスを使用し続けます。

image

ノードの構成モード

Pod 単位のネットワーク分離をサポートするノードモードには、2 種類あります。クラスタータイプおよびデプロイ密度の要件に応じて選択してください。

Trunk ENI をサポートするノードENI をサポートするノード
サポートされるクラスタータイプACK マネージドクラスターACK マネージドクラスターおよび ACK 専用クラスター
デプロイ密度通常の Pod は共有 ENI を使用し、指定された Pod は排他的な ENI を使用 — 全体的な密度が高くなりますすべての Pod が排他的な ENI を使用 — 密度が低くなります
サポートされるノードタイプECS ノードECS ノード
インスタンスタイプインスタンスの EniTrunkSupported=trueDescribeInstanceTypes が有効になっているもの( をご参照ください)ENI をサポートするインスタンス

制限事項

  • ACK 専用クラスター:作業を進める前に、クォータセンターコンソールで Container network supports Terway ENI Trunking mode クォータを申請してください。

  • ノードあたりの Pod 数: ノードあたりの Pod 数には上限があります。詳細については、「Terway の使用」をご参照ください。

  • 同一ノード間のトラフィック: Pod のセキュリティグループルールは、同一ノード上の Pod 間、または Pod とそのホストノード間のトラフィックには適用されません。これらのシナリオで分離を強制するには、ネットワークポリシーを構成してください。

  • 2020 年 6 月以前に作成された ACK マネージドクラスター: この機能はサポートされていない場合があります。確認には、「ステップ 1:クラスターが Terway Trunk ENI 機能をサポートしているか確認する」に従ってください。

  • 不可逆性: 静的 IP アドレス、vSwitch、およびセキュリティグループは、一度有効化すると無効化できません。

前提条件

開始する前に、以下を確認してください。

  • terway-eniip ネットワークプラグインがインストール済みの ACK マネージドクラスターまたは ACK 専用クラスター

  • (ACK 専用クラスターのみ)Trunk ENI の ECS インスタンス権限を申請するためのチケット送信済み

  • Trunk ENI をサポートするインスタンスタイプ(EniTrunkSupported=true)のノード(Trunk ENI ノードモードを使用する場合)

  • Pod に割り当てる予定の vSwitch に十分な利用可能な IP アドレスがあること

ステップ 1:Terway Trunk ENI 機能を有効化する

新規クラスターで Trunk ENI を有効化する

ACK クラスターを作成する際、ネットワークプラグインTerway に、Terway モードENI Trunking のサポート に設定します。このモードでのネットワークプラグインの種類は terway-eniip です。手順については、「ACK 専用クラスターの作成(非推奨)」および「ACK マネージドクラスターの作成」をご参照ください。

Kubernetes 1.31 以降を実行する新規 ACK マネージドクラスターでは、Trunk ENI 機能がデフォルトで有効化されています。
重要

Trunk ENI 機能は、一度有効化すると無効化できません。

既存のクラスターで Trunk ENI を有効化する

ステップ 1:クラスターが Terway Trunk ENI 機能をサポートしているか確認する

重要
  • ACK 専用クラスターを使用する場合は、このステップをスキップしてください。代わりに、チケットを送信して Trunk ENI の ECS インスタンス権限を申請し、ステップ 2 に進んでください。

  • 既存の ACK マネージドクラスター、または ACK 専用クラスターからアップグレードされた ACK マネージドクラスターの場合は、クラスターが Terway Trunk ENI 機能をサポートしているか確認し、構成を変更する必要があります。Trunk ENI をサポートする ECS インスタンスを使用するための権限申請は不要です。

以下のコマンドを実行して、トークン構成を確認します。

kubectl get secret -nkube-system addon.network.token

期待される出力:

NAME                  TYPE     DATA   AGE
addon.network.token   Opaque   1      69m

トークンが存在する場合は、ステップ 2 に進んでください。存在しない場合は、クラスターは Trunk ENI 機能をサポートしていません。代わりに、Trunk ENI が有効化された新規クラスターを作成してください。

ステップ 2:terway-eniip の更新および構成

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。

  2. クラスター名をクリックします。左側のナビゲーションウィンドウで、操作 > アドオン を選択します。

  3. アドオン ページで、ネットワーキング タブをクリックし、terway-eniip を探します。

  4. terway-eniip カードで、最新バージョンへアップグレードするために アップグレード をクリックします。アップグレード ボタンが表示されない場合は、すでに最新バージョンがインストールされています。

  5. Trunk ENI を有効化するために、eni-config ConfigMap を編集します。

    パラメーター説明
    enable_eni_trunkingtrueTrunk ENI 機能を有効化します。有効化後は無効化できません。
    credential_path/var/addon/token-configACK マネージドクラスターのみで必須です。存在しない場合は、手動でこのパラメーターを追加してください。
    kubectl edit cm -nkube-system eni-config

    ConfigMap 内で以下のパラメーターを設定します。他のパラメーターは変更しないでください。ConfigMap の内容は JSON 形式である必要があります。例としての ConfigMap を以下に示します。

    apiVersion: v1
    data:
      eni_conf: |
        {
          "min_pool_size": 0,
          "enable_eni_trunking": true,
          "credential_path": "/var/addon/token-config",
          ...
        }
    kind: ConfigMap
  6. 変更を有効化するために Terway ポッドを再起動します。

    kubectl delete pod -n kube-system -l app=terway-eniip
  7. アドオン ページで、ネットワーキング タブをクリックし、terway-controlplane をインストールします。インストール後、インストール済みterway-controlplane カードに表示されます。

ステップ 2:PodNetworking を作成する

PodNetworking は、一連の Pod に対してネットワーク構成を定義する Terway のカスタムリソース定義 (CRD) です。構成したいネットワークプレーンごとに 1 つの PodNetworking を作成します。

  1. ACK コンソールにログインし、クラスター をクリックします。

  2. クラスター名をクリックします。左側のナビゲーションウィンドウで、ワークロード > カスタムリソース を選択します。

  3. カスタムリソース ページで、CRD タブをクリックし、YAML からの作成 をクリックします。

  4. 以下のテンプレートを貼り付け、環境に合わせてパラメーターを変更します。

    パラメーター説明
    allocationType.typeElastic:Pod 削除時に IP が解放されます。Fixed:Pod の再起動時も IP アドレスを保持します。Fixed モードは、固定名を持つ Pod(StatefulSet およびデフォルトで ownerReferences を持たない Pod)にのみ適用されます。カスタムワークロードを構成する必要がある場合は、コンポーネント管理で terway-controlplane を構成してください。Fixed モードを使用する場合、Pod は常に同一ゾーンで再作成されます。
    releaseStrategytypeFixed の場合にのみ適用されます。TTL:指定された releaseAfter の遅延後に IP を解放(最小 5 分)。Never:IP は自動的に解放されず、IP アドレスを解放するには PodENI を手動で削除する必要があります。
    releaseAfterreleaseStrategyTTL の場合にのみ適用されます。Go の期間形式を使用します。例:2h45m5m0s
    podSelectorPod のラベルと照合します。podSelectornamespaceSelector の両方が設定されている場合、Pod は両方の条件を満たす必要があります。各 Pod は最大で 1 つの PodNetworking と一致しなければならず、複数の PodNetworking と一致する場合は、使用されるネットワーク構成は未定義となります。
    namespaceSelector名前空間のラベルと照合します。podSelector と同じ照合ルールが適用されます。
    vSwitchOptionsvSwitch のリストです。Terway は Pod ごとに 1 つの vSwitch を選択します。Pod は、リストされた vSwitch と同じゾーン内のノードにのみスケジュールできます。vSwitch に十分な利用可能な IP アドレスがあることを確認してください。利用可能な IP アドレスがない場合、Pod の作成は失敗します。ノードの自動スケーリングが有効な場合、このゾーン制約によりノードプールのスケールアウトが妨げられる可能性があります。
    vSwitchSelectOptions.vSwitchSelectionPolicyTerway v1.11.0 以降でサポートされます。ordered(デフォルト):リストされた順序で vSwitch を使用。most:利用可能な IP アドレス数が最も多い vSwitch を使用。random:ランダムに選択。
    securityGroupIDs1~5 個のセキュリティグループ ID。指定されたすべてのセキュリティグループが同時に有効になります。
    eniOptions.eniTypeTerway v1.11.0 以降でサポートされます。Default(デフォルト):共有 ENI クラスターでは Trunk ENI モード、排他的 ENI クラスターでは排他的な ENI モード。ENI:排他的な ENI モード。Trunk:Trunk ENI モード。
    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: example
    spec:
      allocationType:
        type: Fixed          # IP 割り当てポリシー:Elastic または Fixed
        releaseStrategy: TTL # Fixed ポリシーの場合のみ:TTL または Never
        releaseAfter: "1h"   # TTL 戦略の場合のみ:IP 解放前の遅延
      selector:
        podSelector:
          matchLabels:
            foo: bar          # このラベルを持つ Pod がこの PodNetworking を使用
        namespaceSelector:
          matchLabels:
            foo: bar          # namespaceSelector が設定されている場合、名前空間も一致する必要があります
      securityGroupIDs:
      - sg-bpxxxx             # 最大 5 個のセキュリティグループ ID;すべて同時に有効
      vSwitchOptions:
      - vsw-bpxxxx            # 1 個以上の vSwitch;Terway は Pod ごとに 1 つを選択
    status:
      status: Ready

    以下の表にパラメーターの説明を示します。

  5. 作成 をクリックします。

PodNetworking が準備完了であることを確認する:

kubectl describe PodNetworking example  # example をご自身の PodNetworking 名に置き換えてください

status フィールドが Ready と表示されるまで待ちます。PodNetworking は、Ready ステータスになるまで Pod に適用されません。

(任意)ステップ 3:名前空間にラベルを追加する

PodNetworking で namespaceSelector を使用する場合、対象の名前空間に一致するラベルを追加します。

  1. テスト用の名前空間を作成します。

    kubectl create ns example
  2. namespaceSelector と一致するラベルを追加します。

    kubectl label namespaces example foo=bar  # example をご自身の名前空間名に置き換えてください
  3. ラベルが正しく適用されたことを確認します。

    kubectl get namespace example --show-labels  # example をご自身の名前空間名に置き換えてください

    期待される出力:

     NAME      STATUS   AGE   LABELS
    example   Active   24s   foo=bar,kubernetes.io/metadata.name=example

(任意)ステップ 4:Pod をデプロイしてネットワーク構成を検証する

  1. 以下の内容で my-nginx.yaml ファイルを作成します。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-nginx        # アプリケーション名
      namespace: example    # 対象名前空間
      labels:
        app: nginx
    spec:
      serviceName: "nginx-service"
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
            foo: bar        # PodNetworking の podSelector と一致させる必要があります
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
    # StatefulSet が永続ストレージを必要とする場合、volumeClaimTemplates を追加:
    # volumeClaimTemplates:
    # - metadata:
    #     name: nginx-storage
    #   spec:
    #     accessModes: ["ReadWriteOnce"]
    #     storageClassName: "my-storage-class"
    #     resources:
    #       requests:
    #         storage: 1Gi
  2. アプリケーションをデプロイします。

    kubectl apply -f my-nginx.yaml
  3. Pod が PodNetworking 構成を使用していることを確認します。Pod が PodNetworking と一致した場合、Pod に k8s.aliyun.com/pod-networking アノテーションが追加されます。

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.aliyun.com/pod-eni: "true"
        k8s.aliyun.com/pod-networking: podnetworking
      labels:
        app: example
        pod-ip: elastic
  4. Terway が Pod 用に自動作成した PodENI を確認します。

    kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml
    # <my-nginx-0> を Pod 名、<example> を名前空間名に置き換えてください

    出力結果により、Pod に割り当てられた ENI、vSwitch、セキュリティグループ、および IP アドレスが確認できます。

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: <my-nginx-0>
      namespace: default
    spec:
      allocations:
      - allocationType:
          type: Elastic
        eni:
          id: eni-bp1xxxx
          mac: 00:16:xx:xx:xx:xx
          securityGroupIDs:
          - sg-bp1xxxx
          vSwitchID: vsw-bp1xxxx
          zone: cn-hangzhou-h
        ipv4: 192.168.x.x
        ipv4CIDR: 192.168.x.x/19
        ipv6: 2408:x:x:x:x:x:x:x
        ipv6CIDR: 2408:x:x:x::/64
      zone: cn-hangzhou-h
    status:
      eniInfos:
        eni-bp1xxxx:
          id: eni-bp1xxxx
          status: Bind
          vid: 1001
      instanceID: i-bp1xxxx
      phase: Bind
      podLastSeen: "2021-xx-xxT00:00:00Z"
      trunkENIID: eni-bp1xxxx

クラスター移行前に terway-controlplane を停止する

ACK 専用クラスターで Pod のカスタム構成を有効化している場合、ワークロードを ACK マネージド Pro クラスターに直接移行することはできません。移行前に terway-controlplane を停止し、移行後に再び有効化してください。

移行前:

  1. terway-controlplane を停止します。

    kubectl scale deploy -nkube-system terway-controlplane --replicas 0
  2. Webhook 構成をバックアップした後、削除します。

    # バックアップ
    kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml
    kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml
    # 削除
    kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml
    kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml

移行後:

移行手順については、「ACK 専用クラスターから ACK マネージド Pro クラスターへのホットマイグレーション」をご参照ください。
  • 移行が失敗した場合: Webhook および terway-controlplane を復元します。

    kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
    kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
    kubectl scale deploy -nkube-system terway-controlplane --replicas 1
  • 移行が成功した場合: terway-controlplane を削除し、アドオン ページから再インストールします。

    kubectl delete deploy -nkube-system terway-controlplane

    再インストール手順については、「システムコンポーネントの管理」をご参照ください。

よくある質問

Pod が期待される PodNetworking を使用していないのはなぜですか?

以下の項目を順に確認してください。

  1. PodNetworking の statusReady である必要があります。kubectl describe PodNetworking <name> を実行して確認してください。

  2. Pod のラベルが正確に 1 つの PodNetworking と一致している必要があります。複数の PodNetworking と一致する場合、使用されるネットワーク構成は未定義となります。

  3. PodNetworking で Fixed 割り当てポリシーを使用している場合、これは StatefulSet および ownerReferences を持たない Pod にのみ適用されます。Deployment またはその他のコントローラーによって管理される Pod は一致しません。

次のステップ