将 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。
例如,应用程序称为 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_pool 和 ncp_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 注释,然后重新添加。