特定の Kubernetes ネームスペースまたは TAS 組織への SNAT IP アドレス プールの制限

次のタグを IP アドレス プールに追加することで、SNAT の IP アドレス プールから IP アドレスを割り当てる Kubernetes のネームスペースまたは TAS 組織を指定できます。
  • Kubernetes ネームスペースの場合:scope: ncp/owner, tag: ns:<namespace_UUID>
  • TAS 組織の場合:scope: ncp/owner, tag: org:<org_UUID>
ネームスペースまたは組織の UUID は、次のいずれかのコマンドで取得できます。
kubectl get ns -o yaml
cf org <org_name> --guid
次の点に注意してください。
  • 各タグには 1 つの UUID を指定する必要があります。同じプールに対して複数のタグを作成できます。
  • 古いタグ ベースで一部のネームスペースまたは組織に IP アドレスが割り当てられた後にタグを変更すると、Kubernetes サービスまたは TAS アプリケーションの SNAT 構成が変更されるか NCP が再起動されるまで、割り当てられた IP アドレスは再利用されません。
  • ネームスペースと TAS 組織の所有者タグはオプションです。これらのタグがない場合、任意のネームスペースまたは TAS 組織に SNAT IP アドレス プールから IP アドレスを割り当てることができます。

サービスの SNAT IP アドレス プールの構成

サービスにアノテーションを追加して、サービスの SNAT IP アドレス プールを構成できます。次はその例です。
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-example
      annotations:
        ncp/snat_pool: <external IP pool ID or name>
      selector:
        app: example
    ...

ncp/snat_pool によって指定された IP プールには、scope: ncp/owner, tag: cluster:<cluster_name> タグが必要です。

NCP によって、このサービスの SNAT ルールが構成されます。このルールの送信元 IP アドレスは、一連のバックエンド ポッドです。宛先 IP アドレスは、指定した外部 IP アドレス プールから割り当てられた SNAT IP アドレスです。NCP で SNAT ルールを構成する際にエラーが発生すると、サービスには ncp/error.snat: <error> のアノテーションが追加されます。想定されるエラーは次のとおりです。
  • IP_POOL_NOT_FOUND - NSX Manager に SNAT IP アドレス プールがありません。
  • IP_POOL_EXHAUSTED - SNAT IP アドレス プールが枯渇しています。
  • IP_POOL_NOT_UNIQUE - ncp/snat_pool で指定されたプールが NSX Manager の複数のプールを参照しています。
  • SNAT_RULE_OVERLAPPED - 新しい SNAT ルールが作成されましたが、SNAT サービスのポッドが別の SNAT サービスに属しています。その結果、同一のポッドに複数の SNAT ルールが適用されています。
  • POOL_ACCESS_DENIED - ncp/snat_pool で指定された IP アドレス プールに scope: ncp/owner, tag: cluster:<cluster_name> タグがないか、プールの所有者タグが、割り当て要求を送信しているサービスのネームスペースと一致しないことを示します。エラーを修正した後は、NCP を再起動するか、ncp/snat_pool 注釈を削除してから再度追加する必要があります。
次の点に注意してください。
  • ncp/snat_pool で指定されたプールは、サービスを構成する前に NSX に配置しておく必要があります。
  • NSX では、サービスの SNAT ルールの優先順位はプロジェクトよりも高くなります。
  • ポッドに複数の SNAT ルールが構成されている場合は、1 つのルールのみが機能します。
  • アノテーションを変更して NCP を再起動することで、異なる IP アドレス プールに変更できます。

ネームスペースの SNAT IP アドレス プールの構成

ネームスペースにアノテーションを追加して、ネームスペースの SNAT IP アドレス プールを構成できます。次はその例です。
    apiVersion: v1
    kind: Namespace
    metadata:
      name: ns-sample
      annotations:
        ncp/snat_pool: <external IP pool ID or name>
    ...
