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

Container Service for Kubernetes:Pod に静的 IP、専用 vSwitch、セキュリティグループを設定する

最終更新日:Jun 16, 2026

Terway Trunk ENI を使用して、Pod ごとに静的 IP、vSwitch、またはセキュリティグループを割り当て、ネットワーク分離を実現します。

背景情報

ACK は、Pod 単位でネットワーク設定を行うための ENI ベースのソリューションを提供しています。2 つの ENI モードが利用できます。

  • 専用 ENI モード:各 Pod が専用の ENI にバインドされ、独立したネットワークリソースを持ちます。高い分離性を実現しますが、ENI クォータの消費量が多くなります。高性能で分離性の高いアプリケーションに適しています。

    このモードを使用するには、ノードプールの作成時に[専用 ENI ネットワークモード]を設定します。

  • Trunk ENI モード:ノード上の Trunk ENI が、複数の Pod に対して補助 ENI を動的に提供します。ノードあたりの Pod デプロイ密度が向上し、大規模なカスタムネットワーク設定に適しています。

    まず、クラスターで Trunk ENI 機能を有効にします。その後、terway-controlplane コンポーネントが自動的にデプロイされ、カスタムネットワーク設定のライフサイクル管理とポリシーを配信します。アーキテクチャ:

    image

    Trunk ENI モードは、カスタムネットワーク設定もサポートしており、重要な Pod に対してオンデマンドで専用 vSwitch、セキュリティグループ、静的 IP を割り当てることができます。一方、他の Pod はデフォルトの共有設定を使用します。

制限事項

  • ACK 専用クラスターを使用している場合は、クォータセンターにアクセスして、Container network supports Terway ENI Trunking mode という名前のクォータを申請してください。

  • 各ノードには Pod ホスティング制限があります。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。

  • セキュリティグループルールは、ノード内の Pod 間トラフィックや Pod からホストへのトラフィックには適用されません。これらのシナリオでは NetworkPolicy を使用してください。

  • Terway のバージョン要件:

    Terway をアップグレードするには、「アドオン」をご参照ください。
    • Trunk ENI モード:Terway v1.3.0 以降

    • 専用 ENI モード:Terway v1.11.0 以降

  • この機能は ECS インスタンスでのみサポートされています。

データパス

次の図は、Trunk ENI モードと専用 ENI モードのデータパスの違いを示しています。

image

専用 Pod 設定の適用範囲

専用 Pod 設定を使用すると、各 Pod は独自の vSwitch とセキュリティグループを持つ専用 ENI を取得します。

専用 Pod 設定をサポートする 2 つのノード設定モードがあります。

Trunk ENI をサポートするノード

Elastic Network Interface をサポートするノード (ノードプールに専用 ENI ネットワークモードを設定する」をご参照ください)

サポートされるクラスタータイプ

ACK マネージドクラスター

ACK マネージドクラスターACK 専用クラスター

デプロイ密度

通常の Pod は ENI を共有し、指定された Pod は専用 ENI を使用します。全体的な密度は高くなります。

すべての Pod が専用 ENI を使用します。密度は低くなります。

サポートされるノードタイプ

ECS ノード

ECS ノード

インスタンスタイプ

Trunk ENI をサポートし、EniTrunkSupported=true を返すインスタンスタイプを選択してください。サポートされているタイプについては、「DescribeInstanceTypes」をご参照ください。

ENI をサポートするインスタンスタイプ。

ユースケース

コスト重視で同時実行数の少ないサービス。

高性能、低レイテンシ、高同時実行数のサービス。

Kubernetes リソースの制限

  • kube-system 名前空間内の Pod はサポートされていません。

  • HostNetwork を使用する Pod はサポートされていません。

  • ラベル k8s.aliyun.com/ignore-by-terway=true が付与された Pod はサポートされていません。

ステップ 1: クラスターで Trunk ENI 機能を有効にする

新規クラスター

