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エントリ
ACS コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。Helm ページで、デプロイをクリックします。基本情報の設定を以下の情報で完了します。
パラメータ
値の例
アプリケーション名
ack-extend-network-controller
名前空間
kube-system
ソース
デフォルトはApp Catalogです。
Chart
検索ボックス:ack-extend-network-controller を検索します。
次へをクリックします。
パラメータページで、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 コントローラーの種類。
Helm ページに戻ると、新しい ack-extend-network-controller コンポーネントがデプロイされていることがわかります。
ACK App Market を使用してインストールする
コンテナサービス管理コンソール にログインし、左側のナビゲーションペインで を選択します。
マーケットプレイスページの検索バーに
ack-extend-network-controller
と入力し、クリックします。アプリケーション詳細ページで、右上隅にあるワンクリックデプロイをクリックします。
作成ペインで、クラスタと名前空間を選択し、次へをクリックします。
パラメータ設定ページで、バージョン番号を選択し、対応するパラメータを設定して、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 を自動的に割り当てる
ACS コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。デプロイメントページの右上隅にあるYAML から作成をクリックします。
次のサンプルを使用して Deployment コントローラーを作成し、「example」という名前を付けます。
作成が成功したら、example という名前の Deployment を入力します。Pod 名 (例: example-78d17b7xxx-adxxx) をクリックして、Pod の詳細ページに移動します。ページの右側にあるアノテーションセクションで、作成された EIP 情報を表示できます。編集をクリックして、Pod YAML で作成された EIP 情報を表示することもできます。
例を完了したら、example という名前の Deployment を削除できます。Pod EIP インスタンス ID を指定しない場合、Pod EIP のデフォルトのリサイクルポリシーは Pod のライフサイクルに従うことです。したがって、Pod が削除されると、EIP は自動的に解放されます。
EIP を指定する
例で使用する EIP インスタンスを準備します。最初にEIP を申請してください。
ACS コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。デプロイメントページの右上隅にあるYAML から作成をクリックします。
次のサンプルを使用して StatefulSet コントローラーを作成し、「example」という名前を付けます。
作成が成功したら、example という名前の StatefulSet を入力します。Pod 名 (例: example-0) をクリックして、Pod の詳細ページに移動します。ページの右側にあるアノテーションセクションで、バインドされた EIP インスタンス情報を表示できます。編集をクリックして、Pod YAML でバインドされた EIP インスタンス情報を表示することもできます。
例を完了したら、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 に渡す