デフォルトでは、Kubernetes クラスター内の Pod はプライベート IP アドレスを使用します。しかし、一部のシナリオでは、他の Pod からのトラフィックの影響を受けずに外部ネットワークと通信するために、Pod には独立したパブリック IP アドレスが必要です。Alibaba Cloud の Terway および ack-extend-network-controller コンポーネントを使用することで、Elastic IP アドレス (EIP) を Pod に直接関連付け、独立したパブリックエグレスを付与できます。
前提条件
Terway ネットワークプラグインを使用する ACK マネージドクラスター または ACK 専用クラスター が必要です。手順については、ACK マネージドクラスターの作成 および ACK 専用クラスターの作成 (新規クラスターの作成はサポートされなくなりました) をご参照ください。Terway ネットワークモードの詳細については、「Terway ネットワークプラグインの使用」をご参照ください。
2023年11月時点で、Terway の EIP 機能はメンテナンスが終了し、 v1.7.0 で削除されました。ack-extend-network-controller コンポーネントを使用して、独立した EIP を Pod にアタッチしてください。詳細については、「Terway から ack-extend-network-controller への EIP 機能の移行」をご参照ください。
使用制限
-
EIP を使用する前に、その使用制限を確認してください。詳細については、「使用制限」をご参照ください。
-
この機能は ECS ノードでのみサポートされています。
-
コンポーネントは、コントローラーが作成した EIP のライフサイクルを管理します。Pod に EIP が割り当てられた後にコンポーネントをアンインストールした場合、EIP は割り当て済みのままであり、自動的には解放されません。
EIP 機能の使用を停止するには、コンポーネントを停止する前に、まず EIP を使用している Pod を削除する必要があります。Pod と同じ名前の
podeips.alibabacloud.comリソースで、EIP の割り当てと解放のステータスを確認できます。コンポーネントを停止する前に、EIP が使用されていないことを確認してください。そうしないと、EIP の課金が継続されます。
課金
Terway および ack-extend-network-controller プラグインは無料で有効化できますが、これらが消費するクラウドリソースには料金が発生します。ACK の課金の詳細については、「クラウドリソースの課金」をご参照ください。
背景情報
ほとんどの場合、Terway ネットワークモードの Pod は、ホスト SNAT (Source Network Address Translation) または EIP による外部 SNAT を使用してパブリックネットワークにアクセスします。通常、LoadBalancer タイプの Service は、パブリックイングレストラフィックを Pod にルーティングします。ただし、一部のシナリオでは、Pod が独立したパブリック IP アドレスを持つ必要があります。次に例を示します。
-
Pod がランダムポートでサービスを公開する場合。これは、ゲームサーバーやテレカンファレンスなどの UDP (ユーザーデータグラムプロトコル) ベースのアプリケーションで一般的です。たとえば、RTSP プロトコルは、クライアントごとに異なるポートを使用します。
-
Pod が他の Pod との競合を回避するために、専用のパブリックエグレスが必要な場合。
手順 1: EIP の RAM 権限の設定
ack-extend-network-controller (推奨)
-
RAM 権限を付与する対象クラスター: ACK マネージドクラスター 、または ACK 専用クラスター
-
次の内容でカスタム権限ポリシーを作成します。手順については、「手順 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": {} } -
クラスターのワーカー RAM ロールに権限を付与します。手順については、「手順 2:クラスターのワーカー RAM ロールへの権限付与」をご参照ください。
-
Terway
Terway が Pod に EIP を設定するには、EIP 関連の権限が必要です。そのためには、追加の設定をデプロイし、権限を付与する必要があります。
-
RAM 権限を付与する対象クラスター: ACK マネージドクラスター 、または ACK ベーシックマネージドクラスター (2020 年 6 月以降に作成されたもののみ)
-
次の内容でカスタム権限ポリシーを作成します。手順については、「手順 1:カスタム権限ポリシーの作成」をご参照ください。
{ "Effect": "Allow", "Action": [ "vpc:DescribeVSwitches", "vpc:AllocateEipAddress", "vpc:DescribeEipAddresses", "vpc:AssociateEipAddress", "vpc:UnassociateEipAddress", "vpc:ReleaseEipAddress", "vpc:AddCommonBandwidthPackageIp", "vpc:RemoveCommonBandwidthPackageIp" ], "Resource": [ "*" ], "Condition": {} } -
クラスターのワーカー RAM ロールに権限を付与します。手順については、「手順 2:クラスターのワーカー RAM ロールへの権限付与」をご参照ください。
-
-
RAM 権限を付与する対象クラスター: ACK 専用クラスター 、または ACK マネージドクラスター (2020 年 6 月より前に作成されたもののみ)
-
次の内容でカスタム権限ポリシーを作成します。手順については、「手順 1:カスタム権限ポリシーの作成」をご参照ください。
{ "Effect": "Allow", "Action": [ "vpc:DescribeVSwitches", "vpc:AllocateEipAddress", "vpc:DescribeEipAddresses", "vpc:AssociateEipAddress", "vpc:UnassociateEipAddress", "vpc:ReleaseEipAddress", "vpc:AddCommonBandwidthPackageIp", "vpc:RemoveCommonBandwidthPackageIp" ], "Resource": [ "*" ], "Condition": {} } -
AliyunCSManagedNetworkRole RAM ロール ページの Policies タブで、Grant Permission をクリックします。次に、カスタムポリシー をクリックし、作成したカスタム権限ポリシーを選択して Grant permissions をクリックします。
-
ステップ 2:クラスタープラグインのインストールまたはアップグレード
ack-extend-network-controller と Terway の両方で EIP 機能を同時に有効にしないでください。Elastic IP アドレス (EIP) の重複割り当てが発生し、バインド失敗につながる可能性があります。ack-extend-network-controller プラグインを使用してください。
プラグインの比較
|
項目 |
ack-extend-network-controller |
Terway |
|
サポートされるクラスタータイプ |
|
|
|
静的 EIP |
サポート |
非サポート |
|
設定フェーズ |
Pod IP が割り当てられた後、コントローラーが EIP を割り当てて Pod にバインドします。 |
CNI 実行プロセス中に EIP を割り当ててバインドします。 |
|
サポートされるバージョン |
プラグインバージョン v0.2.0 以降。 |
Terway プラグインバージョン v1.0.10.280-gdc2cb6c-aliyun 以降、v1.7.0 より前。 |
プラグインのインストールまたはアップグレード
ack-extend-network-controller プラグインを使用する場合は、マーケットプレイスからインストールし、EIP コントローラーを有効にしてください。Terway ネットワークプラグインを使用する場合は、バージョン v1.0.10.280-gdc2cb6c-aliyun 以降にアップグレードしてください。
ack-extend-network-controller (推奨)
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
-
[Marketplace] ページで、検索バーに
ack-extend-network-controllerと入力し、対象のアプリケーションをクリックします。 -
アプリケーション詳細ページで、右上隅にある デプロイ をクリックします。
-
作成する パネルでクラスターと名前空間を選択し、次へ をクリックします。
-
OK ページで、バージョンを選択し、パラメーターを設定してから、[OK] をクリックします。
次の表でパラメーターについて説明します:
パラメーター
タイプ
必須
説明
clusterID
string
はい
クラスターの ID。
regionID
string
はい
クラスターが配置されているリージョン。
enableControllers
[]string
はい
EIP 機能を有効にするには、
eipを設定してください。networkController.vpcID
string
はい
クラスターの Virtual Private Cloud (VPC) の ID。
networkController.eipController.maxConcurrentReconciles
int
いいえ
EIP コントローラーの同時リコンサイルの最大数。
networkController.eipController.garbageCollectionPeriodInMinutes
int
いいえ
静的 EIP のガベージコレクションの間隔 (分単位)。
networkController.customStatefulWorkloadKinds
[]string
いいえ
カスタムのステートフルワークロードの種類。
enableVirtualNode
bool
いいえ
Elastic Container Instance (ECI) 仮想ノードのサポートを有効にします。
重要この機能を有効にすると、コントローラーは ECI インスタンス上の Pod に EIP を割り当てます。設定した Pod アノテーションは、ECI でサポートされている EIP 機能で使用されているものと同じにすることはできません。この機能は慎重に使用してください。
enableRRSA
bool
いいえ
RRSA による認証を有効にします。
説明ack-extend-network-controller プラグイン v0.10.0 以降でサポートされます。
RRSA 設定は、ack-pod-identity-webhook インジェクション方式のみをサポートします。設定の詳細については、「RRSA を使用して ServiceAccount の RAM 権限を設定し、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 ネットワークプラグインを使用している場合は、EIP 機能をサポートするバージョン (terway-eni または terway-eniip) にアップグレードしてください。詳細な手順については、「コンポーネントの管理」をご参照ください。
Terway プラグインのバージョンは v1.0.10.280-gdc2cb6c-aliyun 以降かつ v1.7.0 未満である必要があります。Terway のバージョンの詳細については、「Terway」をご参照ください。
手順 3:EIP 機能の有効化
EIP アノテーション
Container Service for Kubernetes (ACK) では、アノテーションを使用して Elastic IP アドレス (EIP) 機能を有効にすることができます。EIP を Pod に自動的に割り当てるか、既存の EIP を Pod に関連付けることができます。
EIP の自動割り当て
EIP を自動的に割り当てる場合、Pod の再作成中や CNI の実行失敗後に、システムが EIP の作成と解放を繰り返す可能性があります。これを避けるには、代わりに既存の EIP インスタンスを指定してください。
|
Pod アノテーション |
値 |
|
network.alibabacloud.com/pod-with-eip k8s.aliyun.com/pod-with-eip |
EIP を自動的に作成して関連付けるかどうかを指定します。有効な値:
|
|
k8s.aliyun.com/eci-with-eip (互換) |
|
|
network.alibabacloud.com/eip-bandwidth k8s.aliyun.com/eip-bandwidth |
このアノテーションは EIP の作成時にのみ適用されます。 EIP のピーク帯域幅を Mbps 単位で指定します。詳細については、「EIP のリクエスト」をご参照ください。 |
|
network.alibabacloud.com/eip-internet-charge-type k8s.aliyun.com/eip-internet-charge-type |
このアノテーションは EIP の作成時にのみ適用されます。 EIP の課金方法を指定します。有効な値:
詳細については、「EIP のリクエスト」をご参照ください。 |
|
k8s.aliyun.com/eip-charge-type (互換) |
|
|
network.alibabacloud.com/eip-instance-charge-type k8s.aliyun.com/eip-instance-charge-type |
このアノテーションは EIP の作成時にのみ適用されます。 EIP の課金方法を指定します。有効な値:
詳細については、「EIP のリクエスト」をご参照ください。 説明
このアノテーションは ack-extend-network-controller でのみサポートされています。 PrePaid (サブスクリプション) オプションはサポートされていません。 |
|
network.alibabacloud.com/eip-common-bandwidth-package-id k8s.aliyun.com/eip-common-bandwidth-package-id |
EIP に関連付ける EIP 帯域幅プランの ID を指定します。 説明
この機能には Terway v1.2.3 以降が必要です。ack-extend-network-controller コンポーネントにはバージョン制限はありません。 |
|
network.alibabacloud.com/eip-isp k8s.aliyun.com/eip-isp |
このアノテーションは EIP の作成時にのみ適用されます。 EIP の回線タイプを指定します。有効な値:
詳細については、「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 の作成時にのみ適用されます。 IP アドレスプールの ID を指定します。IP アドレスプールの使用に関する制限と手順については、「IP アドレスプール」をご参照ください。 説明
これは ack-extend-network-controller でのみサポートされています。 |
|
network.alibabacloud.com/eip-resource-group-id k8s.aliyun.com/eip-resource-group-id |
このアノテーションは EIP の作成時にのみ適用されます。 EIP のリソースグループの ID を指定します。詳細については、「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 が有効な EIP がサポートされています。
複数の保護レベルを指定するには、カンマ ( 説明
これは ack-extend-network-controller v0.9.0 以降でサポートされています。 |
|
network.alibabacloud.com/eip-tags k8s.aliyun.com/eip-tags |
このアノテーションは EIP の作成時にのみ適用されます。 EIP に追加するタグを指定します。値は有効な JSON 文字列である必要があります。詳細については、「タグの管理」をご参照ください。 例: 説明
これは ack-extend-network-controller v0.11.0 以降でサポートされています。 |
EIP インスタンスの指定
EIP インスタンス ID を指定することで、既存の EIP を Pod に関連付けることができます。Pod アノテーションは EIP インスタンスの設定を変更しません。EIP を指定された Pod に関連付けるだけです。
この機能は、Deployment のように複数のレプリカを持つコントローラーには適していません。1 つの Pod のみが EIP インスタンスを参照するようにしてください。StatefulSet のようなステートフルなアプリケーションでのみこの機能を使用することを推奨します。
|
Pod アノテーション |
値 |
|
network.alibabacloud.com/pod-eip-instanceid k8s.aliyun.com/pod-eip-instanceid |
関連付ける EIP インスタンスの ID。例:eip-bp14qxxxxxxx。 重要
同じ EIP インスタンスを異なる名前の Pod に割り当てないでください。Pod が削除されると、EIP コントローラーは EIP の関連付けを解除します。この期間中、新しい Pod に同じ EIP インスタンスを使用することはできません。関連付けの解除が完了したかどうかを確認するには、Pod と同じ名前の PodEIP リソースが存在しなくなったことを確認してください。 |
|
k8s.aliyun.com/eci-eip-instanceid (互換) |
EIP 解放ストラテジー アノテーション
この解放ストラテジーにより、Pod は再作成された後でも EIP アドレスを保持できます。このストラテジーを自動割り当て機能と併用して、ステートフルなアプリケーションに永続的な EIP を提供できます。
-
この機能は ack-extend-network-controller でのみサポートされており、ステートフルなレプリカコントローラーにのみ適用されます。ステートレスなコントローラーには使用できません。
-
EIP インスタンス ID を指定した場合、Pod が削除されても EIP インスタンスは解放されません。
|
Pod アノテーション |
値 |
|
network.alibabacloud.com/pod-eip-release-strategy k8s.aliyun.com/pod-eip-release-strategy |
Pod の EIP の解放ストラテジー。有効な値:
保持期間を指定することもできます。Go スタイルの期間表現がサポートされています。たとえば、 |
ack-extend-network-controller または Terway での EIP の有効化
ack-extend-network-controller での有効化
ack-extend-network-controller コンポーネントは Alibaba Cloud API を呼び出してリソースを作成します。Resource Access Management (RAM) で必要な権限を設定し、マーケットプレイスから ack-extend-network-controller をインストールしてから、アノテーションを使用して EIP を作成し、特定の Pod に関連付ける必要があります。
アノテーションによる EIP の作成と関連付け
Pod のマニフェストでアノテーションを使用して、EIP を作成し、その Pod に関連付けることができます。アノテーションの詳細については、「FAQ」をご参照ください。
-
アプリケーションを作成し、アノテーションを使用して EIP を作成し、特定の Pod に関連付けます。
Deployment
このマニフェストは、ACK が各 Pod にピーク帯域幅 5 Mbps の EIP インスタンスを自動的に割り当てるように設定された Deployment を作成します。
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: nginxPod が作成された後、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: InUseStatefulSet
次のマニフェストを使用して、2 つの Pod を持つ StatefulSet を作成します。各 Pod には EIP が自動的に割り当てられ、対応する 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: nginxPod が作成された後、
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.106.YY.YY internetChargeType: PayByTraffic isp: BGP networkInterfaceID: eni-2zeagv8f3wxxx podLastSeen: "2023-12-15T05:31:34Z" privateIPAddress: 192.168.YY.YY resourceGroupID: rg-acfmwqnwxxx status: InUse kind: List metadata: resourceVersion: ""このステートフルなアプリケーションの Pod が削除された後、その PodEIP カスタムリソース (CR) は削除される前に 10 分間保持されます。この期間中に同じ名前の Pod が作成されると、対応する EIP が再利用されます。
-
設定を確認します。
Pod が実行中状態になった後、Pod の k8s.aliyun.com/allocated-eipAddress アノテーションの値を確認して、割り当てられた EIP アドレスを表示できます。この EIP を使用して Pod にアクセスできます。
Terway での有効化
-
EIP 機能をサポートするために Terway 設定をデプロイします。
-
Terway ConfigMap を編集します。
kubectl edit cm eni-config -n kube-system -
eni_conf に、次の行を追加します。
"enable_eip_pool": "true"説明EIP を新しいインスタンスに関連付けるときに、現在のインスタンスから強制的に関連付けを解除するには、"allow_eip_rob": "true" パラメーターを eni_conf に追加してください。
-
編集が完了したら、[Esc] キーを押し、:wq! と入力して [Enter] キーを押し、変更を保存して編集モードを終了します。
-
Terway Pod を再作成して変更を適用します。
kubectl delete pod -n kube-system -l app=terway-eniip # terway-eni コンポーネントをインストールした場合は、terway-eniip を terway-eni に置き換えます。
-
-
アノテーションを使用して 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 Mbps で、EIP のデフォルト値と一致します。
以下にマニフェストの例を示します。
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 Mbps で、EIP のデフォルト値と一致します。 labels: app: nginx spec: containers: - name: nginx image: nginxEIP の指定
重要-
1 つの EIP は複数の Pod に関連付けることができないため、この方法は Deployment や StatefulSet のように複数のレプリカを持つワークロードには適していません。
-
デフォルトでは、指定された EIP がすでにインスタンスに関連付けられている場合、関連付けは失敗します。以前のインスタンスから EIP の関連付けを強制的に解除し、新しいインスタンスに関連付けるには、前述のように ConfigMap で "allow_eip_rob": "true" を設定する必要があります。
-
EIP インスタンス ID は、単一レプリカのワークロードに対してのみ指定できます。たとえば、Deployment は複数のレプリカを持つことはできません。
次のアノテーションを追加して、Pod の EIP インスタンス ID を指定します:
k8s.aliyun.com/pod-eip-instanceid: "<your-eip-instance-id>" -
-
設定を確認します。
Pod が実行中状態になった後、Pod の network.alibabacloud.com/allocated-eipAddress アノテーションの値を確認して、割り当てられた EIP アドレスを表示できます。この EIP を使用して Pod にアクセスできます。
よくある質問
EIP がバインドされる前に Pod が Ready になる問題
コントローラーは、Pod の IP アドレスが割り当てられた後にのみ EIP を割り当てるため、EIP がバインドされる前に Pod が Ready になる可能性があります。次の方法で、このタイミングを制御します。
readiness gates
readiness gates の設定には、ack-extend-network-controller が必要です。
Pod に readinessGates を設定すると、コントローラーは EIP がバインドされた後にのみ Pod の condition を更新します。これにより、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
...
Init コンテナ
Init コンテナ を設定し、EIP が Pod に割り当てられているかどうかを確認できます。
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
EIP 経由で Pod にアクセスできない問題
制限の厳しい ACL ポリシーがこの問題の原因となることがよくあります。次のアクセス制御設定を確認してください。
-
Cloud Firewall:EIP へのトラフィックは、Cloud Firewall のアクセス制御ルールの対象となります。Pod の EIP とそのサービスポートに対するインバウンドおよびアウトバウンドトラフィックを許可するルールがあることを確認してください。詳細については、「インターネットファイアウォールのアクセス制御ポリシーの設定」をご参照ください。
-
ノードセキュリティグループ:EIP が Pod にバインドされた後も、Pod のノードのセキュリティグループがトラフィックを制御し続けます。
ノードセキュリティグループのルールで、クライアント IP アドレスから Pod のサービスポートへのインバウンドトラフィック、および必要なアウトバウンドトラフィックが許可されていることを確認してください。詳細については、「クラスターセキュリティグループの設定」をご参照ください。