设置 Pod 的多网络支持


本页面介绍如何使用 Pod 的多网络支持,在 Google Kubernetes Engine (GKE) 集群中的节点和 Pod 上启用多个接口。 多网络支持仅适用于启用GKE Enterprise 的项目。

您应该已经熟悉一般网络概念、特定于此功能的术语和概念,以及 Pod 的多网络支持的要求和限制

如需了解详情,请参阅 Pod 的多网络支持简介

要求和限制

Pod 的多网络支持有以下要求和限制:

使用要求

一般限制

  • Pod 的多网络支持不适用于启用了双栈网络的集群。
  • 多 Pod CIDR 不适用于启用了多网络的集群。
  • 单个 GKE 集群中的任何 Pod 网络不能具有重叠的 CIDR 范围。
  • 启用 Pod 的多网络支持后,您无法在创建节点池后添加或移除节点网络接口或 Pod 网络。如需更改这些设置,您必须重新创建节点池。
  • 默认情况下,Pod 内的 Pod 网络的其他接口无法访问互联网。但是,您可以使用 Cloud NAT 手动启用该功能。
  • 您无法通过 API 更改具有多个接口的 Pod 中的默认网关。默认网关必须连接到默认 Pod 网络。
  • 默认 Pod 网络必须始终包含在 Pod 中,即使您创建其他 Pod 网络或接口也是如此。
  • 配置代管式 Hubble 后,便无法配置多网络功能。

设备和数据平面开发套件 (DPDK) 限制

  • 作为 Device 类型 NIC 传入 Pod 的虚拟机 NIC 不能用于同一节点上的其他 Pod。
  • 使用 DPDK 模式的 Pod 必须在特权模式下运行才能访问 VFIO 设备。
  • 在 DPDK 模式中,设备被视为节点资源,并且仅关联到 Pod 中的第一个容器(非 init)。如果您要在同一 Pod 中的容器之间拆分多个 DPDK 设备,则需要在不同的 Pod 中运行这些容器。

规模限制

GKE 提供灵活的网络架构,使您可以扩缩集群。您可以向集群添加其他节点网络和 Pod 网络,但需遵循以下限制:

  • 您最多可以向每个 GKE 节点池添加 7 个额外的节点网络。这与 Compute Engine 虚拟机的扩缩限制相同。
  • 每个 Pod 连接的额外网络必须少于 7 个。
  • 一个节点池内的 8 个节点网络中最多可配置 35 个 Pod 网络。您可以将其分为不同的组合,例如:
    • 7 个节点网络,每个节点网络有 5 个 Pod 网络
    • 5 个节点网络,每个节点网络有 7 个 Pod 网络
    • 1 个节点网络,其中包含 30 个 Pod 网络。每个子网的次要范围限制为 30 个。
  • 每个集群最多可以配置 50 个 Pod 网络。
  • 每个节点最多可以配置 32 个多网络 Pod。
  • 最多可以有 3,000 个具有多个接口的节点。
  • 所有 Pod 最多可以有 100,000 个额外接口。
  • 最多可以配置 1,000 个具有 Device 类型网络的节点。
  • 每个节点最多可以配置 4 个 Device 类型网络。

价格

只有启用了 GKE Enterprise 的项目中的集群才支持 Network Function Optimizer (NFO) 功能,包括对 Pod 的多网络和高性能支持。如需了解启用 Google Kubernetes Engine (GKE) Enterprise 版本的相关费用,请参阅 GKE Enterprise 价格

部署多网络 Pod

如需部署多网络 Pod,请完成以下任务:

  1. 准备额外 VPC、子网(节点网络)和次要范围(Pod 网络)。
  2. 使用 Google Cloud CLI 命令创建启用多网络的 GKE 集群
  3. 使用 Google Cloud CLI 命令创建新的 GKE 节点池,该节点池连接到其他节点网络和 Pod 网络。
  4. 使用 Kubernetes API 创建 Pod 网络,并引用多网络对象中的正确 VPC、子网和次要范围。
  5. 在工作负载配置中,使用 Kubernetes API 引用准备好的 Network Kubernetes 对象。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

准备额外 VPC

Google Cloud 会在集群创建期间创建默认 Pod 网络,该网络与 GKE 集群初始创建期间所使用的 GKE 节点池相关联。所有集群节点和 Pod 都可以使用默认 Pod 网络。如需便于在节点池中使用多网络功能,您必须准备好支持 Layer 3Device 类型网络的现有 VPC 或新的 VPC。