ACK クラスターを作成するときは、ネットワークプラグインTerway に設定し、Terway モード セクション (ネットワークプラグインタイプ: terway-eniip) で Trunk ENI のサポート を選択します。 「ACK 専用クラスターの作成 (廃止)」および「ACK マネージドクラスターの作成」をご参照ください。

説明

Kubernetes 1.31 以降、新しい ACK マネージドクラスターでは、Trunk ENI がデフォルトで有効になっています。

重要

一度有効にすると、Trunk ENI を無効にすることはできません。

既存クラスター

前提条件

既存のクラスターで terway-eniip ネットワークプラグインを使用している必要があります。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。

説明

クラスターのアドオン管理 ページでネットワークプラグインを確認してください。

制限事項

  • 2020 年 6 月より前に作成された ACK マネージドクラスターは、この機能をサポートしていない可能性があります。互換性を確認するには、ステップ 1 の手順に従ってください。

  • 一度有効にすると、静的 IP、専用 vSwitch、セキュリティグループの機能を無効にすることはできません。

ステップ 1: Trunk ENI サポートを確認する

重要
  • ACK 専用クラスターの場合、Trunk ENI をサポートする ECS インスタンスを使用するための権限を申請する必要があります。申請するには、チケットを送信してください。

  • 既存の ACK マネージドクラスター、または ACK 専用クラスターから移行した ACK マネージドクラスターの場合、Trunk ENI がサポートされているかを確認し、設定を変更してください。ECS インスタンスの権限は不要です。

トークン設定を確認します。

kubectl get secret -n kube-system addon.network.token

設定が存在する場合の出力例:

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

トークン設定が存在する場合は、次のステップに進んでください。存在しない場合は、Trunk ENI をサポートする新しいクラスターを作成してください。

ステップ 2: terway-eniip と Trunk ENI を有効にする

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

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

  3. アドオン管理 ページで、ネットワーク タブをクリックし、terway-eniip コンポーネントを見つけます。

  4. terway-eniip カードで アップグレード をクリックして、terway-eniip コンポーネントを最新バージョンに更新します。

    アップグレードボタンが表示されない場合、コンポーネントはすでに最新です。この手順はスキップしてください。

  5. terway-eniip を有効にします。

    1. eni-config ConfigMap を編集します。

      kubectl edit cm -n kube-system eni-config
    2. eni_conf キーの下にあるパラメータを編集します。

      パラメータ

      説明

      enable_eni_trunking

      true

      Trunk ENI を有効にします。一度有効にすると無効にできません。

      credential_path

      /var/addon/token-config

      ACK マネージドクラスターの場合、このパラメータが存在しない場合は追加してください。

      重要
      • 他のパラメータは変更しないでください。

      • eni-config ConfigMap の内容は、有効な JSON 形式である必要があります。

      設定例:

      apiVersion: v1
      data:
        eni_conf: |
          {
            "min_pool_size": 0,
            "enable_eni_trunking": true,
            "credential_path": "/var/addon/token-config",
            ...
          }
      kind: ConfigMap
    3. Terway Pod を再起動して設定を適用します。

      kubectl delete pod -n kube-system -l app=terway-eniip
  6. terway-eniip パラメーターを設定した後、アドオン管理 ページの ネットワーク タブに移動し、terway-controlplane コンポーネントをインストールします。

    インストール後、terway-controlplane カードには インストール済み が表示されます。

ステップ 2: PodNetworking カスタムリソースを作成する

