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

Container Compute Service:Pod に独立した EIP をマウントする

最終更新日:Dec 27, 2024

ACS クラスタでは、Pod の IP アドレスは通常プライベート IP アドレスです。ただし、シナリオによっては、Pod がインターネットと独立して通信するために独立したパブリック IP アドレスを必要とする場合があります。このトピックでは、ACS クラスタ内の Pod に独立した Elastic IP Address (EIP) をマウントする方法について説明します。

前提条件

ACS クラスタが作成されていること。詳細については、ACS クラスタの作成を参照してください。

背景情報

一般に、Pod は「外部 SNAT+EIP」を介してインターネットデータにアクセスします。詳細については、ACS クラスタのインターネットアクセスを有効にするを参照してください。Pod のインターネットイングレスデータは、通常、LoadBalancer タイプの Service を介して流入します。特別なシナリオでは、Pod には次のような独立した IP アドレスが必要です。

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

  • インターネットデータは、出口点でリソースの競合に直面します。

制限事項

  • EIP を使用する前に、EIP の制限事項を理解してください。詳細については、制限事項を参照してください。

  • EIP の自動割り当て機能を使用する場合、Pod を再作成したり、CNI エラーが発生したりすると、EIP リソースが繰り返し要求および解放される可能性があり、EIP の制限がトリガーされる可能性があります。このような状況を回避するには、Pod アノテーション network.alibabacloud.com/allocated-eip-id を設定して、Pod に EIP を指定できます。

手順 1: EIP のマウントに必要な RAM 権限を設定する

ACS クラスタの場合、Resource Access Management (RAM) ユーザーの AccessKey を生成する必要があります。具体的な操作については、RAM ユーザーの作成カスタムポリシーの作成を参照してください。

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

ACK App Market または ACS クラスタアプリケーションエントリで ack-extend-network-controller プラグインをインストールし、EIP コントローラーを有効にする必要があります。

説明

ACS クラスタは、ACK コンソールで表示および管理できます。詳細については、製品紹介を参照してください。

ACS クラスタの Helm エントリを使用してインストールするACSクラスターのHelmエントリ

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

  2. クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、アプリケーション > Helm を選択します。

  3. Helm ページで、デプロイをクリックします。基本情報の設定を以下の情報で完了します。

    パラメータ

    値の例

    アプリケーション名

    ack-extend-network-controller

    名前空間

    kube-system

    ソース

    デフォルトはApp Catalogです。

    Chart

    検索ボックス:ack-extend-network-controller を検索します。

    次へをクリックします。

  4. パラメータページで、Chart のバージョンを選択します。次の表に従って必須パラメータを設定し、OK をクリックします。

    説明

    ACS クラスタは、バージョン v0.9.3 以降のコンポーネントのインストールと使用のみをサポートしています。

    パラメータの説明は次のとおりです。

    設定パラメータ

    タイプ

    必須

    説明

    enableControllers

    []string

    はい

    eip のデフォルトコメントを削除して、EIP 機能を有効にします。

    vpcid

    string

    はい

    EIP に関連付けられた VPC ID。

    credential.accessKey

    string

    はい

    EIP のマウントに必要な権限アカウントの AccessKey ID。

    credential.accessSecret

    string

    はい

    EIP のマウントに必要な権限アカウントの AccessKey シークレット。

    networkController.eipController.maxConcurrentReconciles

    int

    いいえ

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

    networkController.eipController.garbageCollectionPeriodInMinutes

    int

    いいえ

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

    customStatefulWorkloadKinds

    []string

    いいえ

    カスタム Stateful コントローラーの種類。

  5. Helm ページに戻ると、新しい ack-extend-network-controller コンポーネントがデプロイされていることがわかります。