如需准备好额外 VPC,请考虑以下要求:

  • Layer 3Netdevice 类型网络:

    • 如果您使用 Layer 3 类型网络,请创建次要范围。
    • 请确保次要范围的 CIDR 大小能够满足您需要的节点池中的节点数以及每个节点的 Pod 数。
    • 与默认 Pod 网络类似,其他 Pod 网络使用 IP 地址超额预配。次要 IP 地址范围中每个节点的 IP 地址数必须是每个节点的 Pod 数的两倍。
  • Device 类型网络要求:在 VPC 上创建常规子网。您不需要次要子网。

如需在节点池中启用多网络功能,您必须准备好要建立额外连接的 VPC。您可以使用现有 VPC,也可以专门为节点池创建新的 VPC

创建支持 Layer 3 类型设备的 VPC 网络

如需创建支持 Layer 3 类型设备的 VPC 网络,请执行以下操作:

  • 请确保次要范围的 CIDR 大小能够满足您需要的节点池中的节点数以及每个节点的 Pod 数。
  • 与默认 Pod 网络类似,其他 Pod 网络使用 IP 地址超额预配。次要 IP 地址范围中每个节点的 IP 地址数必须是每个节点的 Pod 数的两倍。

gcloud

gcloud compute networks subnets create SUBNET_NAME \
    --project=PROJECT_ID \
    --range=SUBNET_RANGE \
    --network=NETWORK_NAME \
    --region=REGION \
    --secondary-range=SECONDARY_RANGE_NAME=<SECONDARY_RANGE_RANGE>

替换以下内容:

  • SUBNET_NAME:子网的名称。
  • PROJECT_ID:包含创建子网的 VPC 网络的项目的 ID。
  • SUBNET_RANGE:新子网的主要 IPv4 地址范围(采用 CIDR 表示法)。
  • NETWORK_NAME:包含新子网的 VPC 网络的名称。
  • REGION:创建新子网的 Google Cloud 区域。
  • SECONDARY_RANGE_NAME:次要范围的名称。
  • SECONDARY_IP_RANGE:次要 IPv4 地址范围(采用 CIDR 表示法)。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

  2. 点击创建 VPC 网络

  3. 名称字段中,输入网络的名称。例如 l3-vpc

  4. 最大传输单元 (MTU) 下拉列表中,选择相应的 MTU 值。

  5. 子网创建模式部分,选择自定义

  6. 点击添加子网

  7. 新子网部分,为子网指定以下配置参数:

    1. 提供名称。 例如 l3-subnet

    2. 选择区域

    3. 输入 IP 地址范围。这是子网的主要 IPv4 范围

      如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围

    4. 如需为子网定义次要范围,请点击创建次要 IP 地址范围

      如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围

    5. 专用 Google 访问通道:您可以在创建子网时为它启用专用 Google 访问通道,也可以稍后通过修改来启用。

    6. 流日志:您可以在创建子网时为它启用 VPC 流日志,也可以稍后通过修改来启用。

    7. 点击完成

  8. 防火墙规则部分中的 IPv4 防火墙规则下,选择零个或更多预定义防火墙规则

    这些规则适用于实例连接的常见使用场景。 您可以在创建网络之后创建自己的防火墙规则。每个预定义的规则名称都以您创建的 VPC 网络的名称开头。

  9. IPv4 防火墙规则下,如需修改名为 allow-custom 的预定义入站流量防火墙规则,请点击修改

    您可以修改子网、添加其他 IPv4 范围以及指定协议和端口。

    如果您以后添加其他子网,allow-custom 防火墙规则不会自动更新。如果需要将防火墙规则用于新子网,则必须更新防火墙配置才能添加规则。

  10. 动态路由模式部分中,针对 VPC 网络。 如需了解详情,请参阅动态路由模式。稍后,您可以更改动态路由模式

  11. 点击创建

创建支持 NetdeviceDPDK 类型设备的 VPC 网络

gcloud

gcloud compute networks subnets create SUBNET_NAME \
    --project=PROJECT_ID \
    --range=SUBNET_RANGE \
    --network=NETWORK_NAME \
    --region=REGION \
    --secondary-range=SECONDARY_RANGE_NAME=<SECONDARY_RANGE_RANGE>