Terway は、PodNetworking カスタムリソース (CR) を使用してネットワーク設定を記述します。複数の PodNetworking オブジェクトを作成して、異なるネットワークプレーンを定義します。

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

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

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

    PodNetworking YAML の例:

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: example
    spec:
      allocationType:
        type: Fixed # Pod IP アドレス割り当てポリシー。有効な値: Elastic および Fixed。
        releaseStrategy: TTL # このパラメータは、type が Fixed に設定されている場合にのみ有効です。type が Elastic に設定されている場合、releaseStrategy と releaseAfter を設定する必要はありません。
        releaseAfter: "1h" # このパラメータは、releaseStrategy が TTL に設定されている場合にのみ有効です。
      selector:
        podSelector:
          matchLabels:
            foo: bar
        namespaceSelector:
          matchLabels:
            foo: bar
      securityGroupIDs:
      - sg-bpxxxx
      vSwitchOptions:
      - vsw-bpxxxx
      eniOptions:
        eniType: Default

    パラメータの説明:

    パラメータ

    説明

    allocationType

    (Pod IP アドレス割り当てポリシー)

    type

    有効な値:

    • Elastic: Pod が削除された後、IP リソースが解放されます。

    • Fixed: 静的 IP アドレスポリシー。

      typeFixed の場合、このポリシーは固定名を持つ Pod (デフォルトでは、StatefulSet および ownerReferences がない Pod) に適用されます。カスタムワークロードの場合は、[アドオン] ページで terway-controlplane を設定してください。

      説明

      静的 IP ポリシーを使用すると、再作成された Pod は元の Pod と同じゾーンに制約されます。

    releaseStrategy

    typeFixed の場合にのみ有効です。有効な値:

    • TTL: 遅延リリース。Pod 削除後、指定された時間が経過した後に IP が解放されます。最小値: 5 分。

    • Never: IP アドレスは自動的に解放されません。不要になったら、PodENI リソースを手動で削除してください。

    releaseAfter

    遅延リリース時間。releaseStrategyTTL の場合にのみ有効で、Go の時間型形式で hm などの単位 (2h45m5m0s など) を使用します。

    selector

    (ラベルセレクター。一致した Pod がこのネットワーク設定を使用します。)

    podSelector

    • Pod のラベルと照合します。一致した Pod がこのネットワーク設定を使用します。

    • podSelectornamespaceSelector の両方が設定されている場合、すべてのルールに一致する Pod がこの設定を使用します。

    • 一意の一致を確保してください。Pod が複数の PodNetworking 設定に一致する場合、いずれか 1 つが任意に適用されます。

    namespaceSelector

    • 名前空間のラベルと照合します。一致した名前空間内の Pod がこの設定を使用します。

    • podSelectornamespaceSelector の両方が設定されている場合、すべてのルールに一致する Pod がこの設定を使用します。

    • 一意の一致を確保してください。複数の一致がある場合、いずれかが任意に選択されます。

    vSwitchOptions

    -

    • Pod 用の vSwitch。複数の ID が指定されている場合、Terway は条件を満たすものを 1 つ選択します。

    • Pod は、指定された vSwitch と同じゾーンに制約されます。

    • vSwitch のゾーンは、ターゲットノードのゾーンと一致する必要があり、十分な空き IP アドレスが必要です。そうでない場合、Pod の作成は失敗します。

    説明

    オートスケーリングが有効になっている場合、vSwitchOptions ゾーンの制約により、ノードプールのスケールアウトが妨げられる可能性があります。詳細については、「オートスケーリング FAQ」をご参照ください。

    vSwitchSelectOptions

    (vSwitch 選択ポリシーを設定します)

    vSwitchSelectionPolicy

    有効な値:

    • ordered (デフォルト): 入力された順序で選択します。

    • most: 利用可能な IP が最も多い vSwitch を優先します。

    • random: vSwitch をランダムに選択します。

    説明

    Terway v1.11.0 以降でサポートされています。

    securityGroupIDs

    -

    複数のセキュリティグループ ID をサポートします (すべて有効)。最大: 10。

    説明

    Terway v1.13.6 以降は、最大 10 個のセキュリティグループをサポートしています。

    eniOptions

    (Pod が使用する ENI タイプを設定します)

    eniType

    有効な値:

    • Default: 共有 ENI クラスターの場合は Trunk ENI、専用 ENI クラスターの場合は専用 ENI。

    • ENI: 専用 ENI を使用します。

    • Trunk: Trunk ENI を使用します。

    説明

    Terway v1.11.0 以降でサポートされています。

  4. 作成する をクリックします。

    PodNetworking は、その statusReady になって初めて有効になります。

    リソースのステータスが ready かどうかを確認します。

    kubectl describe PodNetworking example # example をカスタムリソースの名前に置き換えてください。

