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

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

最終更新日:Oct 31, 2024

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

背景情報

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

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

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

image

制限事項

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

  • Terway Trunk ENI機能を有効にするには、Trunk ENIをサポートするElastic Compute Service (ECS) インスタンスを購入する必要があります。 ECS APIを呼び出してインスタンスタイプを照会した後、EniTrunkSupported=trueパラメーターが返された場合、インスタンスタイプはトランクENIをサポートしています。 ECS APIを呼び出してインスタンスタイプを照会する方法の詳細については、「DescribeInstanceTypes」をご参照ください。

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

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

手順1: クラスターのTerway Trunk ENI機能の有効化

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

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

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

説明

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

重要

トランクENI機能は、新しいクラスターで有効になった後は無効にできません。

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

前提条件

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

説明

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

制限事項

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

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

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

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

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

次のコマンドを実行して、トークン設定を確認します。

kubectl get secret -nkube-syste m addon.net work.token

期待される出力:

名前タイプデータ年齢
addon.netの仕事. token Opaque 1 69m 

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

手順2: terway-eniipを有効にし、クラスターのTerway Trunk ENI機能を有効にする

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

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

  3. On theアドオンページをクリックし、ネットワーキングタブを検索し、terway-eniipコンポーネントを使用します。

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

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

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

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

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

      パラメーター

      説明

      enable_eni_trunking

      true

      トランクENI機能を有効にします。 この機能は、有効化後は無効にできません。

      credential_path

      /var/addon/token-config

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

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

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

      例:

      apiVersion: v1
      データ:
        eni_conf: |
          {
            "min_pool_size": 0、
            "enable_eni_trunking": true、
            "credential_path": "/var/addon/token-config" 、
            ...
          }
      kind: ConfigMap 
    3. 次のコマンドを実行してTerwayポッドを再起動し、変更されたConfigMapを有効にします。

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

    terway-controlplaneをインストールすると、terway-controlplaneカードにinstalledが表示されます。

ステップ2: PodNetworkingの作成

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

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

  2. On theクラスターページで、管理するクラスターの名前をクリックし、ワークロード > カスタムリソース左側のナビゲーションウィンドウに表示されます。

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

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

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: example
    spec:
      allocationType:
        type: Fixed # The policy that describes how IP addresses are allocated to pods. Valid values: Elastic and Fixed. 
        releaseStrategy: TTL # This parameter takes effect only if the PodNetworking uses the Fixed policy. If the PodNetworking uses the Elastic policy, you do not need to configure the releaseStrategy and releaseAfter parameters. 
        releaseAfter: "1h" # This parameter takes effect only if releaseStrategy is set to TTL. 
      selector:
        podSelector:
          matchLabels:
            foo: bar
        namespaceSelector:
          matchLabels:
            foo: bar
      securityGroupIDs:
      - sg-bpxxxx
      vSwitchOptions:
      - vsw-bpxxxx
    status:
      status: Ready               

    下表に、各パラメーターを説明します。

    パラメーター

    説明

    allocationType

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

    type

    有効な値:

    • Elastic: elastic IPアドレス (EIP) をポッドに割り当てます。 ポッドが削除されると、IPアドレスは解放されます。

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

      固定ポリシーを使用するPodNetworkingは、StatefulSetsによって作成されたポッドに対してのみ有効です。 StatefulSetsの詳細については、「Kubernetes StatefulSetのベストプラクティス」をご参照ください。

      説明

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

    releaseStrategy

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

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

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

    releaseAfter

    ポッドのIPアドレスを解放するための遅延。 このパラメーターは、releaseStrategyTTLに設定されている場合にのみ有効です。 値はGo timeタイプでなければなりません。 例: 2h4 5mまたは5m 0s 詳細については、「Go time type」をご参照ください。

    セレクター

    (現在の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です。 各ポッドで使用できるvSwitchは1つだけです。 Terwayは、各ポッドに適切なvSwitchを自動的に選択します。

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

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

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

    vSwitchSelectionPolicy

    有効な値:

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

    • most: 使用可能な最も多くのIPアドレスでvSwitchを優先します。

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

    説明

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

    securityGroupIDs

    -

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

    eniOptions (ポッドで使用されるENIタイプ)

    eniType

    有効な値:

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

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

    • トランク: トランクENIモードを使用します。

    説明

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

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

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

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

    kubectlはPodNetworkingの例を説明します。# 例を実際のカスタムリソース名に置き換えます。

(オプション) 手順1: 名前空間にラベルを追加する

PodNetworkingをデプロイした後、指定した名前空間にラベルを追加して、リソースがPodNetworkingのポリシーと一致するようにする必要があります。

  1. 次のコマンドを実行して、exampleという名前のテスト名前空間を作成します。

    kubectl create ns example
  2. 次のコマンドを実行して、foo=barラベルを名前空間に追加します。

    kubectl label namespaces example foo=bar # Replace example with the actual namespace name.

  3. 次のコマンドを実行して、名前空間のラベルを照会します。

    kubectl get namespace example --show-labels # Replace example with the actual namespace name.

    期待される出力:

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

(オプション) 手順2: ポッドの作成

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

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

  1. 次のyamlテンプレートを使用してmy-nginx. YAMLファイルを作成します。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-nginx # The name of the application. 
      namespace: example # Specify the namespace name as example. 
      labels:
        app: nginx
    spec:
      serviceName: "nginx-service"  
      replicas: 1    
      selector:
        matchLabels:
          app: nginx 
      template:
        metadata:
          labels:
            app: nginx
            foo: bar # Add the foo: bar label to the pod. 
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80  
    
    If the StatefulSet requires persistent storage, you must set the volumeClaimTemplates parameter. 
    # Example:
    #  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を設定します。

      # Back up the webhook configurations. 
      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
      # Delete the webhook configuration. 
      kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
  2. 移行が成功したことを確認します。

    説明

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

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

      # Restore the webhook configuration. 
      kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
      # Restore 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アノテーションがポッドの作成後にポッドに追加されます。

    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を自動的に作成します。 次のメソッドを使用して、PodENIをクエリできます。

    kubectl get podenis.network.alibabacloud.com your-pod-name -n default -oyaml
    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: your-pod-name
      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のステータスが準備完了であることを確認します。

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

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

関連ドキュメント