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

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

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

NCP はデフォルトで、PAS (Pivotal 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-T Data Center に配置しておく必要があります。
  • アプリケーションの SNAT ルールの方が、組織の優先順位よりも高くなります。
  • アプリケーションに設定できる SNAT の IP アドレスは、1 つのみです。
  • 設定を変更して NCP を再起動することで、異なる IP アドレス プールに変更できます。

PCF バージョン 3 の SNAT の設定

PCF バージョン 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

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

PCF 組織の 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 UI に移動して、SNAT ルールが正常に作成されているかどうかを確認できます。エラーを確認するには、NCP ログを参照します。

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