将 SNAT IP 池限制到特定 Kubernetes 命名空间或 TAS 组织

可以通过在 SNAT IP 池中添加以下标记指定可为哪些 Kubernetes 命名空间或 TAS 组织分配 IP 池中的 IP。
  • 对于 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
请注意以下事项:
  • 每个标记应指定一个 UUID。可以为同一个池创建多个标记。
  • 如果根据旧标记为某些命名空间或组织分配 IP 后更改了标记,则 Kubernetes 服务或 TAS 应用程序的 SNAT 配置更改或 NCP 重新启动之前,将不会回收这些 IP。
  • 命名空间和 TAS 组织所有者标记是可选的。如果没有这些标记,任何命名空间或 TAS 组织的 IP 都可以从 SNAT 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 为后端 pod 集。目标 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 服务的 pod 同时也属于其他 SNAT 服务,即,同一个 pod 有多个 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 规则。
  • 如果 pod 配置了多个 SNAT 规则,则只有一个起作用。
  • 可以通过更改注释并重新启动 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 为后端 pod 集。目标 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 池。
  • 无需在 ncp.ini 中配置 SNAT IP 池。
  • 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 规则。
  • 只能为应用程序配置一个 SNAT IP。
  • 可以通过更改配置并重新推送应用程序来更改为不同的 IP 池。

为 TAS 版本 3 配置 SNAT

在 TAS 版本 3 中,可以通过以下两种方法之一配置 SNAT:

  • 创建应用程序时,在 manifest.yml 中配置 NCP_SNAT_POOL
    例如,应用程序称为 breadmanifest.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 IP 池中。
  • 如果仅指定 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 注释,然后重新添加。