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

Container Service for Kubernetes:ポッドごとに静的 IP アドレス、個別の vSwitch、および個別のセキュリティグループを構成する

最終更新日:May 28, 2025

ユーザー トラフィックの管理と分離、ネットワーク ポリシーの構成、および IP アドレスの詳細な管理を行う場合は、Container Service for Kubernetes(ACK)クラスタの Terway Trunk ENI 機能を有効にできます。この機能を使用すると、Pod ごとに静的 IP アドレス、個別の vSwitch、および個別のセキュリティグループを指定できます。

背景情報

Trunk ENI は新しい仮想ネットワーク インターフェースです。Trunk ENI は、ENI によって提供されるすべての機能をサポートしています。さらに、使用できる ENI の最大数に達し、追加の ENI を使用する必要がある場合は、これらの ENI を Trunk ENI に関連付けることができます。これらの ENI はそれぞれ、個別に Pod に割り当てることができます。

クラスタの Trunk ENI 機能を有効にした後、特定の Pod の構成をカスタマイズして、排他モードで Trunk ENI に関連付けられている追加の ENI を使用し、他の Pod が元の ENI を共有するように設定できます。Pod のカスタム構成機能はオプションです。デフォルトでは、すべての Pod は共有 ENI から割り当てられた IP アドレスを使用します。Pod でカスタム構成を使用できるようにするには、まず Claim を作成して、Pod のカスタム Pod 構成機能を有効にする必要があります。

カスタム Pod 構成を有効にすると、terway-controlplane コンポーネントがクラスタにデプロイされます。次の図は、コンポーネントの動作を示しています。

制限

  • ACK 専用クラスターを使用する場合は、クォータセンター コンソールに移動し、Container network supports Terway ENI Trunking mode を申請してください。

  • ノードで作成できる Pod の数には制限があります。詳細については、「Terway を使用する」をご参照ください。

  • Pod セキュリティグループ ルールは、同じノード上の Pod 間のトラフィック、および Pod と Pod が作成されたノード間のトラフィックには適用されません。これらのシナリオで Pod セキュリティグループ ルールを適用する場合は、ネットワーク ポリシーを構成できます。

個別のポッド構成のスコープ

個別の Pod 構成は、Pod ごとに専用の ENI を作成し、ENI に排他的な vSwitch とセキュリティグループを構成することで実現されます。

個別の Pod 構成には、次のノード構成モードが必要です。

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

ENI をサポートするノード (詳細については、ノード ネットワークを構成するを参照)

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

ACK マネージドクラスターs

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

デプロイメント密度

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

ノード上のすべての Pod は排他的な ENI のみを使用できるため、密度が低くなります。

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

ECS ノード

ECS ノード

インスタンス タイプ

トランク ENI をサポートし、EniTrunkSupported=true レスポンスパラメータを持つインスタンスを選択する必要があります。トランク ENI をサポートするインスタンスの詳細については、「DescribeInstanceTypes」をご参照ください。

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

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

ACK 専用クラスター を使用している場合は、チケットを提出して、Trunk ENI をサポートする ECS インスタンスを使用するための権限を申請する必要があります。ACK マネージドクラスター の場合は、Trunk ENI をサポートする ECS インスタンスを使用するための権限を申請する必要はありません。

新しいクラスタで Terway Trunk ENI 機能を有効にする

ACK クラスタを作成し、[ネットワーク プラグイン][Terway] に設定し、[Terway モード][ENI トランキングのサポート] に設定します。このモードでは、ネットワーク プラグインのタイプは terway-eniip です。詳細については、「ACK 専用クラスターを作成する(廃止)」および「ACK マネージドクラスターを作成する」をご参照ください。

説明

デフォルトでは、Kubernetes 1.31 以降のバージョンを実行する新しく作成された ACK マネージドクラスター で Trunk ENI 機能が有効になっています。

重要

新しいクラスタで Trunk ENI 機能を有効にした後は、無効にすることはできません。

既存のクラスタで Trunk ENI 機能を有効にする

前提条件

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

説明

インストールしたネットワーク プラグインは、クラスタの [アドオン] ページで確認できます。

制限

  • この機能は、2020 年 6 月より前に作成された ACK マネージドクラスター ではサポートされていない場合があります。[手順 1] を実行して、クラスターがこの機能をサポートしているかどうかを確認します。

  • 静的 IP アドレス、vSwitch、およびセキュリティグループは、有効にした後は無効にすることはできません。

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

重要
  • ACK 専用クラスター を使用している場合は、このステップをスキップします。Trunk ENI を使用するには、権限を申請する必要があります。チケットを申請することで、Trunk ENI をサポートする ECS インスタンスを使用するための権限を申請できます。

  • 既存の 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

トークン構成が存在する場合は、次のステップに進みます。トークン構成が存在しない場合、クラスタは Terway Trunk ENI 機能をサポートしていません。この場合、Terway Trunk ENI 機能が有効になっている新しいクラスタを作成できます。