(オプション) ステップ 3: 名前空間に一致するラベルを追加する

ラベルマッチングによって PodNetworking ルールを適用するには、対応するラベルをターゲット名前空間に追加します。

  1. example という名前のテスト名前空間を作成します。

    kubectl create ns example
  2. foo=bar ラベルを名前空間に追加します。

    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 を作成する

Pod が作成されると、システムはそのラベルを PodNetworking リソースと照合します。一致した Pod には、一致した設定に従って ENI が割り当てられます。一致しない Pod は、デフォルトの ENI を使用します。

Terway は、一致した各 Pod のネットワークリソースを追跡するために、PodENI カスタムリソースを作成します。詳細については、「ラベルとセレクター」をご参照ください。

  1. my-nginx.yaml という名前のファイルを作成し、次の YAML コンテンツを記述します。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-nginx    # サンプルアプリケーションの名前。
      namespace: example   # 名前空間を example として指定します。
      labels:
        app: nginx
    spec:
      serviceName: "nginx-service"  
      replicas: 1    
      selector:
        matchLabels:
          app: nginx 
      template:
        metadata:
          labels:
            app: nginx
            foo: bar  # Pod に foo:bar ラベルを追加します。
        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. my-nginx サンプルアプリケーションをデプロイします。デプロイ後、ネットワーク設定を確認するには、「PodNetworking の使用状況の確認」をご参照ください。

    kubectl apply -f my-nginx.yaml

移行のために terway-controlplane を停止する

カスタム Pod 設定がされている ACK 専用クラスターは、ACK マネージド Pro 版クラスターに直接移行できません。移行前に terway-controlplane を停止し、移行後に再度有効にしてください。

  1. 移行の準備をします。

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

      kubectl scale deploy -n kube-system terway-controlplane --replicas 0
    2. Webhook を設定します。

      # 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
      # Webhook 設定を削除します。
      kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
    3. サービスを設定します。

      # 元のサービス設定をバックアップします。
      kubectl get service -n kube-system terway-controlplane -oyaml > terway-controlplane.service.yaml
      # 元のサービス設定を削除します。
      kubectl delete -f terway-controlplane.service.yaml
  2. 移行後、結果を確認します。

    • 移行が失敗した場合は、Webhook と terway-controlplane を復元します。

      # サービス設定を復元します。
      kubectl apply -f terway-controlplane.service.yaml
      # Webhook 設定を復元します。
      kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
      # terway-controlplane を復元します。
      kubectl scale deploy -n kube-system terway-controlplane --replicas 1
    • 移行が成功した場合は、リソースを削除します。

      kubectl delete deploy -n kube-system terway-controlplane
  3. アドオン管理 ページから terway-controlplane をインストールします。詳細については、「アドオンの管理」をご参照ください。

よくある質問

PodNetworking の使用状況の確認

  1. 作成後、ポッドの annotations には、 PodNetworking の使用を示す 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
  2. Terway は、Pod と同じ名前/名前空間の PodENI リソースを作成し、そのネットワーク設定を記録します。

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

    PodNetworking が使用されていることを示す出力例:

    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

Pod に PodNetworking 設定が適用されない場合

  1. PodNetworking のステータスが Ready であることを確認します。

  2. Pod のラベルが PodNetworking セレクターと一意に一致することを確認します。

  3. 静的 IP ポリシーは、固定名を持つ Pod (デフォルトでは、StatefulSet および ownerReferences がない Pod) に適用されます。

関連ドキュメント