NCP によって、このネームスペースに SNAT ルールが構成されます。このルールの送信元 IP アドレスは、一連のバックエンド ポッドです。宛先 IP アドレスは、指定した外部 IP アドレス プールから割り当てられた SNAT IP アドレスです。NCP で SNAT ルールを構成する際にエラーが発生すると、ネームスペースには ncp/error.snat: <error> のアノテーションが追加されます。想定されるエラーは次のとおりです。
  • IP_POOL_NOT_FOUND - NSX Manager に SNAT IP アドレス プールがありません。
  • IP_POOL_EXHAUSTED - SNAT IP アドレス プールが枯渇しています。
  • IP_POOL_NOT_UNIQUE - ncp/snat_pool で指定されたプールが NSX Manager の複数のプールを参照しています。
  • POOL_ACCESS_DENIED - ncp/snat_pool で指定された IP アドレス プールに scope: ncp/owner, tag: cluster:<cluster_name> タグがないか、プールの所有者タグが、割り当て要求を送信しているネームスペースと一致しないことを示します。エラーを修正した後は、NCP を再起動するか、ncp/snat_pool 注釈を削除してから再度追加する必要があります。
次の点に注意してください。
  • アノテーションでは、SNAT IP アドレス プールを 1 個のみ指定できます。
  • SNAT IP アドレス プールは、ncp.ini で構成する必要はありません。
  • ncp/snat_pool によって指定された IP プールには、scope: ncp/owner, tag: cluster:<cluster_name> タグが必要です。
  • ncp/snat_pool で指定される IP アドレス プールには、ネームスペース scope: ncp/owner, tag: ns:<namespace_UUID> タグも含める必要があります。
  • ncp/snat_pool アノテーションが見つからない場合、ネームスペースではクラスタの SNAT IP アドレス プールを使用します。
  • アノテーションを変更して NCP を再起動することで、異なる IP アドレス プールに変更できます。

サービスの SNAT IP アドレスの構成

サービスに注釈を追加して、サービスの SNAT IP アドレスを構成できます。次はその例です。
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-example
      annotations:
        ncp/static_snat_ip: "1.2.3.4"
    ...
注釈 ncp/snat_pool も指定されている場合は、SNAT IP アドレスが、指定された SNAT アドレス プールに含まれている必要があります。それ以外の場合は、 ncp.ini で指定された外部 IP プールに含まれている必要があります。エラーがない場合、NCP は、このサービスの注釈付きの SNAT IP アドレスを使用して、SNAT ルールを作成または更新します。サービスでは、SNAT ルールの構成状態に ncp/snat_ip_status の注釈が付きます。可能な値は次のとおりです。
  • IP_ALLOCATED_SUCCESSFULLY
  • IP_ALREADY_ALLOCATED - IP アドレスはすでに割り当てられています。
  • IP_NOT_IN_POOL - IP アドレスは SNAT IP プールに含まれていません。
  • IP_POOL_EXHAUSTED - SNAT IP アドレス プールが枯渇しています。
  • SNAT_PROCESS_FAILED - 不明なエラーが発生しました。

ネームスペースの SNAT IP アドレスの構成

ネームスペースに注釈を追加して、ネームスペースの SNAT IP アドレスを構成できます。次はその例です。
    apiVersion: v1
    kind: Namespace
    metadata:
      name: svc-example
      annotations:
        ncp/static_snat_ip: "1.2.3.4"
    ...
注釈 ncp/snat_pool も指定されている場合は、SNAT IP アドレスが、指定された SNAT アドレス プールに含まれている必要があります。それ以外の場合は、 ncp.ini で指定された外部 IP プールに含まれている必要があります。エラーがない場合、NCP は、このネームスペースの注釈付きの SNAT IP アドレスを使用して、SNAT ルールを作成または更新します。ネームスペースでは、SNAT ルールの構成状態に ncp/snat_ip_status の注釈が付きます。可能な値は次のとおりです。
  • IP_ALLOCATED_SUCCESSFULLY
  • IP_ALREADY_ALLOCATED - IP アドレスはすでに割り当てられています。
  • IP_NOT_IN_POOL - IP アドレスは SNAT IP プールに含まれていません。
  • IP_NOT_REALIZED - NSX でエラーが発生しました。
  • IP_POOL_EXHAUSTED - SNAT IP アドレス プールが枯渇しています。
  • SNAT_PROCESS_FAILED - 不明なエラーが発生しました。

TAS アプリケーションの SNAT プールの構成

NCP はデフォルトで、TAS (Tanzu Application Service) 組織用に SNAT の IP アドレスを構成します。SNAT の IP アドレス プールの情報が含まれた manifest.xml を使用してアプリケーションを作成し、アプリケーション用に SNAT IP アドレスを構成できます。次はその例です。
    applications:
      - name: frontend
        memory: 32M
        disk_quota: 32M
        buildpack: go_buildpack
        env:
          GOPACKAGENAME: example-apps/cats-and-dogs/frontend
          NCP_SNAT_POOL: <external IP pool ID or name>
    ...