ステップ 2:terway-eniip を有効にし、クラスタの Terway Trunk ENI 機能を有効にする

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

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

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

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

    [アップグレード] ボタンが表示されていない場合は、最新バージョンの terway-eniip がインストールされています。このステップはスキップできます。

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

    1. 次のコマンドを実行して、eni-config ConfigMap を変更します。

      kubectl edit cm -nkube-system eni-config
    2. [eni-config] ConfigMap のパラメーターを変更します。

      パラメーター

      説明

      enable_eni_trunking

      true

      Trunk ENI 機能を有効にします。この機能は、有効にした後は無効にすることはできません。

      credential_path

      /var/addon/token-config

      ACK マネージドクラスター を使用している場合、ConfigMap にはこのパラメーターは含まれていません。パラメーターを手動で追加する必要があります。

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

      • [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 を再起動し、変更された ConfigMap を有効にします。

      kubectl delete pod -n kube-system -l app=terway-eniip
  6. terway-eniip を有効にした後、terway-controlplane[アドオン] ページの [ネットワーキング] タブから をインストールします。

    terway-controlplane がインストールされると、[インストール済み][terway-controlplane] カードに表示されます。

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

Terway では、PodNetworking という名前のカスタムリソース定義 (CRD) を使用してネットワーク構成を記述できます。複数の PodNetworking を作成して、異なるネットワークプレーンを設計できます。

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

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、[ワークロード] > [カスタムリソース] を選択します。

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

    次のコードブロックは、PodNetworking のサンプルを示しています。

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

    次の表にパラメーターを示します。

    パラメーター

    説明

    allocationType

    (ポッドへの IP アドレスの割り当て方法を記述するポリシー)

    type

    有効な値:

    • Elastic: エラスティック IP アドレス (EIP) をポッドに割り当てます。 IP アドレスは、ポッドが削除された後に解放されます。

    • Fixed: 静的 IP アドレスをポッドに割り当てます。

      このモードを有効にした後、PodNetworking は固定名を持つポッドにのみ有効になります。デフォルトでは、StatefulSet と ownerReferences のないポッドがサポートされています。カスタムワークロードを構成する必要がある場合は、コンポーネント管理で terway-controlplane を構成します。

    説明

    Fixed ポリシーを使用する場合、ポッドが再作成されるゾーンが元のゾーンと同じになるように制約が追加されます。

    releaseStrategy

    IP アドレスの解放方法を記述するポリシー。このパラメーターは、typeFixed に設定されている場合にのみ有効です。有効な値:

    • TTL: IP アドレスは遅延して解放されます。ポッドが削除された後、指定された期間が終了するまで、ポッドの IP アドレスは解放されません。最小値は 5 分です。

    • Never: IP アドレスは解放されません。 IP アドレスが使用されなくなった場合は、手動で PodENI を削除する必要があります。

    releaseAfter

    ポッド IP アドレスを解放するための遅延。このパラメーターは、releaseStrategyTTL に設定されている場合にのみ有効です。値は Go time 型である必要があります。単位: 時間 (h) および分 (m)。例: 2h45m または 5m0s。詳細については、「Go time 型」をご参照ください。

    selector

    (現在の PodNetworking を使用するポッドを選択するために使用されるラベルセレクター)

    podSelector

    • ポッドラベルと一致するために使用されるセレクター。このセレクターと一致するポッドは、現在の PodNetworking を使用します。

    • podSelectornamespaceSelector の両方が構成されている場合、両方のセレクターと一致するポッドのみが現在の PodNetworking を使用します。

    • ポッドのラベルが 1 つの PodNetworking ConfigMap の [セレクター] のみに一致することを確認してください。ポッドが複数の PodNetworking ConfigMap と一致する場合、ポッドは任意の PodNetworking ConfigMap のネットワーク構成を使用します。

    namespaceSelector

    • 名前空間ラベルと一致するために使用されるセレクター。このセレクターと一致するポッドは、現在の PodNetworking を使用します。

    • podSelectornamespaceSelector の両方が構成されている場合、両方のセレクターと一致するポッドのみが現在の PodNetworking を使用します。

    • ポッドのラベルが 1 つの PodNetworking ConfigMap の [セレクター] のみに一致することを確認してください。ポッドが複数の PodNetworking ConfigMap と一致する場合、ポッドは任意の PodNetworking ConfigMap のネットワーク構成を使用します。

    vSwitchOptions

    -

    • ポッドが使用する vSwitch を指定します。複数の vSwitch 間の論理関係は OR です。各ポッドは 1 つの vSwitch のみを使用できます。 Terway は、各ポッドに適切な vSwitch を自動的に選択します。

    • ポッドをスケジュールできるゾーンが、vSwitchOptions パラメーターで指定した vSwitch のゾーンと同じになるように制約が追加されます。

    • vSwitchOptions の vSwitch のゾーンが、ポッドのスケジュール先ノードのゾーンと同じであることを確認してください。また、これらの vSwitch が十分なアイドル IP アドレスを提供できることを確認してください。そうでない場合、ACK はポッドの作成に失敗します。

    説明

    ノードの自動スケーリングを有効にしている場合、vSwitchOptions パラメーターを使用して追加されたアベイラビリティーゾーンの制限により、ノードプールがスケールアウトできない場合があります。詳細については、「ノード自動スケーリングに関するよくある質問」をご参照ください。

    vSwitchSelectOptions (使用する vSwitch を決定するポリシー)

    vSwitchSelectionPolicy

    有効な値:

    • ordered: これはデフォルト値です。 vSwitch は入力された順序で使用されます。

    • most: 使用可能な IP アドレスが最も多い vSwitch を優先的に使用します。

    • random: vSwitch はランダムに選択されます。

    説明

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

    securityGroupIDs

    -

    セキュリティグループの ID を指定します。複数のセキュリティグループが同時に有効になります。最大 5 つのセキュリティグループを指定できます。

    eniOptions (ポッドが使用する ENI の種類)

    eniType

    有効な値:

    • Default: これはデフォルトモードです。 Terway 共有 ENI モードで実行されているクラスターでは、Trunk ENI モードが使用されます。 Terway ENI 排他モードで実行されているクラスターでは、排他的 ENI モードが使用されます。

    • ENI: 排他的 ENI モードを使用します。

    • Trunk: Trunk ENI モードを使用します。

    説明

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

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

    PodNetworking が作成されると、Terway はネットワーク構成を自動的に同期します。 PodNetworking は、PodNetworking の statusReady に変更された後にのみ、ポッドに有効になります。

    次のコマンドを実行して、リソースステータスが ready かどうかを確認します。

    kubectl describe PodNetworking example # example を実際のカスタムリソース名に置き換えます。

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

PodNetworking をデプロイした後、名前空間にラベルを追加することで、名前空間が 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: ポッドを作成する

ACK がポッドを作成すると、ポッドのラベルが PodNetworking と照合されます。ポッドが PodNetworking と一致しない場合、デフォルトでは、共有 ENI から IP アドレスがポッドに割り当てられます。ポッドが PodNetworking と一致する場合、PodNetworking で指定された構成に基づいて IP アドレスがポッドに割り当てられます。

Terway は、PodNetworking と一致するポッドに対して、PodENI という名前の CRD を自動的に作成します。 PodENI は、ポッドのリソース使用量を追跡するために使用されます。 PodENI は Terway によって管理されます。ポッドラベルの詳細については、「ラベルとセレクター」をご参照ください。

  1. 次の YAML テンプレートを使用して、my-nginx.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 # ポッドに 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 ConfigMap で指定されたネットワーク構成を使用しているかどうかを確認する方法」をご参照ください。

    kubectl apply -f my-nginx.yaml

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

ACK 専用クラスター のポッドカスタム構成機能を有効にした後、ACK 専用クラスターから ACK マネージド Pro クラスタ にワークロードを直接移行することはできません。移行を開始する前に terway-controlplane を停止し、移行が完了した後に terway-controlplane を有効にする必要があります。

  1. 移行を開始する前に、次の手順を実行します。

    1. 次のコマンドを実行して、terway-controlplane を停止します。

      kubectl scale deploy -nkube-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
  2. 移行が成功したことを確認します。

    説明

    クラスター移行の詳細については、「ACK 専用クラスターから ACK マネージド Pro クラスターへのホットマイグレーション」をご参照ください。

    • 移行に失敗した場合は、次のコマンドを実行して Webhook と terway-controlplane を復元します。

      # Webhook 構成を復元します。
      kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
      # terway-controlplane を復元します。
      kubectl scale deploy -nkube-system terway-controlplane --replicas 1
    • 移行に成功した場合は、次のコマンドを実行して関連リソースを削除します。

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

よくある質問

ポッドが PodNetworking ConfigMap で指定されたネットワーク構成を使用しているかどうかを確認するにはどうすればよいですか。

  1. ポッドが PodNetworking で指定されたネットワーク構成を使用している場合、値が k8s.aliyun.com/pod-networking である annotation が、ポッドの作成後にポッドに追加されます。

    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 は、ポッドで使用されるネットワーク構成を記録するために、ポッドと同じ名前と名前空間を持つ PodENI を自動的に作成します。

    kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # <my-nginx-0> をポッドの名前に置き換えます。 <example> をポッドが配置されている名前空間に置き換えます。

    次の出力は、ポッドが PodNetworking ConfigMap で指定されたネットワーク構成を使用していることを示しています。

    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
    

ポッドの作成後、ポッドが目的の PodNetworking ConfigMap で指定されたネットワーク構成を使用しないのはなぜですか。

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

  2. ポッドラベルが、目的の PodNetworking のラベルのみと一致することを確認します。

  3. PodNetworking が Fixed ポリシーを使用している場合、StatefulSet によって作成されていないポッドは PodNetworking と一致しません。

参考資料