ゲームやピアツーピア (P2P) アプリケーションなどのシナリオでは、クライアントが Pod に直接アクセスする必要があることがよくあります。従来は、Elastic IP アドレス (EIP) を Pod に割り当てることでアクセスを有効にできましたが、この方法には EIP の数に関する制限やセキュリティ管理の課題などの問題がありました。NAT Gateway 上で EIP を設定し、その宛先ネットワークアドレス変換 (DNAT) 機能を使用することで、Pod のアクセスエンドポイントを公開できます。これにより、使用する EIP の数を削減できます。
前提条件
-
ACK マネージドクラスターまたはACK 専用クラスターが作成されていること。クラスターはネットワークプラグインとして Terway を使用する必要があります。詳細については、「ACK マネージドクラスターの作成」および「ACK 専用クラスターの作成 (新規作成は停止)」をご参照ください。
-
VPC 内に NAT Gateway が作成され、natgw コントローラーが使用されていること。NAT Gateway の作成方法の詳細については、「インターネット NAT Gateway」をご参照ください。
-
パブリック IP アドレス、パブリックポート、プライベートポート、およびプライベート IP アドレスをマッピングするための DNAT ルールが作成されていること。DNAT の仕組みの詳細については、「インターネット NAT Gateway の DNAT 機能を使用して ECS インスタンスがインターネット経由でサービスを提供できるようにする」をご参照ください。
-
パブリック IP アドレス:インターネット NAT Gateway に設定された EIP。
-
パブリックポート:natgw コントローラーの設定ファイル内の
portRangeStartおよびportRangeEndパラメーターで指定された範囲内のポート。ポートは natgw コントローラーによって自動的に割り当てられます。ポートが割り当てられると、その情報はpoddnats.alibabacloud.comカスタムリソース (CR) に記録されます。CR は Pod と同じ名前を持ちます。 -
プライベートポート:Pod のアノテーションで設定された Pod のリスニングポート。
-
プライベート IP アドレス:Pod の IP アドレス。
-
制限事項
-
この機能は通常の ECS ノードをサポートしますが、ECI インスタンスはサポートしません。
-
設定可能なエントリ数は NAT Gateway によって制限されます。制限の詳細については、「DNAT 機能に関するよくある質問」をご参照ください。
Pod のアノテーション
以下の Pod アノテーションを使用できます。
|
Pod のアノテーション |
値 |
|
k8s.aliyun.com/pod-dnat |
Pod の DNAT 機能を有効にします。値を |
|
k8s.aliyun.com/pod-dnat-expose-port |
Pod のリスニングポート。複数のポートを指定するには、カンマで区切ります。例: |
|
k8s.aliyun.com/pod-dnat-expose-protocol |
プロトコルタイプ。有効な値は |
|
k8s.aliyun.com/pod-dnat-fixed |
ステートフルコンテナの設定の永続化を有効にします。 |
セキュリティグループの設定:Pod のセキュリティグループにインバウンドルールを追加して、公開ポートでのトラフィックを許可します。
ack-extend-network-controller で DNAT 機能を有効化
ack-extend-network-controller コンポーネントは、リソースを作成するために Alibaba Cloud OpenAPI にアクセスする必要があります。これを行うには、Resource Access Management (RAM) で必要な権限を設定し、マーケットプレイスから ack-extend-network-controller コンポーネントをインストールする必要があります。その後、アノテーションを使用して、特定の Pod の DNAT ルールを作成し、関連付けることができます。
ステップ 1:DNAT に必要な RAM 権限の設定
ACK クラスター
Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。
-
クラスター情報 ページの 基本情報 タブで、Worker RAM ロール の右側にあるリンクをクリックします。
-
以下の内容を含むカスタムポリシーを作成します。詳細については、「ステップ 1:カスタムポリシーの作成」をご参照ください。
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} } -
クラスターのワーカー RAM ロールに権限を付与します。詳細については、「ステップ 2:クラスターのワーカー RAM ロールに権限を付与する」をご参照ください。
ACK サーバーレスクラスター
RAM ユーザーの AccessKey ペアを作成します。詳細については、「RAM ユーザーの作成」および「カスタムポリシーの作成」をご参照ください。
ステップ 2:ack-extend-network-controller コンポーネントで natgw コントローラーを有効化
ack-extend-network-controller コンポーネントをインストールし、natgw コントローラーを有効にします。ack-extend-network-controller コンポーネントのインストール方法の詳細については、「マーケットプレイス」をご参照ください。
natgw コントローラーの設定パラメーターは次のとおりです。
clusterID: "c11ba338192xxxxxxx" # 実際の値を入力します。
regionID: "cn-hangzhou" # 実際の値を入力します。
vpcID: "vpc-bp1rkq0zxxxxxx" # 実際の値を入力します。
enableControllers:
- natgw # DNAT を有効にします。
networkController:
natGwPool:
- natgwId: "< nat gateway id. >" # インターネット NAT Gateway の ID。
zoneId: "< nat gateway zone id. cn-hangzhou-j >" # インターネット NAT Gateway のゾーン ID。
portRangeStart: 512 # 開始ポート。
portRangeEnd: 1024 # 終了ポート。
eips:
- "<auto config all nat gateway eips if not config. 0.0.0.0 >" # インターネット NAT Gateway の EIP。このパラメーターを設定しない場合、ゲートウェイに設定されているすべての EIP が使用されます。
credential: # AccessKey ペアを使用します。ACK クラスターの場合、RAM ロールモードを使用して設定します。ステップ 1 でクラスターのワーカー RAM ロールに権限を付与した場合、このセクションを設定する必要はありません。
accessKey: ""
accessSecret: ""
カスタムリソース (CR) を使用した設定の追跡
-
Pod を作成すると、コントローラーは Pod と同じ名前の CR を作成します。次の例は、Pod の DNAT ルールを設定して、Pod のポート 80 をパブリックネットワークに公開する方法を示しています。
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-dnat: "" k8s.aliyun.com/pod-dnat-expose-port: "80" spec: containers: - name: example image: nginx -
次のコマンドを実行して
poddnats.alibabacloud.comから割り当て情報を読み取り、Pod の外部アドレスとポートを取得します。kubectl get poddnats -oyaml想定される出力:
apiVersion: alibabacloud.com/v1 kind: PodDNAT metadata: creationTimestamp: "20**-09-20T03:26:44Z" finalizers: - natgw-controller generation: 2 name: example-6cd498d7b-9**** namespace: default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true kind: Pod name: example-6cd498d7b-9**** uid: 7af54e1c-eeb7-4fd0-b070-ff99ddbd**** resourceVersion: "357150" uid: 2fad9bb7-cc84-46b4-b6eb-5d15f06c**** spec: eni: eni-xxx externalIP: 114.55.**.** internalIP: 172.16.**.** portMapping: - externalPort: "512" internalPort: "80" protocol: tcp tableId: ngw-xxx vswitch: vsw-xxx zoneID: cn-hangzhou-k status: entries: - externalIP: 114.55.**.** externalPort: "512" forwardEntryId: fwd-xxx internalIP: 172.16.**.** internalPort: "80" ipProtocol: tcpPod の外部アドレスとポートは次のように記述されます。
-
externalIP:NAT Gateway のパブリック IP アドレス。これは外部アクセスのためのアドレスです。この例では、値は114.55.**.**です。 -
externalPort:パブリックポート。コントローラーは、指定されたポート範囲からこのポートを割り当てます。この例では、値は"512"です。
-