将 SNAT IP 池限制到特定的 Kebernetes 命名空间或 PCF 组织

可以通过在 SNAT IP 池中添加以下标记指定可为哪些 Kubernetes 命名空间或 PCF 组织分配 IP 池中的 IP。
  • 对于 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
请注意以下事项:
  • 每个标记应指定一个 UUID。可以为同一个池创建多个标记。
  • 如果根据旧标记为某些命名空间或组织分配 IP 后更改了标记,则 Kubernetes 服务或 PCF 应用程序的 SNAT 配置更改或 NCP 重新启动之前,将不会回收这些 IP。
  • 命名空间和 PCF 组织所有者标记是可选的。如果没有这些标记,任何命名空间或 PCF 组织的 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_POOL_ACCESS_DENY - 池的所有者标记与发送分配请求的服务的命名空间不匹配。
  • SNAT_RULE_OVERLAPPED - 创建新的 SNAT 规则,但 SNAT 服务的 pod 同时也属于其他 SNAT 服务,即,同一个 pod 有多个 SNAT 规则。
  • POOL_ACCESS_DENIED - ncp/snat_pool 指定的 IP 池没有标记 scope: ncp/owner, tag: cluster:<cluster_name>,或池的所有者标记与发送分配请求的服务的命名空间不匹配。
请注意以下事项:
  • 配置服务之前,ncp/snat_pool 指定的池应该已存在于 NSX-T Data Center 中。
  • NSX-T Data Center 中,服务 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>,或池的所有者标记与发送分配请求的命名空间不匹配。
请注意以下事项:
  • 只能在注释中指定一个 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 池。

为 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 规则。
  • 只能为应用程序配置一个 SNAT IP。
  • 可以通过更改配置并重新启动 NCP 来更改为不同的 IP 池。

为 PCF 版本 3 配置 SNAT

在 PCF 版本 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