NCP によって、このアプリケーションに SNAT ルールが構成されます。ルールの送信元 IP アドレスは一連のインスタンスの IP アドレスで、宛先 IP アドレスは、外部 IP アドレス プールから割り当てられた SNAT の IP アドレスです。次の点に注意してください。
  • NCP_SNAT_POOL で指定されたプールは、アプリケーションのプッシュ前に NSX に配置しておく必要があります。
  • アプリケーションの SNAT ルールの方が、組織の優先順位よりも高くなります。
  • アプリケーションに構成できる SNAT の IP アドレスは、1 つのみです。
  • 構成を変更してアプリケーションに再度プッシュすることで、異なる IP アドレス プールに変更できます。

TAS バージョン 3 の SNAT の構成

TAS バージョン 3 では、2 つのうち、いずれかの方法で SNAT を構成できます。

  • アプリケーションを作成するときに、manifest.ymlNCP_SNAT_POOL を構成します。
    たとえば、アプリケーションの名前が bread であり、 manifest.yml に次の情報が含まれているとします。
    applications:
    - name: bread
      stack: cflinuxfs2
      random-route: true
      env:
        NCP_SNAT_POOL: AppSnatExternalIppool
      processes:
      - type: web
        disk_quota: 1024M
        instances: 2
        memory: 512M
        health-check-type: port
      - type: worker
        disk_quota: 1024M
        health-check-type: process
        instances: 2
        memory: 256M
        timeout: 15
    次のコマンドを実行します。
    cf v3-push bread
    cf v3-apply-manifest -f manifest.yml
    cf v3-apps
    cf v3-restart bread
  • cf v3-set-env コマンドを使用して NCP_SNAT_POOL を構成します。
    次のコマンドを実行します(アプリケーションの名前が app3 であると仮定)。
    cf v3-set-env app3 NCP_SNAT_POOL AppSnatExternalIppool
    (optional) cf v3-stage app3 -package-guid <package-guid> (You can get package-guid with "cf v3-packages app3".)
    cf v3-restart app3

TAS 組織の SNAT IP プールまたは IP アドレスの構成

TAS 組織の SNAT IP プールまたは IP アドレスを構成するには、次の注釈を使用します。
  • ncp_snat_pool - プールが存在し、scope: ncp/owner, tag: cluster:<cluster_name> タグが付いている必要があります。
  • ncp_snat_ip - IP プール内の特定のアドレス。
次の点に注意してください。
  • ncp_snat_poolncp_snat_ip の両方が指定されている場合、SNAT IP アドレスは、指定された SNAT アドレス プールに含まれている必要があります。
  • ncp_snat_ip のみが指定されている場合、SNAT IP アドレスは ncp.ini で指定された外部 IP プールに含まれている必要があります。
  • ncp_snat_pool のみが指定されている場合、SNAT IP アドレスは、指定されたプールから割り当てられます。
cf curl コマンドを使用して、組織の SNAT IP アドレスを構成できます。次はその例です。
cf curl v3/organizations/<org-guid> -X PATCH  -d '{"metadata": {"annotations": {"ncp_snat_pool": "ann-ip-pool", "ncp_snat_ip": "1.2.3.4"}}}'
次のコマンドを使用して org-guid を取得できます。
cf org <org-name> --guid
次のコマンドで、 ncp_snat_ip 注釈を削除できます。
cf curl v3/organizations/<org-guid> -X PATCH  -d '{"metadata": {"annotations": {"ncp_snat_ip": null}}}'

NSX Manager ユーザー インターフェイスに移動して、SNAT ルールが正常に作成されているかどうかを確認できます。エラーを確認するには、NCP ログを参照します。

NCP ログに POOL_ACCESS_DENIED エラーがある場合、ncp_snat_pool で指定された IP プールに scope: ncp/owner, tag: cluster:<cluster_name> タグがないか、プールの所有者タグが、割り当て要求を送信している組織と一致しないことを示します。エラーを修正した後は、NCP を再起動するか、ncp_snat_pool 注釈を削除してから再度追加する必要があります。