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

Container Service for Kubernetes:ポッドを公開するためのDNATの設定

最終更新日:Nov 21, 2024

ゲームやP2Pのシナリオでは、elastic IPアドレス (EIP) をポッドに割り当てる代わりに、アプリケーションポッドをクライアントに直接公開する必要がある場合があります。 従来のモードでは、EIPを使用してポッドを公開できます。 ただし、ポッドに割り当てることができるEIPの数は限られており、セキュリティ管理が必要です。 この場合、インターネットNATゲートウェイのDNATルールを設定し、インターネットNATゲートウェイを使用してポッドを公開できます。 この方法では、EIPをインターネットNATゲートウェイに関連付けるだけで済み、使用するEIPの数が減ります。

前提条件

  • ACK管理クラスターまたはACK専用クラスターが作成され、Terwayがインストールされます。 詳細については、「マネージドACKクラスターの作成」および「専用ACKクラスターの作成」をご参照ください。

  • インターネットNATゲートウェイは、クラスターがデプロイされている仮想プライベートクラウド (VPC) に作成されます。 インターネットNATゲートウェイを作成すると、natgwコントローラーが有効になります。 インターネットNATゲートウェイの作成方法の詳細については、「インターネットNATゲートウェイの作成と管理」をご参照ください。

  • パブリックIPアドレスとプライベートIPアドレス間のマッピングを指定するDNATルール、およびパブリックポートとプライベートポート間のマッピングが作成されます。 DNATの詳細については、「ECSインスタンスのインターネットNATゲートウェイでのDNATの設定」をご参照ください。

    • インターネットNATゲートウェイに関連付けられているEIPにパブリックIPアドレスを設定します。

    • パブリックポート: natgwコントローラーは、natgwの構成ファイルのportRangeStartパラメーターとportRangeEndパラメーターで指定されたポート範囲からパブリックポートを自動的に割り当てます。 割り当てられたポートは、ポッドにちなんで名付けられたカスタムリソースオブジェクトのpoddnats.alibabacloud.comフィールドに記録されます。

    • ポッドがリッスンするポートにプライベートポートを設定します。

    • プライベートIPアドレスをポッドのIPアドレスに設定します。

制限事項

  • IPv6インターネット帯域幅は、ECSインスタンスで実行されるポッドにのみ割り当てることができ、ECI (elastic container instances) で実行されるポッドには割り当てられません。

  • インターネットNATゲートウェイでサポートされるDNATルールの数は、ゲートウェイのタイプによって異なります。 詳細については、「DNATに関するFAQ」をご参照ください。

ポッドの設定

次の表に、ポッドの設定を示します。

ポッドの注釈

k8s.aliyun.com/pod-dnat

ポッドのDNATを有効にします。 このパラメータは空のままです。

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

ポッドがリッスンするポート。 複数のポートはコンマ (,) で区切ります。 例: '80,443 '。

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

使用するプロトコル。 有効な値: tcpおよびudp デフォルト値: tcp

k8s.aliyun.com/pod-dnat-fixed

このアノテーションを追加した後、ポッドがステートフルアプリケーション用に作成されている場合、ポッドのDNAT設定は変更されません。

重要

ポッドで公開されているポートへのインバウンドトラフィックを許可するには、ポッドのセキュリティグループルールを設定する必要があります。

ack-extend-network-controllerのDNATを有効にする

ack-extend-network-controllerは、リソースを作成するためにOpenAPI Explorerにアクセスする必要があります。 ack-extend-network-controllerにResource Access Management (RAM) 権限を付与し、ackコンソールでマーケットプレイスからACK-extend-network-controllerをインストールし、DNATルールを作成し、アノテーションを追加して特定のポッドに関連付ける必要があります。

ステップ1: DNATでRAM権限を付与する

  • ACKクラスターの場合:

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。

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

    4. カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。

      {
            "Effect": "Allow",
            "Action": [
              "ecs:DescribeNetworkInterfaces",
              "vpc:DescribeNatGateways",
              "vpc:DescribeForwardTableEntries",
              "vpc:CreateForwardEntry",
              "vpc:DescribeEipAddresses",
              "vpc:DeleteForwardEntry",
              "vpc:DescribeRouteTableList",
              "vpc:DescribeRouteEntryList"
            ],
            "Resource": [
              "*"
            ],
            "Condition": {}
          }
    5. クラスターのワーカーRAMロールにカスタムポリシーをアタッチします。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのワーカーRAMロールにカスタムポリシーをアタッチするセクションをご参照ください。

  • ACKサーバーレスクラスター:

    RAMユーザーのAccessKeyペアを生成します。 詳細については、「RAMユーザーの作成」および「カスタムポリシーの作成」をご参照ください。

ステップ2: ack-extend-network-controllerのnatgwコントローラを有効にする

ack-extend-network-controllerをインストールし、natgwコントローラを有効にします。 ack-extend-network-controllerのインストール方法の詳細については、「App Marketplace」をご参照ください。

natgwコントローラに次のパラメータを指定します。

clusterID: "c11ba338192xxxxxxx"          # Specify the actual value. 
regionID: "cn-hangzhou"                  # Specify the actual value. 
vpcID: "vpc-bp1rkq0zxxxxxx"              # Specify the actual value. 
enableControllers:
  - natgw                                  # Enable DNAT. 

networkController:
  natGwPool:
    - natgwId: "< nat gateway id. >"                   # The ID of the Internet NAT gateway. 
      zoneId: "< nat gateway zone id. cn-hangzhou-j >" # The zone ID of the Internet NAT gateway. 
      portRangeStart: 512                              # The first port. 
      portRangeEnd: 1024                               # The last port. 
      eips:
        - "<auto config all nat gateway eips if not config. 0.0.0.0 >"  # Specify an EIP that is associated with the Internet NAT gateway. If you leave this parameter empty, all EIPs associated with the Internet NAT gateway are used. 

credential:                               # Specify an AccessKey pair. For ACK clusters, we recommend that you use the RamRole mode. You do not need to configure this parameter if you granted permissions to the worker RAM role of the cluster in step 1.
  accessKey: ""
  accessSecret: ""

カスタムリソースオブジェクトを使用してポッドのDNAT設定を追跡する

ポッドを作成すると、natgwコントローラーは、ポッドにちなんで名付けられたPodDNATオブジェクトを自動的に作成します。 次のYAMLテンプレートを使用してデプロイを作成します。 この例では、ポッドのポート80をインターネットに公開するためにDNAT設定が追加されています。

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にアクセスし、ポッドのパブリックIPアドレスとパブリックポートを取得します。

kubectl get poddnats -oyaml 

期待される結果

apiVersion: alibabacloud.com/v1
kind: PodDNAT
metadata:
  creationTimestamp: "2022-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

パラメーター:

  • externalPort: ポッドのプライベートポートにマップされているパブリックポート。 ポートは、指定されたポート範囲からnatgwコントローラによって割り当てられます。

  • externalIP: 外部アクセス用のNATゲートウェイのEIP。