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

Container Service for Kubernetes:Pod に独立した EIP をアタッチする

最終更新日:Nov 09, 2025

Kubernetes クラスターでは、Pod には通常、プライベート IP アドレスが割り当てられます。ただし、一部のシナリオでは、Pod に独立したパブリック IP アドレスを持たせる必要があります。これにより、Pod は他の Pod のトラフィックの影響を受けることなく、外部ネットワークと通信できます。Alibaba Cloud の Terway および ack-extend-network-controller コンポーネントはどちらも、特定の Pod と Elastic IP Address (EIP) の関連付けをサポートしています。これにより、Pod に独立したパブリックアウトバウンドが提供されます。

前提条件

Terway ネットワークプラグインを使用する ACK マネージドクラスターまたは ACK 専用クラスターを作成する必要があります。詳細については、「ACK マネージドクラスターの作成」および「ACK 専用クラスターの作成 (作成不可)」をご参照ください。Terway ネットワークモードの詳細については、「Terway ネットワークプラグインの使用」をご参照ください。

重要

2023 年 11 月以降、Terway は EIP 機能の更新を提供しなくなりました。この機能は v1.7.0 で正式に削除されます。ack-extend-network-controller コンポーネントを使用して、独立したパブリック EIP を Pod にアタッチすることを推奨します。詳細については、「EIP 機能を Terway から ack-extend-network-controller に移行する」をご参照ください。

制限事項

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

  • この機能は ECS ノードでのみサポートされています。

課金

Terway および ack-extend-network-controller プラグインを有効にしても、追加料金は発生しません。ただし、使用するクラウドリソースに対して課金される場合があります。ACK クラウドリソースの課金の詳細については、「クラウドリソース料金」をご参照ください。

背景情報

Terway ネットワークでは、Pod からインターネットへのトラフィックは通常、ホストのソースネットワークアドレス変換 (SNAT) または EIP を介した外部 SNAT を使用してルーティングされます。Pod へのインバウンドインターネットトラフィックは、通常、LoadBalancer サービスを介して流れます。ただし、一部のシナリオでは、Pod に独立したパブリック IP アドレスを持たせる必要があります。例:

  • Pod にマッピングされるポートはランダムです。これは、ユーザーデータグラムプロトコル (UDP) ゲームサーバーや電話会議で一般的です。たとえば、リアルタイムストリーミングプロトコル (RTSP) は、クライアントごとに異なるポートを使用します。

  • Pod はインターネットトラフィックを競合し、特定の Pod には独立したパブリックアウトバウンドが必要です。

ステップ 1: EIP をアタッチするための RAM 権限の設定

ack-extend-network-controller (推奨)

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

    1. 次の内容でカスタムポリシーを作成します。詳細については、「ステップ 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. クラスターの Worker RAM ロールに権限を付与します。詳細については、「ステップ 2: クラスターの Worker RAM ロールに権限を付与する」をご参照ください。

Terway

