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

Container Service for Kubernetes:NAT Gateway の DNAT ルールを使用した Pod への直接アクセス

最終更新日:Mar 07, 2026

ゲームやピアツーピア (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 機能を有効にします。値を true に設定するか、空 ("") のままにして機能を有効にします。DNAT 機能を無効にするには、DNAT 関連のすべてのアノテーションを削除します。

k8s.aliyun.com/pod-dnat-expose-port

Pod のリスニングポート。複数のポートを指定するには、カンマで区切ります。例:"80,443"

k8s.aliyun.com/pod-dnat-expose-protocol

プロトコルタイプ。有効な値は tcpudp です。デフォルト値は tcp です。

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 クラスター

  1. Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。

  3. クラスター情報 ページの 基本情報 タブで、Worker RAM ロール の右側にあるリンクをクリックします。

  4. 以下の内容を含むカスタムポリシーを作成します。詳細については、「ステップ 1:カスタムポリシーの作成」をご参照ください。

    {
          "Effect": "Allow",
          "Action": [
            "ecs:DescribeNetworkInterfaces",
            "vpc:DescribeNatGateways",
            "vpc:DescribeForwardTableEntries",
            "vpc:CreateForwardEntry",
            "vpc:DescribeEipAddresses",
            "vpc:DeleteForwardEntry",
            "vpc:DescribeRouteTableList",
            "vpc:DescribeRouteEntryList"
          ],
          "Resource": [
            "*"
          ],
          "Condition": {}
        }
  5. クラスターのワーカー 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) を使用した設定の追跡

  1. 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
  2. 次のコマンドを実行して 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: tcp

    Pod の外部アドレスとポートは次のように記述されます。

    • externalIP:NAT Gateway のパブリック IP アドレス。これは外部アクセスのためのアドレスです。この例では、値は 114.55.**.** です。

    • externalPort:パブリックポート。コントローラーは、指定されたポート範囲からこのポートを割り当てます。この例では、値は "512" です。