替换以下内容:

  • SUBNET_NAME:子网的名称。
  • PROJECT_ID:包含创建子网的 VPC 网络的项目的 ID。
  • SUBNET_RANGE:新子网的主要 IPv4 地址范围(采用 CIDR 表示法)。
  • NETWORK_NAME:包含新子网的 VPC 网络的名称。
  • REGION:创建新子网的 Google Cloud 区域。
  • SECONDARY_RANGE_NAME:次要范围的名称。
  • SECONDARY_IP_RANGE:次要 IPv4 地址范围(采用 CIDR 表示法)。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

  2. 点击创建 VPC 网络

  3. 名称字段中,输入网络的名称。例如 netdevice-vpcdpdk-vpc

  4. 最大传输单元 (MTU) 下拉列表中,选择相应的 MTU 值。

  5. 子网创建模式部分,选择自定义

  6. 新子网部分,为子网指定以下配置参数:

    1. 提供名称。 例如 netdevice-subnetdpdk-vpc

    2. 选择区域

    3. 输入 IP 地址范围。这是子网的主要 IPv4 范围

      如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围

    4. 专用 Google 访问通道:选择是在创建子网时为它启用专用 Google 访问通道,还是稍后通过修改来启用。

    5. 流日志:您可以在创建子网时为它启用 VPC 流日志,也可以稍后通过修改来启用。

    6. 点击完成

  7. 防火墙规则部分中的 IPv4 防火墙规则下,选择零个或更多预定义防火墙规则

    这些规则适用于实例连接的常见使用场景。 您可以在创建网络之后创建自己的防火墙规则。每个预定义的规则名称都以您创建的 VPC 网络的名称开头。

  8. IPv4 防火墙规则下,如需修改名为 allow-custom 的预定义入站流量防火墙规则,请点击修改

    您可以修改子网、添加其他 IPv4 范围以及指定协议和端口。

    如果您以后添加其他子网,allow-custom 防火墙规则不会自动更新。如果需要将防火墙规则用于新子网,则必须更新防火墙配置才能添加规则。

  9. 动态路由模式部分中,针对 VPC 网络。 如需了解详情,请参阅动态路由模式。稍后,您可以更改动态路由模式

  10. 点击创建

创建具有多网络功能的 GKE 集群

gcloud

如需创建具有多网络功能的 GKE 集群,请运行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=CLUSTER_VERSION \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-multi-networking

请替换以下内容:

  • CLUSTER_NAME:集群的名称。
  • CLUSTER_VERSION:集群的版本。

此命令包含以下标志:

  • --enable-multi-networking: 在此集群的 API 服务器中启用多网络自定义资源定义 (CRD),并部署 network-controller-manager,其中包含多网络对象的协调和生命周期管理。
  • --enable-dataplane-v2: 启用 GKE Dataplane V2。此标志是启用多网络所必需的。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 配置标准集群。如需了解详情,请参阅创建可用区级集群创建区域级集群。 创建集群时,选择相应的网络和节点子网。

  4. 在导航窗格的集群下,点击网络

  5. 选中启用 Dataplane V2 复选框。

  6. 选择启用多网络

  7. 点击创建

为集群启用多网络会向该集群的 API 服务器添加必要的 CustomResourceDefinition (CRD)。还会部署一个 network-controller-manager,它负责协调和管理多网络对象。集群配置一经创建便无法修改。

创建连接到额外 VPC 的 GKE 节点池

创建一个节点池,其中包含连接到创建 Pod 网络中创建的节点网络(VPC 和子网)和 Pod 网络(次要范围)的节点。

如需创建新节点池并将其与 GKE 集群中的其他网络关联,请运行以下命令:

gcloud

gcloud container node-pools create POOL_NAME \
  --cluster=CLUSTER_NAME \
  --additional-node-network network=NETWORK_NAME,subnetwork=SUBNET_NAME \
  --additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=POD_IP_RANGE,max-pods-per-node=NUMBER_OF_PODS \
  --additional-node-network network=highperformance,subnetwork=subnet-highperf

替换以下内容:

  • POOL_NAME 替换为新节点池的名称。
  • CLUSTER_NAME 替换为要向其添加节点池的现有集群的名称。
  • NETWORK_NAME 替换为要连接节点池节点的网络的名称。
  • SUBNET_NAME 替换为网络中要用于节点的子网的名称。
  • POD_IP_RANGE 是子网中的 Pod IP 地址范围。
  • NUMBER_OF_PODS 是每个节点的 Pod 数上限。