Terway は、Pod の EIP をリクエストおよび設定するために EIP 関連の権限を必要とします。追加の権限を設定する必要があります。

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

    1. 次の内容でカスタムポリシーを作成します。詳細については、「ステップ 1: カスタムポリシーの作成」をご参照ください。

          {
            "Effect": "Allow",
            "Action": [
              "vpc:DescribeVSwitches",
              "vpc:AllocateEipAddress",
              "vpc:DescribeEipAddresses",
              "vpc:AssociateEipAddress",
              "vpc:UnassociateEipAddress",
              "vpc:ReleaseEipAddress",
              "vpc:AddCommonBandwidthPackageIp",
              "vpc:RemoveCommonBandwidthPackageIp"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    2. クラスターの Worker RAM ロールに権限を付与します。詳細については、「ステップ 2: クラスターの Worker RAM ロールに権限を付与する」をご参照ください。

  • 2020 年 6 月より前に作成されたACK 専用クラスターまたはACK マネージドクラスターに RAM 権限を付与する

    1. 次の内容でカスタムポリシーを作成します。詳細については、「ステップ 1: カスタムポリシーの作成」をご参照ください。

          {
            "Effect": "Allow",
            "Action": [
              "vpc:DescribeVSwitches",
              "vpc:AllocateEipAddress",
              "vpc:DescribeEipAddresses",
              "vpc:AssociateEipAddress",
              "vpc:UnassociateEipAddress",
              "vpc:ReleaseEipAddress",
              "vpc:AddCommonBandwidthPackageIp",
              "vpc:RemoveCommonBandwidthPackageIp"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    2. AliyunCSManagedNetworkRole RAM ロールページで、[権限] タブに移動し、[権限の追加] をクリックします。次に、[カスタムポリシー] をクリックし、前のステップで作成したカスタムポリシーを選択して、[OK] をクリックします。

ステップ 2: クラスターのプラグインをインストールまたはアップグレードする

警告

ack-extend-network-controller と Terway の両方の EIP 設定機能を同時に有効にしないでください。これにより、EIP リソースが繰り返し割り当てられ、EIP のバインドに失敗する可能性があります。ack-extend-network-controller プラグインを使用することを推奨します。

プラグインの比較

項目

ack-extend-network-controller

Terway

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

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

  • ACK 専用クラスター

  • Serverless Kubernetes クラスター

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

  • ACK 専用クラスター

固定 EIP

サポートされています

サポートされていません

設定フェーズ

Pod の IP アドレスが割り当てられた後、コントローラーは EIP を割り当てて Pod にアタッチします。

EIP は CNI の実行プロセス中に割り当てられ、アタッチされます。

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

v0.2.0 以降

v1.0.10.280-gdc2cb6c-aliyun 以降、v1.7.0 未満

プラグインのインストールまたはアップグレード

ack-extend-network-controller プラグインを使用する場合は、ACK App Marketplace からインストールし、EIP コントローラーを有効にします。Terway ネットワークプラグインを使用する場合は、Terway をバージョン v1.0.10.280-gdc2cb6c-aliyun 以降にアップグレードします。

ack-extend-network-controller のインストール (推奨)

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

  2. [アプリケーションマーケットプレイス] ページで、検索ボックスに ack-extend-network-controller と入力し、アプリケーションをクリックします。

  3. アプリケーションの詳細ページで、右上隅にある [デプロイ] をクリックします。

  4. [作成] パネルで、クラスターと名前空間を選択し、[次へ] をクリックします。

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

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

      パラメーター

      タイプ

      必須

      説明

      clusterID

      string

      はい

      クラスター ID。

      regionID

      string

      はい

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

      enableControllers

      []string

      はい

      このパラメーターを eip に設定して、EIP 機能を有効にします。

      networkController.vpcid

      string

      はい

      クラスターの VPC ID。

      networkController.eipController.maxConcurrentReconciles

      int

      いいえ

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

      networkController.eipController.garbageCollectionPeriodInMinutes

      int

      いいえ

      EIP コントローラーが固定 EIP をクリーンアップする期間。

      customStatefulWorkloadKinds

      []string

      いいえ

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

      enableVirtualNode

      bool

      いいえ

      ECI 仮想ノードをサポートするかどうかを指定します。

      重要

      このパラメーターを有効にすると、コントローラーは ECI インスタンスの Pod に EIP を割り当てます。設定する Pod アノテーションは、ECI でサポートされている EIP 機能と同じにすることはできません。このパラメーターは注意して使用してください。

      enableRRSA

      bool

      いいえ

      RRSA を使用してリクエストを認証します。

      説明

      ack-extend-network-controller v0.10.0 以降でサポートされています。

      RRSA の設定には、ack-pod-identity-webhook インジェクションメソッドのみがサポートされています。kube-system 名前空間に対応するラベルを設定します。設定の詳細については、「RRSA に基づいて Pod の権限を分離する」をご参照ください。

      rrsaRoleName

      string

      いいえ

      ロール名。

      説明

      ack-extend-network-controller v0.10.0 以降でサポートされています。

      credential.accessKey

      string

      いいえ

      EIP をアタッチする権限を持つアカウントの AccessKey ID。

      ステップ 1: EIP をアタッチするための RAM 権限の設定 を完了している場合は、このパラメーターを設定する必要はありません。

      重要

      この設定は、機密情報を Kubernetes Secret に保存します。この方法は推奨されません。

      credential.accessSecret

      string

      いいえ

      EIP をアタッチする権限を持つアカウントの AccessKey Secret。

      ステップ 1: EIP をアタッチするための RAM 権限の設定 を完了している場合は、このパラメーターを設定する必要はありません。

      重要

      この設定は、機密情報を Kubernetes Secret に保存します。この方法は推奨されません。

      kubeClientQPS

      float32

      いいえ

      コンポーネントがクラスターの API サーバーにアクセスするための 1 秒あたりのクエリ数 (QPS) の制限。

      説明

      ack-extend-network-controller v0.12.2 以降でサポートされています。

      kubeClientBurst

      int

      いいえ

      コンポーネントがクラスターの API サーバーにアクセスするためのバースト リクエストの最大数。

      説明

      ack-extend-network-controller v0.12.2 以降でサポートされています。

      次のコードは、サンプル設定を示しています。

      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 プラグインのバージョンとパラメーターを更新するには、「Helm チャートの変更」をご参照ください。

Terway のアップグレード

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

説明

Terway プラグインのバージョンは v1.0.10.280-gdc2cb6c-aliyun 以降、v1.7.0 未満である必要があります。Terway プラグインのバージョンの詳細については、「Terway」をご参照ください。

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

EIP を有効にするためのアノテーションの概要

ACK では、アノテーションを使用して EIP 機能を有効にできます。要件に基づいて、EIP を自動的に割り当てるか、固定 EIP を Pod に割り当てるかを選択できます。

EIP の自動割り当て

重要

自動 EIP 割り当て機能を使用すると、Pod が再構築されたり、コンテナーネットワークインターフェイス (CNI) の実行が失敗した場合に、EIP リソースが繰り返し要求および解放される可能性があります。この問題を回避するには、EIP インスタンスを指定できます。

Pod アノテーション

network.alibabacloud.com/pod-with-eip

k8s.aliyun.com/pod-with-eip

EIP を自動的に作成してアタッチするかどうかを指定します。有効な値:

  • true: EIP を自動的に作成してアタッチします。

  • false: EIP を自動的に作成してアタッチしません。

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

network.alibabacloud.com/eip-bandwidth

k8s.aliyun.com/eip-bandwidth

EIP の作成時にのみサポートされます。

EIP のピーク帯域幅。単位: Mbit/s。詳細については、「EIP のリクエスト」をご参照ください。

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

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

EIP の作成時にのみサポートされます。

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

  • PayByTraffic (デフォルト): トラフィック課金。

  • PayByBandwidth: 帯域幅課金。

詳細については、「EIP のリクエスト」をご参照ください。

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

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

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

EIP の作成時にのみサポートされます。

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

  • PostPaid: 従量課金。

詳細については、「EIP のリクエスト」をご参照ください。

説明

ack-extend-network-controller でのみサポートされています。

PrePaid サブスクリプション設定はサポートされていません。

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 の作成時にのみサポートされます。

EIP の回線タイプ。有効な値:

  • BGP: BGP (マルチ ISP)。

  • BGP_PRO: BGP (マルチ ISP) Pro。

  • 単一回線帯域幅ホワイトリストユーザーの場合は、次のいずれかのタイプも選択できます。

    • ChinaTelecom: China Telecom

    • ChinaUnicom: China Unicom

    • ChinaMobile: China Mobile

    • ChinaTelecom_L2: China Telecom L2

    • ChinaUnicom_L2: China Unicom L2

    • ChinaMobile_L2: China Mobile L2

  • 杭州金融クラウドユーザーの場合は、値を BGP_FinanceCloud に設定します。

詳細については、「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

EIP の作成時にのみサポートされます。

EIP アドレスプール。EIP アドレスプールの使用に関する制限と手順の詳細については、「IP アドレスプールの作成と管理」をご参照ください。

説明

ack-extend-network-controller でのみサポートされています。

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

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

EIP の作成時にのみサポートされます。

EIP リソースグループ。詳細については、「EIP のリクエスト」をご参照ください。

説明

ack-extend-network-controller v0.4.0 以降でのみサポートされています。

network.alibabacloud.com/eip-name

k8s.aliyun.com/eip-name

EIP の作成時にのみサポートされます。

EIP 名。詳細については、「EIP のリクエスト」をご参照ください。

説明

ack-extend-network-controller v0.6.0 以降でのみサポートされています。

network.alibabacloud.com/eip-description

k8s.aliyun.com/eip-description

EIP の作成時にのみサポートされます。

EIP の説明。詳細については、「EIP のリクエスト」をご参照ください。

説明

ack-extend-network-controller v0.6.0 以降でのみサポートされています。

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

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

EIP の作成時にのみサポートされます。

EIP のセキュリティ保護レベル。Anti-DDoS Proxy 対応 EIP がサポートされています。複数のレベルを設定する場合は、コンマ (,) で区切ります。詳細については、「EIP のリクエスト」をご参照ください。

説明

ack-extend-network-controller v0.9.0 以降でのみサポートされています。

network.alibabacloud.com/eip-tags

k8s.aliyun.com/eip-tags

EIP の作成時にのみサポートされます。

EIP タグ設定。値は有効な JSON 形式である必要があります。詳細については、「タグの管理」をご参照ください。

例: k8s.aliyun.com/eip-tags: "{\"foo\":\"bar\"}"

説明

ack-extend-network-controller v0.11.0 以降でのみサポートされています。

EIP インスタンスの指定

インスタンス ID を指定して、既存の EIP をアタッチできます。Pod アノテーションは EIP インスタンスの設定を変更しません。アノテーションは、指定された Pod に EIP をアタッチするだけです。

重要

この機能は、複数レプリカのコントローラーには適用できません。1 つの Pod のみが EIP インスタンスを参照していることを確認してください。この機能は、ステートフルアプリケーションの StatefulSet でのみ使用することを推奨します。

Pod アノテーション

network.alibabacloud.com/pod-eip-instanceid

k8s.aliyun.com/pod-eip-instanceid

指定された EIP を使用します。EIP インスタンス ID を入力します。例: eip-bp14qxxxxxxx

重要

同じ EIP インスタンスを異なる名前の Pod に割り当てないでください。EIP コントローラーは、Pod が終了した後に EIP をデタッチします。この期間中、新しいコンテナーで同じ EIP インスタンスを使用することはできません。Pod と同じ名前の Pod EIP リソースが存在するかどうかを確認して、Pod と EIP がデタッチされているかどうかを判断できます。

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

EIP リリース ポリシーを設定するためのアノテーションの概要

固定 EIP は、Pod が再構築された後も同じ EIP アドレスを使用し続けることを保証します。このポリシーは、ステートフルアプリケーションの固定 EIP のための自動 EIP 割り当て機能と組み合わせることができます。

重要
  • この機能は、ack-extend-network-controller でのみサポートされており、ステートフルレプリカコントローラーでのみ使用できます。ステートレスコントローラーでは使用できません。

  • EIP インスタンス ID を指定した場合、EIP インスタンスは解放されません。

Pod アノテーション

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

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

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

  • Follow (デフォルト): Pod のライフサイクルに従います。

  • Never: Pod EIP を削除しません。不要になった場合は、手動で Pod EIP を削除する必要があります。

有効期限を直接設定できます。Go タイプの時間式がサポートされています。たとえば、5m30s は、Pod が削除されてから 5.5 分後に EIP が削除されることを示します。

ack-extend-network-controller または Terway クラスターで EIP を有効にする

ack-extend-network-controller で有効にする

説明

ack-extend-network-controller は、リソースを作成するために Alibaba Cloud OpenAPI にアクセスする必要があります。RAM で必要な権限を設定する必要があります。その後、App Marketplace から ack-extend-network-controller をインストールし、アノテーションを使用して EIP を作成し、指定された Pod に関連付けることができます。

アノテーションを使用して指定された Pod に EIP を作成して関連付ける

Pod にアノテーションを指定することで、EIP を作成して Pod に関連付けることができます。アノテーションの詳細については、このトピックの「よくある質問」セクションをご参照ください。

  1. アプリケーションを作成し、指定された Pod に EIP を作成して関連付けます。

    Deployment

    次の例を使用してデプロイメントを作成します。帯域幅が 5 Mbit/s の EIP インスタンスが各 Pod に自動的に割り当てられます。

    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

    Pod が作成された後、Pod と同じ名前の podeips.alibabacloud.com リソースをクエリして、割り当てられた EIP に関する情報を追跡できます。

    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

    StatefulSet

    次の例を使用して StatefulSet リソースを作成します。2 つの Pod が作成され、EIP インスタンスが各 Pod に自動的に割り当てられます。リリースポリシーは、Pod が削除されてから 10 分後に PodEIP を削除するように設定されています。

    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

    Pod が作成された後、Pod と同じ名前の podeips.alibabacloud.com リソースから割り当てられた EIP 情報を取得できます。

    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: ""

    ステートフルアプリケーションの Pod が削除された後、対応する PodEIP カスタムリソース (CR) は削除される前に 10 分間保持されます。この間に同じ名前の Pod が作成された場合、EIP は再利用されます。

  2. 設定を検証します。

    Pod が実行中状態になった後、Pod の k8s.aliyun.com/allocated-eipAddress アノテーションの値を確認して、関連付けられている EIP アドレスを表示できます。その後、この EIP を使用して Pod にアクセスできます。

    image.png

Terway で有効にする

  1. EIP 機能をサポートするように Terway を設定します。

    1. Terway ConfigMap を変更します。

      kubectl edit cm eni-config -n kube-system
    2. 次の内容を eni_conf に追加します。

      "enable_eip_pool": "true"
      説明

      EIP を指定するときに以前のインスタンスを強制的にデタッチする場合は、eni_conf"allow_eip_rob": "true" パラメーターも追加する必要があります。

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

    4. Terway インスタンスを再作成します。

      kubectl delete pod -n kube-system -l app=terway-eniip # terway-eni コンポーネントをインストールした場合は、terway-eniip を terway-eni に置き換えます。
  2. アノテーションを使用して、EIP を作成し、Pod に関連付けます。

    Pod にアノテーションを指定することで、EIP を作成して Pod に関連付けることができます。EIP の制限の詳細については、「制限事項」をご参照ください。

    さまざまなシナリオに合わせて、次のようにアノテーションを設定します。

    自動 EIP 割り当てシナリオ

    次のアノテーションを追加して、EIP を Pod に自動的に割り当て、EIP の帯域幅を指定します。

    • k8s.aliyun.com/pod-with-eip: "true": ターゲット Pod に独立したパブリック EIP を割り当てます。

    • 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" # Nginx コンテナーにパブリック EIP アドレスを自動的に割り当てます。
            network.alibabacloud.com/eip-bandwidth: "5"   # EIP の帯域幅を指定します。デフォルトの帯域幅は 5 Mbit/s で、EIP のデフォルト値と一致します。
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx

    EIP 指定シナリオ

    重要
    • 単一の EIP を複数の Pod に関連付けることはできません。したがって、このシナリオはデプロイメントおよび StatefulSet には適用できません。

    • デフォルトでは、EIP がすでにインスタンスにアタッチされている場合、EIP を Pod にアタッチすることはできません。EIP を新しいインスタンスにアタッチする前に以前のインスタンスからデタッチする場合は、前のステップで説明したように ConfigMap"allow_eip_rob": "true" を設定する必要があります。

    • EIP インスタンス ID は、単一レプリカのインスタンスに対してのみ指定できます。たとえば、デプロイメントは複数のレプリカを持つことはできません。

    次のアノテーションを追加して、Pod の EIP インスタンス ID を指定します。

    k8s.aliyun.com/pod-eip-instanceid: "<youreipInstanceId>"
  3. 設定を検証します。

    Pod が実行中状態になった後、Pod の network.alibabacloud.com/allocated-eipAddress アノテーションの値を確認して、関連付けられている EIP アドレスを表示できます。その後、この EIP を使用して Pod にアクセスできます。

よくある質問

Pod が Ready になるのはなぜですか?

コントローラーは、Pod の IP アドレスが割り当てられた後に Pod の EIP アドレスを設定します。EIP が正常にアタッチされる前に、Pod が Ready 状態になることがあります。次のメソッドを使用して、Pod が Ready 状態になるタイミングを制御できます。

Pod の readiness gates を設定する

説明

Pod の readiness gates の設定は、ack-extend-network-controller でのみサポートされています。

Pod で readinessGates を設定すると、コントローラーは EIP が正常にアタッチされた後に Pod の条件を設定します。EIP がアタッチされるまで、Pod は Ready 状態になりません。

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
...

Pod の init コンテナーを設定する

Pod の init コンテナーを設定できます。init コンテナーでは、EIP が正常に割り当てられたかどうかを確認できます。詳細については、次の例をご参照ください。

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 アプリケーションは実行中です! && 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 アノテーションを待っています; 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

EIP を使用して Pod にアクセスできないのはなぜですか?

この問題は通常、アクセス制御リスト (ACL) ルールが原因です。次のアクセスの制御ポリシーを確認してください:

  • Cloud Firewall: EIP は Cloud Firewall のアクセスの制御ルールの対象となります。Cloud Firewall で EIP と Pod が使用するビジネスポートのインバウンドおよびアウトバウンドトラフィックを許可する必要があります。詳細については、「インターネット境界のアクセスの制御ポリシーを設定する」をご参照ください。

  • ノードセキュリティグループ: EIP が Pod にアタッチされた後、EIP を通過するトラフィックは、Pod が配置されているノードのセキュリティグループポリシーの対象となります。クライアントの IP アドレスがノードのセキュリティグループでインバウンドおよびアウトバウンドトラフィックに対して許可されており、Pod のビジネスポートが開いていることを確認してください。詳細については、「クラスターセキュリティグループの設定」をご参照ください。