您需要配置的 NSX-T Data Center 资源包括覆盖网络传输区域、Tier-0 逻辑路由器、用于连接节点虚拟机的逻辑交换机、Kubernetes 节点的 IP 块以及 SNAT 的 IP 池。

重要事项: 如果与 NSX-T Data Center 2.4 或更高版本一起运行,则必须使用 高级网络和安全选项卡配置 NSX-T 资源。

在 NCP 配置文件 ncp.ini 中,使用 UUID 或名称指定 NSX-T Data Center 资源。

覆盖网络传输区域

登录到 NSX Manager,然后导航到系统 > Fabric > 传输区域。查找用于容器网络的覆盖网络传输区域,或者创建新的传输区域。

通过在 ncp.ini[nsx_v3] 部分中设置 overlay_tz 选项来指定集群的覆盖网络传输区域。此步骤是可选的。如果未设置 overlay_tz,NCP 将自动从 Tier-0 路由器检索覆盖网络传输区域 ID。

Tier-0 逻辑路由

登录到 NSX Manager,然后导航到高级网络和安全 > 网络 > 路由器。查找用于容器网络的路由器,或者创建新的路由器。

通过在 ncp.ini[nsx_v3] 部分中设置 tier0_router 选项来指定集群的 Tier-0 逻辑路由器。

注: 必须在活动-备用模式下创建路由器。

逻辑交换机

节点用于数据流量的 vNIC 必须连接到覆盖网络逻辑交换机。不要求将节点的管理接口连接到 NSX-T Data Center,但这样做将简化设置过程。通过登录到 NSX Manager,然后导航到 高级网络和安全 > 网络 > 交换 > 交换机,可以创建逻辑交换机在交换机上创建逻辑端口,并将节点 vNIC 连接到这些端口。逻辑端口必须具有以下标记:
  • 标记:<cluster_name>,范围:ncp/cluster
  • 标记:<node_name>,范围:ncp/node_name
<cluster_name> 值必须与 ncp.ini[coe] 部分中的 cluster 选项值匹配。

Kubernetes pod 的 IP 块

登录到 NSX Manager,然后导航到高级网络和安全 > 网络 > IPAM 以创建一个或多个 IP 块。使用 CIDR 格式指定 IP 块。

通过在 ncp.ini[nsx_v3] 部分中设置 container_ip_blocks 选项来指定 Kubernetes pod 的 IP 块。

您也可以专门为非 SNAT 命名空间(对于 Kubernetes)或集群(对于 PCF)创建 IP 块。

通过在 ncp.ini[nsx_v3] 部分中设置 no_snat_ip_blocks 选项来指定非 SNAT IP 块。

如果在 NCP 运行时创建非 SNAT IP 块,您必须重新启动 NCP。否则,NCP 将继续使用共享 IP 块,直到这些块用尽。

注: 在创建 IP 块时,前缀不能大于 NCP 配置文件 ncp.ini 中的 subnet_prefix 参数值。有关详细信息,请参见 ncp-rc.yml 中的 ncp.ini 的 ConfigMap

SNAT 的 IP 池

将使用 NSX Manager 中的 IP 池分配 IP 地址,这些地址将用于通过 SNAT 规则转换 pod IP 以及通过 SNAT/DNAT 规则公开 Ingress 控制器,就像 Openstack 浮动 IP 一样。这些 IP 地址也称为外部 IP。

多个 Kubernetes 集群使用相同的外部 IP 池。每个 NCP 实例将该池的一部分用于它管理的 Kubernetes 集群。默认情况下,将使用 pod 子网的相同子网前缀。要使用不同的子网大小,请更新 ncp.ini[nsx_v3] 部分中的 external_subnet_prefix 选项。

可以通过在 ncp.ini[nsx_v3] 部分中设置 external_ip_pools 选项来指定 SNAT 的 IP 池。

可以通过更改配置文件并重新启动 NCP 来更改为不同的 IP 池。

将 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

(可选)(仅适用于 Kubernetes)防火墙标记区域

要允许管理员创建防火墙规则且不干扰 NCP 基于网络策略创建的防火墙区域,请登录到 NSX Manager,导航到安全 > 分布式防火墙 > 常规并创建两个防火墙区域。

通过在 ncp.ini[nsx_v3] 部分中设置 bottom_firewall_section_markertop_firewall_section_marker 选项来指定标记防火墙区域。

底部防火墙区域必须在顶部防火墙区域的下方。创建这些防火墙区域后,NCP 创建的用于隔离的所有防火墙区域将创建在底部防火墙区域的上方,NCP 创建的用于策略的所有防火墙区域将创建在顶部防火墙区域的下方。如果未创建这些标记区域,则将在底部创建所有隔离规则,在顶部创建所有策略区域。不支持每个集群中多个标记防火墙区域采用相同的值,这将会导致错误。