此命令包含以下标志:

  • --additional-node-network:指定额外的网络接口、网络和子网的详细信息。它指定用于连接到节点池节点的节点网络。如果要连接到另一个 VPC,请指定此参数。如果未指定此参数,则使用与集群关联的默认 VPC。对于 Layer 3 类型网络,请指定 additional-pod-network 标志,它用于定义在 GKE 集群内作为 Network 对象公开的 Pod 网络。使用 --additional-node-network 标志时,网络和子网是必需参数。请务必使用英文逗号分隔网络和子网值,并避免使用空格。
  • --additional-pod-network:指定用于 Pod 网络的次要范围的详细信息。如果您使用 Device 类型网络,则此参数不是必需的。此参数指定以下键值对:subnetworkpod-ipv4-rangemax-pods-per-node。使用 --additional-pod-network 时,您必须提供 pod-ipv4-rangemax-pods-per-node 值(以英文逗号分隔,不含空格)。
    • subnetwork:将节点网络与 Pod 网络相关联。子网是可选参数。如果未指定,则额外的 Pod 网络将与集群创建期间提供的默认子网关联。
    • --max-pods-per-node:必须指定 max-pods-per-node,且必须是 2 的幂。最小值为 4。max-pods-per-node 不得大于节点池中的 max-pods-per-node 值。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在导航窗格中,点击集群

  3. Kubernetes 集群部分中,点击您创建的集群。

  4. 在页面顶部,点击 添加节点池以创建节点池。

  5. 节点池详情部分,完成以下操作:

    1. 输入节点池名称
    2. 输入要在节点池中创建的节点数
  6. 在导航窗格的节点池下,点击节点

    1. 映像类型下拉列表中,选择包含 Containerd 的 Container-Optimized OS (cos_containerd) 节点映像。

  7. 创建虚拟机时,您可以从某个机器系列中选择一个机器类型以确定该虚拟机可用的资源。例如,e2-standard-4 等机器类型包含 4 个 vCPU,因此总共最多可支持 4 个 VPC。您可以从多个机器系列 (family) 中进行选择,每个机器系列 (family) 又进一步分为机器系列 (series) 和每个系列 (series) 中的预定义或自定义机器类型。每种机器类型的计费方式都各不相同。如需了解详情,请参阅机器类型价格表

  8. 从导航窗格中,选择网络

  9. 节点网络部分中,指定每个节点的 Pod 数上限。“节点网络”部分会显示用于创建集群的 VPC 网络。您需要指定与之前建立的 VPC 网络和设备类型相关的额外节点网络。

  10. 创建节点池关联:

    1. 对于 Layer 3 类型设备:
      1. 节点网络部分中,点击添加节点网络
      2. 从网络下拉列表中,选择支持第 3 层类型设备的 VPC
      3. 选择为 Layer 3 VPC 创建的子网
      4. 别名 Pod IP 地址范围部分中,点击添加 Pod IP 地址范围
      5. 选择次要子网并指明每个节点的 Pod 数上限
      6. 选择完成
    2. 对于 NetdeviceDPDK 类型设备:
      1. 节点网络部分中,点击添加节点网络
      2. 从网络下拉列表中选择支持 NetdeviceDPDK 类型设备的 VPC
      3. 选择为 NetdeviceDPDK VPC 创建的子网
      4. 选择完成
  11. 点击创建

注意

  • 如果在同一节点网络中指定了多个额外的 Pod 网络,则它们必须位于同一子网中。
  • 您不能多次引用子网的同一次要范围。

示例 以下示例创建一个名为 pool-multinet 的节点池,该节点池将两个额外网络连接到节点,即 datapalane(Layer 3 类型网络)和 highperformance(netdevice 类型网络)。此示例假定您已创建名为 cluster-1 的 GKE 集群:

gcloud container node-pools create pool-multi-net \
  --project my-project \
  --cluster cluster-1 \
  --zone us-central1-c \
  --additional-node-network network=dataplane,subnetwork=subnet-dp \
  --additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-blue,max-pods-per-node=8 \
  --additional-node-network network=highperformance,subnetwork=subnet-highperf

如需指定额外的节点网络和 Pod 网络接口,请多次指定 --additional-node-network--additional-pod-network 参数,如以下示例所示:

--additional-node-network network=dataplane,subnetwork=subnet-dp \
--additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-blue,max-pods-per-node=8 \
--additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-green,max-pods-per-node=8 \
--additional-node-network network=managementdataplane,subnetwork=subnet-mp \
--additional-pod-network subnetwork=subnet-mp,pod-ipv4-range=sec-range-red,max-pods-per-node=4

如需直接在节点池的主要 VPC 接口上指定其他 Pod 网络,如以下示例所示:

--additional-pod-network subnetwork=subnet-def,pod-ipv4-range=sec-range-multinet,max-pods-per-node=8

创建 Pod 网络

如需定义 Pod 将访问的 Pod 网络,请定义 Kubernetes 对象并将其关联到相应的 Compute Engine 资源,例如 VPC、子网和次要范围。

如需创建 Pod 网络,您必须在集群中定义网络 CRD 对象。

配置 Layer 3 VPC 网络

YAML

对于 Layer 3 VPC,请创建 NetworkGKENetworkParamSet 对象:

  1. 将以下示例清单保存为 blue-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: blue-network
    spec:
      type: "L3"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "l3-vpc"
    

    此清单定义了一个名为 blue-network 且类型为 Layer 3Network 资源。Network 对象引用名为 l3-vpcGKENetworkParamSet 对象,将网络与 Compute Engine 资源相关联。

  2. 将清单应用于集群:

    kubectl apply -f blue-network.yaml
    
  3. 将以下清单保存为 dataplane.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: "l3-vpc"
    spec:
      vpc: "l3-vpc"
      vpcSubnet: "subnet-dp"
      podIPv4Ranges:
        rangeNames:
        - "sec-range-blue"
    

    此清单定义了名为 dataplaneGKENetworkParamSet 对象,将 VPC 名称设置为 dataplane,子网名称设置为 subnet-dp,Pod 的次要 IPv4 地址范围名称设置为 sec-range-blue

  4. 将清单应用于集群:

    kubectl apply -f dataplane.yaml
    

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在导航窗格中,点击 Network Function Optimizer

  3. 点击启用 GKE Enterprise

  4. 在页面顶部,点击 创建以创建 Pod 网络。

  5. 准备工作部分中,验证详细信息。

  6. 点击下一步:Pod 网络位置

  7. Pod 网络位置部分的集群下拉列表中,选择启用了多网络和 GKE Dataplane V2 的 GKE 集群。

  8. 点击下一步:VPC 网络引用

  9. VPC 网络引用部分的 VPC 网络引用下拉列表中,选择用于 Layer 3 多 NIC Pod 的 VPC 网络。

  10. 点击下一步:Pod 网络类型

  11. Pod 网络类型部分中,选择 L3,然后输入 Pod 网络名称

  12. 点击下一步:Pod 网络次要范围

  13. Pod 网络次要范围部分中,输入次要范围

  14. 点击下一步:Pod 网络路由

  15. Pod 网络路由部分中,如需定义自定义路由,请选择添加路由

  16. 点击创建 Pod 网络

配置 DPDK 网络

YAML

对于 DPDK VPC,请创建 NetworkGKENetworkParamSet 对象。

  1. 将以下示例清单保存为 dpdk-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: dpdk-network
    spec:
      type: "Device"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "dpdk"
    

    此清单定义了一个名为 dpdk-network 且类型为 DeviceNetwork 资源。Network 资源引用了名为 dpdkGKENetworkParamSet 对象作为其配置。

  2. 将清单应用于集群:

    kubectl apply -f dpdk-network.yaml
    
  3. 对于 GKENetworkParamSet 对象,请将以下清单保存为 dpdk.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: "dpdk"
    spec:
      vpc: "dpdk"
      vpcSubnet: "subnet-dpdk"
      deviceMode: "DPDK-VFIO"
    

    此清单定义了名为 dpdkGKENetworkParamSet 对象,将 VPC 名称设置为 dpdk,子网名称设置为 subnet-dpdk,deviceMode 名称设置为 DPDK-VFIO

  4. 将清单应用于集群:

    kubectl apply -f dpdk-network.yaml
    

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在导航窗格中,点击 Network Function Optimizer

  3. 在页面顶部,点击 创建以创建 Pod 网络。

  4. 准备工作部分中,验证详细信息。

  5. 点击下一步:Pod 网络位置

  6. Pod 网络位置部分的集群下拉列表中,选择启用了多网络和 GKE Dataplane V2 的 GKE 集群。

  7. 点击下一步:VPC 网络引用

  8. VPC 网络引用部分的 VPC 网络引用下拉列表中,选择用于 dpdk 多 NIC Pod 的 VPC 网络。

  9. 点击下一步:Pod 网络类型

  10. Pod 网络类型部分中,选择 DPDK-VFIO(设备),然后输入 Pod 网络名称

  11. 点击下一步:Pod 网络次要范围。 Pod 网络次要范围部分将不可用

  12. 点击下一步:Pod 网络路由。 在“Pod 网络路由”部分中,选择“添加路由”以定义自定义路由

  13. 点击创建 Pod 网络

配置 netdevice 网络

对于 netdevice VPC,请创建 NetworkGKENetworkParamSet 对象。

YAML

  1. 将以下示例清单保存为 netdevice-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
        name: netdevice-network
    spec:
        type: "Device"
        parametersRef:
          group: networking.gke.io
          kind: GKENetworkParamSet
          name: "netdevice"
    

    此清单定义了一个名为 netdevice-network 且类型为 DeviceNetwork 资源。它引用名为 netdeviceGKENetworkParamSet 对象。

  2. 将清单应用于集群:

    kubectl apply -f netdevice-network.yaml
    
  3. 将以下清单保存为 netdevice.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: netdevice
    spec:
      vpc: netdevice
      vpcSubnet: subnet-netdevice
      deviceMode: NetDevice
    

    此清单定义了一个名为 netdeviceGKENetworkParamSet 资源,将 VPC 名称设置为 netdevice,子网名称设置为 subnet-netdevice,并将设备模式指定为 NetDevice

  4. 将清单应用于集群:

    kubectl apply -f netdevice.yaml
    

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在导航窗格中,点击 Network Function Optimizer

  3. 在页面顶部,点击 创建以创建 Pod 网络。

  4. 准备工作部分中,验证详细信息。

  5. 点击下一步:Pod 网络位置

  6. Pod 网络位置部分的集群下拉列表中,选择启用了多网络和 GKE Dataplane V2 的 GKE 集群。

  7. 点击下一步:VPC 网络引用

  8. VPC 网络引用部分的 VPC 网络引用下拉列表中,选择用于 netdevice 多 NIC Pod 的 VPC 网络。

  9. 点击下一步:Pod 网络类型

  10. Pod 网络类型部分中,选择 NetDevice(设备),然后输入 Pod 网络名称

  11. 点击下一步:Pod 网络次要范围。 Pod 网络次要范围部分将不可用

  12. 点击下一步:Pod 网络路由。 在“Pod 网络路由”部分中,如需定义自定义路由,请选择添加路由

  13. 点击创建 Pod 网络

配置网络路由

通过配置网络路由,您可以为特定网络指定自定义路由,这些路由在 Pod 上设置以将流量定向到 Pod 中的相应接口。

YAML

  1. 将以下清单保存为 red-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: red-network
    spec:
      type: "L3"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "management"
      routes:
      -   to: "10.0.2.0/28"
    

    此清单定义了一个名为 red-network 且其类型为 Layer 3 的网络资源,以及通过该网络接口的自定义路由“10.0.2.0/28”。

  2. 将清单应用于集群:

    kubectl apply -f red-network.yaml
    

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 在导航窗格中,点击 Network Function Optimizer

  4. Kubernetes 集群部分中,点击您创建的集群。

  5. 在页面顶部,点击 创建以创建 Pod 网络。

  6. Pod 网络路由部分中,定义自定义路由

  7. 点击创建 Pod 网络

引用准备好的 Network

在工作负载配置中,使用 Kubernetes API 引用准备好的 Network Kubernetes 对象。

将 Pod 连接到特定网络

如需将 Pod 连接到指定网络,您必须在 Pod 配置中添加 Network 对象的名称作为注解。请确保在注解中同时添加 default Network 和所选的其他网络以建立连接。

  1. 将以下示例清单保存为 sample-l3-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-l3-pod
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"l3-network"}
          ]
    spec:
      containers:
      - name: sample-l3-pod
        image: busybox
        command: ["sleep", "10m"]
        ports:
        - containerPort: 80
      restartPolicy: Always
    

    此清单创建一个名为 sample-l3-pod 的 Pod,它具有两个网络接口 eth0eth1,分别与 defaultblue-network 网络关联。

  2. 将清单应用于集群:

    kubectl apply -f sample-l3-pod.yaml
    

将 Pod 连接到多个网络

  1. 将以下示例清单保存为 sample-l3-netdevice-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-l3-netdevice-pod
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"l3-network"},
            {"interfaceName":"eth2","network":"netdevice-network"}
          ]
    spec:
      containers:
      - name: sample-l3-netdevice-pod
        image: busybox
        command: ["sleep", "10m"]
        ports:
        - containerPort: 80
      restartPolicy: Always
    

    此清单创建一个名为 sample-l3-netdevice-pod 的 Pod,它具有三个网络接口 eth0eth1eth2,分别与 defaultl3-networknetdevice 网络关联。

  2. 将清单应用于集群:

    kubectl apply -f sample-l3-netdevice-pod.yaml
    

您可以在模板的注解部分的任何 ReplicaSet(Deployment 或 DaemonSet)中使用相同的注解。

在创建具有多网络规范的 Pod 时,数据平面组件会自动生成 Pod 的接口配置并将其保存到 NetworkInterface CR。为 Pod 规范中指定的每个非默认 Network 创建一个 NetworkInterface CR。

例如,以下清单显示 NetworkInterface 清单中的详细信息:

apiVersion: v1
items:
-   apiVersion: networking.gke.io/v1
  kind: NetworkInterface
  metadata:
    labels:
      podName: samplepod
    name: "samplepod-c0b60cbe"
    namespace: default
  spec:
    networkName: "blue-network"
  status:
    gateway4: 172.16.1.1
    ipAddresses:
    -   172.16.1.2/32
    macAddress: 82:89:96:0b:92:54
    podName: samplepod

此清单包含网络名称、网关地址、分配的 IP 地址、MAC 地址和 Pod 名称。

具有多个接口的 Pod 的配置示例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default
    link/ether 2a:92:4a:e5:da:35 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.60.45.4/24 brd 10.60.45.255 scope global eth0
      valid_lft forever preferred_lft forever
10: eth1@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default qlen 1000
    link/ether ba:f0:4d:eb:e8:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.2/32 scope global eth1
      valid_lft forever preferred_lft forever

验证

  • 如果启用了 --enable-dataplane-v2,确保仅使用 --enable-multi-networking 创建集群。
  • 在创建集群和节点池时,验证集群中的所有节点池都运行着 Container-Optimized OS 映像。
  • 如果在集群上启用了多网络,验证仅使用 --additional-node-network--additional-pod-network 创建节点池。
  • 确保未使用节点池的 --additional-node-network 参数两次指定同一子网。
  • 验证未使用节点池的 --additional-pod-network 参数指定相同的次要范围。
  • 遵循为网络对象指定的扩容限制,包括允许的节点、Pod 和 IP 地址数上限。
  • 验证只有一个 GKENetworkParamSet 对象引用一个特定的子网和次要范围。
  • 验证每个网络对象都引用了不同的 GKENetworkParamSet 对象。
  • 如果网络对象是使用 Device 类型的特定子网创建的,验证该网络对象没有在与具有次要范围的另一个网络相同的节点上使用。您只能在运行时验证这一点。
  • 验证分配给节点池的各个次要范围没有重叠的 IP 地址。

排查 GKE 中的多网络参数问题

在您创建集群和节点池时,Google Cloud 会实施某些检查,以确保仅允许有效的多网络参数。这可确保为集群正确设置网络。

如果您的多网络工作负载创建失败,则可以查看 Pod 状态和事件了解详情:

kubectl describe pods samplepod

输出类似于以下内容:

Name:         samplepod
Namespace:    default
Status:       Running
IP:           192.168.6.130
IPs:
  IP:  192.168.6.130
...
Events:
  Type     Reason                  Age   From               Message
  ----     ------                  ----  ----               -------
  Normal   Scheduled               26m   default-scheduler  Successfully assigned default/samplepod to node-n1-04
  Warning  FailedCreatePodSandBox  26m   kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "e16c58a443ab70d671159509e36894b57493300ea21b6c24c14bdc412b0fdbe6": Unable to create endpoint: [PUT /endpoint/{id}][400] putEndpointIdInvalid  failed getting interface and network CR for pod "default/samplepod": failed creating interface CR default/samplepod-c0b60cbe: admission webhook "vnetworkinterface.networking.gke.io" denied the request: NetworkInterface.networking.gke.io "samplepod-c0b60cbe" is invalid: Spec.NetworkName: Internal error: failed to get the referenced network "sample-network": Network.networking.gke.io "sample-network" not found
