ほとんどの場合、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権限を付与する
カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] 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": {} }
クラスターのワーカーRAMロールに権限を付与します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのワーカーRAMロールにカスタムポリシーをアタッチするセクションをご参照ください。
にRAM権限を付与するACKサーバーレスクラスタ
お使いのクラスターがACKサーバーレスクラスターの場合、RAMユーザー用のAccessKeyペアを生成する必要があります。 詳細については、「RAMユーザーの作成」および「カスタムポリシーの作成」をご参照ください。
Terway
Terwayには、EIPを申請して関連付けるためのEIP管理権限が必要です。 したがって、カスタムポリシーはEIPに関連する権限も提供します。
6月2020日以降に作成されたACKマネージドクラスターまたはACK BasicクラスターにRAM権限を付与します。
カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。
{ "Effect": "Allow", "Action": [ "vpc:DescribeVSwitches", "vpc:AllocateEipAddress", "vpc:DescribeEipAddresses", "vpc:AssociateEipAddress", "vpc:UnassociateEipAddress", "vpc:ReleaseEipAddress", "vpc:AddCommonBandwidthPackageIp", "vpc:RemoveCommonBandwidthPackageIp" ], "Resource": [ "*" ], "Condition": {} }
クラスターのワーカーRAMロールに権限を付与します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ2: カスタムポリシーをワーカーRAMロールにアタッチするセクションをご参照ください。
6月2020日より前に作成されたACK専用クラスターまたはACK管理クラスターにRAM権限を付与します。
カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。
{ "Effect": "Allow", "Action": [ "vpc:DescribeVSwitches", "vpc:AllocateEipAddress", "vpc:DescribeEipAddresses", "vpc:AssociateEipAddress", "vpc:UnassociateEipAddress", "vpc:ReleaseEipAddress", "vpc:AddCommonBandwidthPackageIp", "vpc:RemoveCommonBandwidthPackageIp" ], "Resource": [ "*" ], "Condition": {} }
AliyunCSManagedNetworkRoleページの [権限] タブで、[権限の付与] をクリックします。 [権限付与] パネルで、[ポリシー] をクリックし、前の手順で作成したカスタムポリシーを選択します。
[権限付与] をクリックします。
閉じるをクリックします。
手順2: プラグインのインストールまたは更新
ack-extend-network-controllerとTerwayを使用してEIPをポッドに同時に関連付けることはできません。 そうでない場合、EIPが複数のポッドに関連付けられる可能性があり、EIPアソシエーション障害が発生します。 ack-extend-network-controllerの使用を推奨します。
Terwayとack-extend-network-controllerの比較
機能 | ack-extend-network-controller | Terway |
サポートされているクラスタタイプ |
|
|
静的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のインストール
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
Marketplaceページで、
ack-extend-network-controller
を検索し、プラグインをクリックします。グラフの詳細ページの右上隅にある [デプロイ] をクリックします。 展開パネルが表示されます。
[基本情報] ステップで、クラスターと名前空間を選択し、[次へ] をクリックします。
[パラメーター] ステップで、バージョンを選択してパラメーターを設定し、[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をポッドに関連付けるかどうかを指定します。 有効な値:
|
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の計量方法。 有効な値:
詳細については、「EIPの申請」をご参照ください。 説明
|
k8s.aliyun.com/eip-charge-type (互换) | |
network.alibabacloud.com/eip-instance-charge-type k8s.aliyun.com/eip-instance-charge-type | EIP の課金方法。 有効な値:
詳細については、「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のラインタイプ。 有効な値:
詳細については、「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) がサポートされています。 複数の型はコンマで区切ります ( 説明 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リリースポリシー。 有効な値:
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セクションを参照してください。
アプリケーションを作成します。 次に、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.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
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.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: ""
StatefulSetのポッドが削除されると、EIPは10分間保持され、その後解放されます。 この期間中に同じ名前のポッドを作成した場合、ポッドは同じEIPを使用します。
設定を確認します。
ポッドのステータスが [実行中] に変わった後、ポッドのk8s.aliyun.com/allocated-eipAddressアノテーションの値を確認して、ポッドで使用されているEIPを識別できます。 次に、EIPを使用してポッドにアクセスできます。
Terwayを使用するクラスターでEIP機能を有効にする
Terwayを設定してEIPをサポートします。
次のコマンドを実行して、Terwayのeni_conf ConfigMapを変更します。
kubectl edit cm eni-config -n kube-system
次のコンテンツをeni_conf ConfigMapに追加します。
"enable_eip_pool": "true"
説明別のEIPを関連付ける前に既存のEIPの関連付けを解除する場合は、eni_conf ConfigMapに "allow_eip_rob": "true" を追加します。
ConfigMapを変更したら、Escキーを押します。 次に、入力します。: wq! Enterキーを押して変更したファイルを保存し、編集モードを終了します。
次のコマンドを実行して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.
EIPを作成してポッドに関連付けるアノテーションを追加します。
ポッドの構成にアノテーションを追加して、EIPを作成したり、ポッドに関連付けたりすることができます。 EIPの制限の詳細については、「制限」をご参照ください。
シナリオに基づいて注釈を追加します。
k8s.aliyun.com/pod-with-eip: "true"
: EIPのID。k8s.aliyun.com/eip-bandwidth: "5"
: EIPの最大帯域幅。 デフォルト値は5 Mbit/sで、EIPサービスで定義されているデフォルト値と同じです。EIPを複数のポッドに関連付けることはできません。 したがって、このアノテーションは、DeploymentsまたはStatefulSetsによって作成されたポッドには使用できません。
デフォルトでは、EIPがすでにポッドに関連付けられている場合、そのポッドに新しいEIPを作成することはできません。 既存のEIPの関連付けを解除して別のEIPを作成する場合は、前述の手順で説明したように、"allow_eip_rob": "true" 設定をeni_conf ConfigMapに追加します。
アプリケーションが1つのレプリケートポッドで実行される場合にのみ、既存のEIPを指定できます。 たとえば、デプロイメントを作成するときは、既存のEIPを関連付けることができるように、レプリカの値が1であることを確認します。
設定を確認します。
ポッドが [実行中] 状態になった後、ポッドのnetwork.alibabacloud.com/allocated-eipAddressアノテーションの値を確認して、ポッドで使用されているEIPを識別できます。 次に、EIPを使用してポッドにアクセスできます。
EIPを自動的に作成してポッドに関連付ける
次のアノテーションを追加して、EIPを自動的に作成してポッドに関連付け、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のIDを指定し、EIPをポッドに関連付けます。
k8s.aliyun.com/pod-eip-instanceid: "<youreipInstanceId>"
トラブルシューティング
ポッドのステータスが準備完了に変わるのはなぜですか?
コントローラが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