将 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。
例如,应用程序称为 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