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

Container Service for Kubernetes:専用EIPをポッドに関連付ける

最終更新日:Dec 17, 2024

ほとんどの場合、KubernetesクラスターのポッドはプライベートIPアドレスを使用します。 ただし、一部のシナリオでは、専用パブリックIPアドレスをポッドに割り当てて、ポッドが他のポッドのトラフィックの影響を受けずに外部ネットワークと個別に通信できるようにすることができます。 Terwayまたはack-extend-network-controllerを使用して、EIP (elastic IP address) をポッドに直接関連付けることができます。 このようにして、ポッドは、専用のデータ出口を介してインターネットと通信することができる。

前提条件

Container Service for Kubernetes (ACK) マネージドクラスターまたはACK専用クラスターが作成されます。 クラスターは、ネットワークプラグインとしてTerwayを使用します。 詳細については、「ACK管理クラスターの作成」および「ACK専用クラスターの作成」をご参照ください。 Terwayの詳細については、「Terwayでの作業」をご参照ください。

重要

11月2023日以降、TerwayはEIP機能の更新を中止しました。 この機能はv1.7.0で削除されました。 ack-extend-network-controllerコンポーネントを使用して、専用EIPをポッドに関連付けることを推奨します。 詳細については、「Terwayからack-extend-network-controllerへのEIPの移行」をご参照ください。

制限事項

EIPを使用する前に、EIPの制限を理解する必要があります。 詳細については、「制限事項」をご参照ください。

課金ルール

Terwayまたはack-extend-network-controllerの有効化に対しては課金されません。 ただし、使用するクラウドリソースに対して料金が請求される場合があります。 ACKで使用されるAlibaba Cloudサービスの課金の詳細については、「Cloud service billing」をご参照ください。

背景情報

ほとんどの場合、SNATとEIPは、ポッドがTerwayモードでインターネットにアクセスできるようにするために使用されます。 インターネットからのトラフィックは、LoadBalancerサービスによってバックエンドポッドに転送されます。 ただし、次のシナリオでは、専用パブリックIPアドレスをポッドに割り当てることができます。

  • ポッドは、ゲームサーバーと音声会議がUDPを使用するシナリオで、ランダムなポートをインターネットに公開します。 例えば、RTSP (Real Time Streaming Protocol) が使用される場合、異なるクライアントに対して異なるポートが使用される。

  • ポッドは、インターネットにアクセスするためにパブリックIPアドレスを求めて他のポッドと競合する必要があります。 この場合、ポッドには専用のパブリックIPアドレスが必要です。

手順1: EIPの関連付けに必要なRAM権限の設定