...

以下是 Pod 创建失败的一般原因:

  • 由于不符合多网络资源要求,未能安排 Pod
  • 未能识别指定网络
  • 未能为 Pod 配置和创建网络接口对象

如需检查 Google Cloud 是否已在 API 服务器中创建了 NetworkInterface 对象,请运行以下命令:

kubectl get networkinterfaces.networking.gke.io -l podName=samplepod

排查 Kubernetes 网络创建问题

成功创建网络后,应有权访问已配置网络的节点将具有网络状态注解。

如需查看注解,请运行以下命令:

kubectl describe node NODE_NAME

NODE_NAME 替换为该节点的名称。

输出类似于以下内容:

networking.gke.io/network-status: [{"name":"default"},{"name":"dp-network"}]

输出列出了节点上可用的每个网络。如果节点上未显示预期的网络状态,请进行以下检查:

检查节点是否可以访问网络

如果网络未显示在节点的网络状态注解中,请执行以下操作:

  1. 验证该节点属于为多网络配置的节点池。
  2. 检查节点的接口,确定其是否具有您要配置的网络的接口。
  3. 如果节点缺少网络状态并且只有一个网络接口,您必须仍然创建启用多网络的节点池。
  4. 如果节点包含您配置的网络的接口,但网络状态注解中未显示该网络,请检查 NetworkGKENetworkParamSet (GNP) 资源。

检查 NetworkGKENetworkParamSet 资源

NetworkGKENetworkParamSet (GNP) 资源的状态都包含用于报告配置错误的条件字段。我们建议您先检查 GNP,因为它的有效性不依赖于其他资源。

如需检查条件字段,请运行以下命令:

kubectl get gkenetworkparamsets GNP_NAME -o yaml

GNP_NAME 替换为 GKENetworkParamSet 资源的名称。

Ready 条件等于 true 时,配置有效,且输出类似于以下内容:

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
...
spec:
  podIPv4Ranges:
    rangeNames:
    -   sec-range-blue
  vpc: dataplane
  vpcSubnet: subnet-dp
status:
  conditions:
  -   lastTransitionTime: "2023-06-26T17:38:04Z"
    message: ""
    reason: GNPReady
    status: "True"
    type: Ready
  networkName: dp-network
  podCIDRs:
    cidrBlocks:
    -   172.16.1.0/24

Ready 条件等于 false 时,输出显示原因,且类似于以下内容:

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
...
spec:
  podIPv4Ranges:
    rangeNames:
    -   sec-range-blue
  vpc: dataplane
  vpcSubnet: subnet-nonexist
status:
  conditions:
  -   lastTransitionTime: "2023-06-26T17:37:57Z"
    message: 'subnet: subnet-nonexist not found in VPC: dataplane'
    reason: SubnetNotFound
    status: "False"
    type: Ready
  networkName: ""

如果您遇到类似消息,请确保您的 GNP 已正确配置。如果它已正确配置,请确保您的 Google Cloud 网络配置正确无误。更新 Google Cloud 网络配置后,您可能需要重新创建 GNP 资源以手动触发重新同步。这是为了避免 Google Cloud API 的无限轮询。

GNP 准备就绪后,检查 Network 资源。

kubectl get networks NETWORK_NAME -o yaml

NETWORK_NAME 替换为 Network 资源的名称。

有效配置的输出类似于以下内容:

apiVersion: networking.gke.io/v1
kind: Network
...
spec:
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: dp-gnp
  type: L3
status:
  conditions:
  -   lastTransitionTime: "2023-06-07T19:31:42Z"
    message: ""
    reason: GNPParamsReady
    status: "True"
    type: ParamsReady
  -   lastTransitionTime: "2023-06-07T19:31:51Z"
    message: ""
    reason: NetworkReady
    status: "True"
    type: Ready
  • reason: NetworkReady 表示 Network 资源配置正确。reason: NetworkReady 并不意味着 Network 资源必然在特定节点上可用或正在被使用。
  • 如果存在错误配置或错误,条件中的 reason 字段会指明问题的确切原因。在这种情况下,请相应地调整配置。
  • 如果将 parametersRef 字段设置为集群中存在的 GKENetworkParamSet 资源,GKE 会填充 ParamsReady 字段。如果您指定了 GKENetworkParamSet 类型 parametersRef,但条件未显示,请确保名称、种类和组与集群中存在的 GNP 资源匹配。

后续步骤