ACK App Market を使用してインストールする

  1. コンテナサービス管理コンソール にログインし、左側のナビゲーションペインで マーケットプレイス > マーケットプレイス を選択します。

  2. マーケットプレイスページの検索バーにack-extend-network-controller と入力し、クリックします。

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

  4. 作成ペインで、クラスタと名前空間を選択し、次へをクリックします。

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

      説明

      ACS クラスタは、バージョン v0.9.2 以降のコンポーネントのインストールと使用のみをサポートしています。

      パラメータの説明は次のとおりです。

      設定パラメータ

      タイプ

      必須

      説明

      enableControllers

      []string

      はい

      eip を設定して、EIP 機能を有効にします。

      vpcid

      string

      はい

      EIP に関連付けられた VPC ID

      credential.accessKey

      string

      はい

      EIP のマウントに必要な権限アカウントの AK。

      credential.accessSecret

      string

      はい

      EIP のマウントに必要な権限アカウントの SK。

      networkController.eipController.maxConcurrentReconciles

      int

      いいえ

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

      networkController.eipController.garbageCollectionPeriodInMinutes

      int

      いいえ

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

      customStatefulWorkloadKinds

      []string

      いいえ

      カスタム Stateful コントローラーの種類。

      パラメータの例は次のとおりです。

      clusterID: "c11ba338192xxxxxxx"  // クラスタID
      regionID: "cn-hangzhou"      // リージョンID
      vpcID: "vpc-bp1rkq0zxxxxxx" // VPC ID
      enableVirtualNode: true
      affinity: null
      enableControllers:
        - eip              // EIP コントローラーを有効にする
      networkController:
        eipController:
          maxConcurrentReconciles: 10   // 同時実行数
          garbageCollectionPeriodInMinutes: 1  // クリーンアップ期間
        customStatefulWorkloadKinds:           
        - foo
      credential:                             
        accessKey: "xxxxxxxxxxxx" // AccessKey ID
        accessSecret: "xxxxxxxxxxxxxx" // AccessKey シークレット

      ack-extend-network-controller プラグインのバージョンとパラメータを更新する必要がある場合は、App Marketplace を参照してください。

手順 3: EIP 機能を有効にする

ACS は、アノテーションを使用して EIP 機能を有効にすることをサポートしています。Pod で annotations を指定することで、EIP を作成または Pod に関連付けることができます。EIP 機能アノテーションを有効にする方法の詳細については、EIP 機能を有効にするためのアノテーションを参照してください。

説明

必要に応じて、EIP を自動的に割り当てるか、EIP を指定するかを選択できます。これらの 2 つの方法は、使用するアノテーションと EIP リサイクルポリシーが異なります。指定された EIP インスタンス方式では、Pod を削除しても EIP インスタンスは解放されませんが、EIP 自動割り当て方式ではデフォルトで EIP インスタンスが解放されます。EIP リサイクルポリシーの詳細については、EIP リリースポリシーを設定するためのアノテーションを参照してください。

EIP を自動的に割り当てる

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

  2. クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、ワークロード > デプロイメント を選択します。

  3. デプロイメントページの右上隅にあるYAML から作成をクリックします。

  4. 次のサンプルを使用して Deployment コントローラーを作成し、「example」という名前を付けます。

    展開して Deployment YAML を表示する

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example
      labels:
        app: example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            network.alibabacloud.com/pod-with-eip: "true"  // Pod に EIP を割り当てることを指定
            network.alibabacloud.com/eip-bandwidth: "5" // 帯域幅を 5 Mbps に設定
        spec:
          containers:
          - name: example
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80

    アノテーションセクションは、各 Pod に帯域幅 5 Mbps の EIP インスタンスが自動的に割り当てられることを示しています。

  5. 作成が成功したら、example という名前の Deployment を入力します。Pod 名 (例: example-78d17b7xxx-adxxx) をクリックして、Pod の詳細ページに移動します。ページの右側にあるアノテーションセクションで、作成された EIP 情報を表示できます。編集をクリックして、Pod YAML で作成された EIP 情報を表示することもできます。

    展開して Pod YAML を表示する

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        ...
        network.alibabacloud.com/allocated-eip-id: eip-xxxxx0y884ucrevoxxxxx // 割り当てられた EIP ID
        network.alibabacloud.com/allocated-eipAddress: xxx.xxx.xxx.xxx // 割り当てられた EIP アドレス
        network.alibabacloud.com/allocated-eni-id: eni-xxxxx563trofuhaxxxxx // 割り当てられた ENI ID
        network.alibabacloud.com/eip-bandwidth: '5' // EIP 帯域幅
        network.alibabacloud.com/pod-with-eip: 'true' // Pod に EIP を割り当てる
        ...
      labels:
        alibabacloud.com/compute-class: general-purpose
        app: example
      name: example-78d17b7xxx-adxxx
      namespace: default
    spec:
      ...
  6. 例を完了したら、example という名前の Deployment を削除できます。Pod EIP インスタンス ID を指定しない場合、Pod EIP のデフォルトのリサイクルポリシーは Pod のライフサイクルに従うことです。したがって、Pod が削除されると、EIP は自動的に解放されます。

EIP を指定する

  1. 例で使用する EIP インスタンスを準備します。最初にEIP を申請してください。

  2. ACS コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。

  3. クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、ワークロード > デプロイメント を選択します。

  4. デプロイメントページの右上隅にあるYAML から作成をクリックします。

  5. 次のサンプルを使用して StatefulSet コントローラーを作成し、「example」という名前を付けます。

    展開して Deployment YAML を表示する

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app: example
      name: example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            network.alibabacloud.com/pod-eip-instanceid: eip-xxxxx66wjkj16lf9xxxxx // Pod に指定する EIP インスタンス ID
        spec:
          containers:
          - name: example
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80

    アノテーションセクションは、インスタンス ID が eip-xxxxx66wjkj16lf9xxxxx の EIP インスタンスが Pod に指定されていることを示しています。このインスタンス ID は実際の値に置き換える必要があります。

  6. 作成が成功したら、example という名前の StatefulSet を入力します。Pod 名 (例: example-0) をクリックして、Pod の詳細ページに移動します。ページの右側にあるアノテーションセクションで、バインドされた EIP インスタンス情報を表示できます。編集をクリックして、Pod YAML でバインドされた EIP インスタンス情報を表示することもできます。

    展開して Pod YAML を表示する

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        ...
        network.alibabacloud.com/allocated-eip-id: eip-xxxxx66wjkj16lf9xxxxx // 割り当てられた EIP ID
        network.alibabacloud.com/allocated-eipAddress: xxx.xxx.xxx.xxx // 割り当てられた EIP アドレス
        network.alibabacloud.com/allocated-eni-id: eni-xxxxx612ub33hunxxxxx // 割り当てられた ENI ID
        network.alibabacloud.com/pod-eip-instanceid: eip-xxxxx66wjkj16lf9xxxxx // 指定された EIP インスタンス ID
        ...
      labels:
        alibabacloud.com/compute-class: general-purpose
        app: example
      name: example-0
      namespace: default
    spec:
      ...
  7. 例を完了したら、example という名前の StatefulSet を削除できます。Pod EIP インスタンス ID を指定した場合、Pod EIP のリサイクルポリシーは EIP インスタンスを解放しないことです。したがって、Pod が削除されても、EIP は自動的に解放されません。

関連操作

コントローラーは、Pod IP が割り当てられた後に、Pod の EIP アドレスを設定します。このプロセス中に、EIP バインディングが成功する前に、Pod が Ready 状態になる場合があります。この問題を解決し、Pod が Ready 状態になる前に EIP バインディングを完了して、潜在的なサービスの中断や接続タイムアウトを回避するには、次の方法を試すことができます。

Readiness gates を使用して EIP バインディング状態を確認する

コントローラーは、Pod で 条件準備完了ゲート が設定されていて、EIP バインディングが成功した場合に、Pod を設定します。EIP がバインドされるまで、Pod は Ready 状態になりません。

kind: Pod
...
spec:
  readinessGates:
  - conditionType: "k8s.aliyun.com/eip" // EIP バインディング状態を確認する Readiness gate
status:
  conditions:
  - lastProbeTime: "2022-12-12T03:45:48Z"
    lastTransitionTime: "2022-12-12T03:45:48Z"
    reason: Associate eip succeed // EIP の関連付けに成功
    status: "True"
    type: k8s.aliyun.com/eip
...

initContainers を使用して EIP バインディング状態を確認する

ポッドにinitContainers を構成する際に、EIP が割り当てられているかどうかを initContainers で確認できます。次の例を参照して、initContainers を構成してください。

apiVersion: v1
kind: Pod
metadata:
  name: example
  annotations:
    network.alibabacloud.com/pod-with-eip: "true"
spec:
  containers:
  - name: example
    image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:  // initContainer を定義
  - name: init
    image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
    command: ['timeout', '-t' ,'60', 'sh','-c', "until grep -E '^k8s.aliyun.com\\/pod-ips=\\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 // アノテーションを initContainer に渡す