ack-extend-network-controller

  • ACKマネージドクラスターまたはACK専用クラスターにRAM権限を付与する

    1. カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。

           {
            "Effect": "Allow",
            "Action": [
              "vpc:DescribeVSwitches",
              "vpc:AllocateEipAddress",
              "vpc:AllocateEipAddressPro",
              "vpc:DescribeEipAddresses",
              "vpc:AssociateEipAddress",
              "vpc:UnassociateEipAddress",
              "vpc:ReleaseEipAddress",
              "vpc:AddCommonBandwidthPackageIp",
              "vpc:RemoveCommonBandwidthPackageIp",
              "vpc:TagResources",
              "ecs:DescribeNetworkInterfaces"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    2. クラスターのワーカーRAMロールに権限を付与します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのワーカーRAMロールにカスタムポリシーをアタッチするセクションをご参照ください。

  • にRAM権限を付与するACKサーバーレスクラスタ

    お使いのクラスターがACKサーバーレスクラスターの場合、RAMユーザー用のAccessKeyペアを生成する必要があります。 詳細については、「RAMユーザーの作成」および「カスタムポリシーの作成」をご参照ください。

Terway

Terwayには、EIPを申請して関連付けるためのEIP管理権限が必要です。 したがって、カスタムポリシーはEIPに関連する権限も提供します。

  • 6月2020日以降に作成されたACKマネージドクラスターまたはACK BasicクラスターにRAM権限を付与します。

    1. カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。

           {
            "Effect": "Allow",
            "Action": [
              "vpc:DescribeVSwitches",
              "vpc:AllocateEipAddress",
              "vpc:DescribeEipAddresses",
              "vpc:AssociateEipAddress",
              "vpc:UnassociateEipAddress",
              "vpc:ReleaseEipAddress",
              "vpc:AddCommonBandwidthPackageIp",
              "vpc:RemoveCommonBandwidthPackageIp"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    2. クラスターのワーカーRAMロールに権限を付与します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ2: カスタムポリシーをワーカーRAMロールにアタッチするセクションをご参照ください。

  • 6月2020日より前に作成されたACK専用クラスターまたはACK管理クラスターにRAM権限を付与します。

    1. カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。

           {
            "Effect": "Allow",
            "Action": [
              "vpc:DescribeVSwitches",
              "vpc:AllocateEipAddress",
              "vpc:DescribeEipAddresses",
              "vpc:AssociateEipAddress",
              "vpc:UnassociateEipAddress",
              "vpc:ReleaseEipAddress",
              "vpc:AddCommonBandwidthPackageIp",
              "vpc:RemoveCommonBandwidthPackageIp"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    2. AliyunCSManagedNetworkRoleページの [権限] タブで、[権限の付与] をクリックします。 [権限付与] パネルで、[ポリシー] をクリックし、前の手順で作成したカスタムポリシーを選択します。

    3. [権限付与] をクリックします。

    4. 閉じるをクリックします。

手順2: プラグインのインストールまたは更新

警告

ack-extend-network-controllerとTerwayを使用してEIPをポッドに同時に関連付けることはできません。 そうでない場合、EIPが複数のポッドに関連付けられる可能性があり、EIPアソシエーション障害が発生します。 ack-extend-network-controllerの使用を推奨します。

Terwayとack-extend-network-controllerの比較

機能

ack-extend-network-controller

Terway

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

  • ACK管理クラスター

  • ACK専用クラスター

  • ACKサーバーレスクラスタ

  • ACK管理クラスター

  • ACK専用クラスター

静的EIP

対応

非対応

フェーズ

ack-extend-network-controllerは、ポッドのIPアドレス割り当てフェーズ中にEIPをポッドに関連付けます。

プラグインが設定を適用すると、TerwayプラグインはEIPをポッドに関連付けます。

サポートされているバージョン

v0.2.0以降

v1.0.10.280-v1.7.0より前のgdc2cb6c-aliyunまたはそれ以降のバージョン

プラグインのインストールまたは更新

クラスターでack-extend-network-controllerを使用している場合は、ACKコンソールの [Marketplace] ページに移動し、ack-extend-network-controllerをインストールしてから、EIP controllerを有効にします。 クラスターがTerwayを使用している場合は、Terwayをv1.0.10.280-gdc2cb6c-aliyun以降に更新します。

ack-extend-network-controllerのインストール

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  2. Marketplaceページで、ack-extend-network-controllerを検索し、プラグインをクリックします。

  3. グラフの詳細ページの右上隅にある [デプロイ] をクリックします。 展開パネルが表示されます。

  4. [基本情報] ステップで、クラスターと名前空間を選択し、[次へ] をクリックします。

    1. [パラメーター] ステップで、バージョンを選択してパラメーターを設定し、[OK] をクリックします。

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

      パラメーター

      必須 / 任意

      説明

      clusterID

      String

      はい

      クラスターの ID。

      regionID

      String

      はい

      クラスターがデプロイされているリージョンのID。

      enableControllers

      [] 文字列

      はい

      使用するコントローラ。 eipを指定してEIP機能を有効にします。

      networkController.vpcid

      String

      はい

      クラスターがデプロイされている仮想プライベートクラウド (VPC) のID。

      networkController.eipController.maxConcurrentReconciles

      int

      不可

      同時EIPコントローラーの数。

      networkController.eipController.garbageCollectionPeriodInMinutes

      int

      不可

      EIPコントローラが静的EIPをクリアする間隔。

      customStatefulWorkloadKinds

      [] 文字列

      不可

      カスタムステートフルコントローラーのタイプ。

      enableVirtualNode

      bool

      不可

      仮想ノードでElastic Container Instanceベースのポッドをサポートするかどうかを指定します。

      重要

      このパラメーターをtrueに設定すると、コントローラーはEIPをelasticコンテナーインスタンスで実行されているポッドに割り当てます。 設定するポッドのアノテーションは、Elastic Container InstanceでサポートされているEIP機能を複製しないでください。 このパラメータは慎重に使用してください。

      enableRRSA

      bool

      不可

      サービスアカウントのRAMロール (RRSA) による認証をサポートするかどうかを指定します。

      説明

      このパラメーターは、ack-extend-network-controller v0.10.0以降でサポートされています。

      RRSAの設定では、ack-pod-identity-webhookの注入方法のみがサポートされています。 kube-system名前空間に対応するラベルを設定する必要があります。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。

      rrsaRoleName

      String

      不可

      RRSAロールの名前。

      説明

      このパラメーターは、ack-extend-network-controller v0.10.0以降でサポートされています。

      credential.accessKey

      String

      不可

      EIPを関連付けるために使用されるアカウントのAccessKey ID。

      手順1でクラスターのワーカーRAMロールに権限を付与する場合は、このパラメーターを設定する必要はありません。

      重要

      このパラメータは、Kubernetes Secretに機密情報を格納します。 このパラメーターは使用しないことを推奨します。

      credential.accessSecret

      String

      不可

      EIPを関連付けるために使用されるアカウントのAccessKeyシークレット。

      手順1でクラスターのワーカーRAMロールに権限を付与する場合は、このパラメーターを設定する必要はありません。

      重要

      このパラメータは、Kubernetes Secretに機密情報を格納します。 このパラメーターは使用しないことを推奨します。

      サンプルコード:

      clusterID: "c11ba338192xxxxxxx"  
      regionID: "cn-hangzhou"      
      vpcID: "vpc-bp1rkq0zxxxxxx" 
      enableControllers:
        - eip              
      
      networkController:
        eipController:
          maxConcurrentReconciles: 1   
          garbageCollectionPeriodInMinutes: 1  
        customStatefulWorkloadKinds:           
        - foo
      
      credential:                             
        accessKey: ""
        accessSecret: ""

ack-extend-network-controllerのバージョンとパラメーターを更新する方法の詳細については、「App Marketplace」をご参照ください。

Terwayを更新する

クラスターがTerwayを使用している場合は、Terwayプラグイン (terway-eniまたはterway-eniip) をEIP機能をサポートするバージョンに更新します。 Terwayの更新方法の詳細については、「コンポーネントの管理」をご参照ください。

説明

Terwayはv1.0.10.280に更新する必要があります-v1.7.0より前のgdc2cb6c-aliyunまたはそれ以降のバージョン。 Terwayの詳細については、「Terway」をご参照ください。

ステップ3: EIP機能を有効にする

EIP機能を有効にするための注釈

ACKを使用すると、アノテーションを使用してEIP機能を有効にできます。 自動EIP割り当て機能を使用するか、静的EIPをポッドに手動で関連付けることができます。

EIPをポッドに自動的に関連付ける

重要

自動EIP割り当て機能を使用すると、システムは繰り返しEIPの申請とリリースを行うことがあります。 たとえば、この問題は、ポッドが再作成された場合、またはContainer Network Interface (CNI) プラグインがネットワークの構成に失敗した場合に発生します。 この問題を防ぐには、EIPのIDを指定してEIPを手動でポッドに関連付けることができます。

ポッドの注釈

network.alibabacloud.com/pod-with-eip

k8s.aliyun.com/pod-with-eip

EIPを自動的に作成し、EIPをポッドに関連付けるかどうかを指定します。 有効な値:

  • true: EIPを自動的に作成し、EIPをポッドに関連付けます。

  • false: EIPを自動的に作成したり、EIPをポッドに関連付けたりすることはありません。

k8s.aliyun.com/eci-with-eip (互换)

network.alibabacloud.com/eip-bandwidth

k8s.aliyun.com/eip-bandwidth

EIPの最大帯域幅。 単位:Mbit/s 詳細については、「EIPの申請」をご参照ください。

network.alibabacloud.com/eip-internet-charge-type

k8s.aliyun.com/eip-internet-charge-type

EIPの計量方法。 有効な値:

  • PayByTraffic: 料金はデータ転送に基づいて課金されます。

  • PayByBandwidth: 料金は帯域幅の使用量に基づいて課金されます。

詳細については、「EIPの申請」をご参照ください。

説明
  • デフォルト値:PayByTraffic。

k8s.aliyun.com/eip-charge-type (互换)

network.alibabacloud.com/eip-instance-charge-type

k8s.aliyun.com/eip-instance-charge-type

EIP の課金方法。 有効な値:

  • PrePaid: サブスクリプション。

  • PostPaid: 従量課金。

詳細については、「EIPの申請」をご参照ください。

説明

ack-extend-network-controllerのみがこのアノテーションをサポートしています。

network.alibabacloud.com/eip-common-bandwidth-package-id

k8s.aliyun.com/eip-common-bandwidth-package-id

使用するインターネット共有帯域幅インスタンス。

説明

このアノテーションを使用するには、Terwayをv1.2.3以降に更新します。 このアノテーションは、任意のバージョンのack-extend-network-controllerプラグインで使用できます。

network.alibabacloud.com/eip-isp

k8s.aliyun.com/eip-isp

EIPのラインタイプ。 有効な値:

  • BGP: BGP (マルチISP) ライン。

  • BGP_PRO: BGP (マルチISP) プロライン。

詳細については、「EIPの申請」をご参照ください。

説明

このアノテーションを使用するには、Terwayをv1.2.3以降に更新します。 このアノテーションは、任意のバージョンのack-extend-network-controllerプラグインで使用できます。

network.alibabacloud.com/eip-public-ip-address-pool-id

k8s.aliyun.com/eip-public-ip-address-pool-id

IPアドレスプール。 詳細については、「IPアドレスプールの作成と管理」をご参照ください。

説明

ack-extend-network-controllerのみがこのアノテーションをサポートしています。

network.alibabacloud.com/eip-resource-group-id

k8s.aliyun.com/eip-resource-group-id

EIPが属するリソースグループ。 詳細については、「EIPの申請」をご参照ください。

説明

ack-extend-network-controller v0.4.0以降のみがこのアノテーションをサポートしています。

network.alibabacloud.com/eip-name

k8s.aliyun.com/eip-name

EIP の名前。 詳細については、「EIPの申請」をご参照ください。

説明

ack-extend-network-controller v0.6.0以降のみがこのアノテーションをサポートしています。

network.alibabacloud.com/eip-description

k8s.aliyun.com/eip-description

EIPの説明。 詳細については、「EIPの申請」をご参照ください。

説明

ack-extend-network-controller v0.6.0以降のみがこのアノテーションをサポートしています。

network.alibabacloud.com/eip-security-protection-types

k8s.aliyun.com/eip-security-protection-types

EIPのAnti-DDoSタイプ。 Anti-DDoS-(Enhanced) がサポートされています。 複数の型はコンマで区切ります (,) 。 詳細については、「EIPの申請」をご参照ください。

説明

ack-extend-network-controller v0.9.0以降のみがこのアノテーションをサポートしています。

EIPのIDを指定する

EIPのIDを指定することで、既存のEIPをポッドに関連付けることができます。 ポッドの注釈は、EIPの設定を変更しません。 アノテーションは、EIPを指定されたポッドにのみ関連付けます。

重要

この機能は、複数のレプリケートされたポッドを管理するコントローラーには適用できません。 EIPが1つのポッドでのみ使用されていることを確認します。 この機能はStatefulSetsでのみ使用することを推奨します。

ポッドの注釈

network.alibabacloud.com/pod-eip-instanceid

k8s.aliyun.com/pod-eip-instanceid

EIPのID (eip-bp14qxxxxxxxなど) 。

重要

PodEIPリソースとは異なる名前を使用するポッドにEIPを関連付けないでください。 EIPコントローラーは、ポッドの終了時にEIPをポッドから分離します。 関連付け解除プロセス中は、他のポッドでEIPを使用しないでください。 ポッドと同じ名前を使用するPodEIPリソースが存在するかどうかを確認することで、EIPがポッドとの関連付けが解除されているかどうかを確認できます。

k8s.aliyun.com/eci-eip-instanceid (互换)

EIPリリースポリシーを設定するための注釈

静的EIPを使用するようにポッドを構成した場合、ポッドの再作成後もポッドは同じEIPを使用します。 このメソッドを自動EIP割り当て機能とともに使用して、静的EIPをStatefulSetsのポッドに関連付けることができます。

重要
  • ack-extend-network-controllerのみがこの機能を提供し、ステートフルなポッドコントローラーを使用する必要があります。

  • EIPはIDで指定できます。 指定されたEIPはリリースされません。

ポッド注釈

network.alibabacloud.com/pod-eip-release-strategy

k8s.aliyun.com/pod-eip-release-strategy

EIPリリースポリシー。 有効な値:

  • Follow: EIPに関連付けられているポッドのライフサイクルに従います。 デフォルト値です。

  • Never: EIPをリリースしません。 EIPが不要になった場合は、ポッドに関連付けられているEIPを手動でリリースする必要があります。

EIPの有効期限を直接設定できます。 たとえば、EIPの有効期限を5m30sに設定した場合、ポッドに関連付けられているEIPは、ポッドが削除されてから5.5分後にリリースされます。 Goで記述された時間式がサポートされています。

EIP機能の有効化

ack-extend-network-controllerを使用するクラスターでEIP機能を有効にする

説明

ack-extend-network-controllerは、リソースを作成するためにOpenAPI Explorerにアクセスする必要があります。 まず、RAMコンソールでクラスターのワーカーロールに必要な権限を付与する必要があります。 次に、ackコンソールのMarketplaceページにACK-extend-network-controllerをインストールし、注釈を追加してEIPを作成し、指定したポッドに関連付けます。

注釈を追加してEIPを作成し、指定したポッドに関連付けます。

ポッドの構成にアノテーションを追加して、EIPを作成したり、ポッドに関連付けたりすることができます。 注釈の詳細については、このトピックのFAQセクションを参照してください。

  1. アプリケーションを作成します。 次に、EIPを作成し、指定したポッドに関連付けます。

    デプロイメント

    次のサンプルコードに基づいてデプロイを作成します。 デプロイは各ポッドにEIPを割り当てます。 各EIPの帯域幅は5 Mbit/sです。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example
      labels:
        app: example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            k8s.aliyun.com/pod-with-eip: "true"
            k8s.aliyun.com/eip-bandwidth: "5"
        spec:
          readinessGates:
          - conditionType: "k8s.aliyun.com/eip"
          containers:
          - name: example
            image: nginx

    ポッドが作成されたら、次のコマンドを実行してpodeips.alibabacloud.comEIP割り当て情報を追跡するためにポッドと同じ名前を使用するリソース。

    kubectl get podeip -n <namespace> <podname>  -o yaml

    期待される結果

    apiVersion: alibabacloud.com/v1beta1
    kind: PodEIP
    metadata:
      creationTimestamp: "2023-12-15T04:25:37Z"
      finalizers:
      - podeip-controller.alibabacloud.com/finalizer
      generation: 1
      name: example-xxx
      namespace: default
      resourceVersion: "222800"
      uid: 43xxx-f1xx-4xxx-b3xx-969faxxx
    spec:
      allocationID: eip-2ze2qe8zsxxx
      allocationType:
        releaseStrategy: Follow
        type: Auto
    status:
      eipAddress: 39.102.XX.XX
      internetChargeType: PayByTraffic
      isp: BGP
      networkInterfaceID: eni-2zeagv8f3xxxx
      podLastSeen: "2023-12-15T05:18:47Z"
      privateIPAddress: 192.168.XX.XX
      resourceGroupID: rg-acfmwxxxxxsq
      status: InUse

    StatefulSets

    次のサンプルコードに基づいてStatefulSetを作成します。 StatefulSetは2つのポッドを作成し、各ポッドにEIPを割り当てます。 EIPは、ポッドが削除されてから10分後に自動的にリリースされます。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: example
      labels:
        app: example
    spec:
      serviceName: "example"
      replicas: 2
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            k8s.aliyun.com/pod-with-eip: "true"
            k8s.aliyun.com/pod-eip-release-strategy: "10m"
        spec:
          containers:
          - name: example
            image: nginx

    ポッドが作成されたら、次のコマンドを実行してpodeips.alibabacloud.comEIP割り当て情報を追跡するためにポッドと同じ名前を使用するリソース。

    kubectl get podeip -n <namespace> -o yaml

    期待される結果

    apiVersion: v1
    items:
    - apiVersion: alibabacloud.com/v1beta1
      kind: PodEIP
      metadata:
        creationTimestamp: "2023-12-15T03:28:01Z"
        finalizers
        - podeip-controller.alibabacloud.com/finalizer
        generation: 1
        name: example-0
        namespace: default
        resourceVersion: "227221"
        uid: 79954xx-17xx-4dxx-b7xx-15b84xxx
      spec:
        allocationID: eip-2ze08metxxx
        allocationType:
          releaseAfter: 10m
          releaseStrategy: TTL
          type: Auto
      status:
        eipAddress: 39.105.XX.XX
        internetChargeType: PayByTraffic
        isp: BGP
        networkInterfaceID: eni-2ze4tkg4xxx
        podLastSeen: "2023-12-15T05:31:34Z"
        privateIPAddress: 192.168.XX.XX
        resourceGroupID: rg-acfmwxxx
        status: InUse
    - apiVersion: alibabacloud.com/v1beta1
      kind: PodEIP
      metadata:
        creationTimestamp: "2023-12-15T03:28:03Z"
        finalizers:
        - podeip-controller.alibabacloud.com/finalizer
        generation: 1
        name: example-1
        namespace: default
        resourceVersion: "227222"
        uid: 1339xxxe7-97xx-46xx-9bxx-537690xxx
      spec:
        allocationID: eip-2zetwhffqxxx
        allocationType:
          releaseAfter: 10m
          releaseStrategy: TTL
          type: Auto
      status:
        eipAddress: 39.105.XX.XX
        internetChargeType: PayByTraffic
        isp: BGP
        networkInterfaceID: eni-2zeagv8f3wxxx
        podLastSeen: "2023-12-15T05:31:34Z"
        privateIPAddress: 192.168.XX.XX
        resourceGroupID: rg-acfmwqnwxxx
        status: InUse
    - apiVersion: alibabacloud.com/v1beta1
      kind: PodEIP
      metadata:
        creationTimestamp: "2023-12-15T04:25:37Z"
        finalizers:
        - podeip-controller.alibabacloud.com/finalizer
        generation: 1
        name: example-5bxxx-9xx
        namespace: default
        resourceVersion: "227220"
        uid: 43cdfxxx-f1xx-42xx-b3xx-969fxxx
      spec:
        allocationID: eip-2ze2qe8zsmnxxx
        allocationType:
          releaseStrategy: Follow
          type: Auto
      status:
        eipAddress: 39.102.XX.XX
        internetChargeType: PayByTraffic
        isp: BGP
        networkInterfaceID: eni-2zeagv8f3wxxx
        podLastSeen: "2023-12-15T05:31:34Z"
        privateIPAddress: 192.168.XX.XX
        publicIpAddressPoolID: pippool-2ze498cxxx
        resourceGroupID: rg-acfmwqnxxx
        status: InUse
    kind: List
    metadata:
      resourceVersion: ""

    StatefulSetのポッドが削除されると、EIPは10分間保持され、その後解放されます。 この期間中に同じ名前のポッドを作成した場合、ポッドは同じEIPを使用します。

  2. 設定を確認します。

    ポッドのステータスが [実行中] に変わった後、ポッドのk8s.aliyun.com/allocated-eipAddressアノテーションの値を確認して、ポッドで使用されているEIPを識別できます。 次に、EIPを使用してポッドにアクセスできます。

    image.png

Terwayを使用するクラスターでEIP機能を有効にする

  1. Terwayを設定してEIPをサポートします。

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

      kubectl edit cm eni-config -n kube-system
    2. 次のコンテンツをeni_conf ConfigMapに追加します。

      "enable_eip_pool": "true"
      説明

      別のEIPを関連付ける前に既存のEIPの関連付けを解除する場合は、eni_conf ConfigMapに "allow_eip_rob": "true" を追加します。

    3. ConfigMapを変更したら、Escキーを押します。 次に、入力します。: wq! Enterキーを押して変更したファイルを保存し、編集モードを終了します。

    4. 次のコマンドを実行してTerwayを再デプロイします。

      kubectl delete pod -n kube-system -l app=terway-eniip # If the terway-eni plug-in is installed, replace terway-eniip with terway-eni.

  2. EIPを作成してポッドに関連付けるアノテーションを追加します。

    ポッドの構成にアノテーションを追加して、EIPを作成したり、ポッドに関連付けたりすることができます。 EIPの制限の詳細については、「制限」をご参照ください。

    シナリオに基づいて注釈を追加します。

  3. EIPを自動的に作成してポッドに関連付ける

    次のアノテーションを追加して、EIPを自動的に作成してポッドに関連付け、EIPの最大帯域幅を指定します。

    • k8s.aliyun.com/pod-with-eip: "true": EIPのID。

    • k8s.aliyun.com/eip-bandwidth: "5": EIPの最大帯域幅。 デフォルト値は5 Mbit/sで、EIPサービスで定義されているデフォルト値と同じです。

    次のサンプルYAMLテンプレートに例を示します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          annotations:
            network.alibabacloud.com/pod-with-eip: "true" # Specifies that an EIP is automatically created and associated with each NGINX pod. 
            network.alibabacloud.com/eip-bandwidth: "5" # Specifies the maximum bandwidth of the EIP. The default value is 5 Mbit/s, which equals the default value defined in the EIP service. 
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx

    既存のEIPの指定

    重要
    • EIPを複数のポッドに関連付けることはできません。 したがって、このアノテーションは、DeploymentsまたはStatefulSetsによって作成されたポッドには使用できません。

    • デフォルトでは、EIPがすでにポッドに関連付けられている場合、そのポッドに新しいEIPを作成することはできません。 既存のEIPの関連付けを解除して別のEIPを作成する場合は、前述の手順で説明したように、"allow_eip_rob": "true" 設定をeni_conf ConfigMapに追加します。

    • アプリケーションが1つのレプリケートポッドで実行される場合にのみ、既存のEIPを指定できます。 たとえば、デプロイメントを作成するときは、既存のEIPを関連付けることができるように、レプリカの値が1であることを確認します。

    次のアノテーションを追加して、既存のEIPのIDを指定し、EIPをポッドに関連付けます。

    k8s.aliyun.com/pod-eip-instanceid: "<youreipInstanceId>"
  4. 設定を確認します。

    ポッドが [実行中] 状態になった後、ポッドのnetwork.alibabacloud.com/allocated-eipAddressアノテーションの値を確認して、ポッドで使用されているEIPを識別できます。 次に、EIPを使用してポッドにアクセスできます。

トラブルシューティング

ポッドのステータスが準備完了に変わるのはなぜですか?

コントローラがEIPをポッドに割り当てた後、ポッドがEIPに関連付けられる前に、ポッドのステータスがReadyに変更される場合があります。 次のいずれかの方法を使用して、ポッドのステータスが準備完了に変わるタイミングを制御できます。

ポッドの準備ゲートの設定

説明

ack-extend-network-controllerのみがポッド準備ゲートをサポートしています。

ポッドの準備ゲートを構成した後、コントローラはEIPがポッドに関連付けられた後にのみポッド条件を設定します。 ポッドがEIPに関連付けられる前に、ポッドのステータスが準備完了に変更されることはありません。

kind: Pod
...
spec:
  readinessGates:
  - conditionType: "k8s.aliyun.com/eip"
status:
  conditions:
  - lastProbeTime: "2022-12-12T03:45:48Z"
    lastTransitionTime: "2022-12-12T03:45:48Z"
    reason: Associate eip succeed
    status: "True"
    type: k8s.aliyun.com/eip
...

ポッドのinitコンテナの設定

ポッドにinitコンテナを設定し、initコンテナを使用して、ポッドがEIPに関連付けられているかどうかを確認できます。 次のサンプルコードは、initコンテナを設定する方法を示しています。

apiVersion: v1
kind: Pod
metadata:
  name: example
  annotations:
    network.alibabacloud.com/pod-with-eip: "true"
spec:
  containers:
  - name: example
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init
    image: busybox:1.28
    command: ['timeout', '-t' ,'60', 'sh','-c', "until grep -E '^k8s.aliyun.com\\/allocated-eipAddress=\\S?[0-9]+\\S?' /etc/podinfo/annotations; do echo waiting for annotations; sleep 2; done"]
    volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations