网络要求

本文档概述了在裸机上安装和运行 Google Distributed Cloud(纯软件)的网络要求。

本页面适用于管理底层技术基础设施的生命周期并为其组织设计和架构网络的管理员、架构师、运维人员和网络专家。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务

外部网络要求

Google Distributed Cloud 需要连接到互联网才能运行。Google Distributed Cloud 从 Container Registry 检索集群组件,并且集群已向 Connect Agent 注册。

您可以使用公共互联网,通过 HTTPS、虚拟专用网 (VPN) 或专用互连连接连接到 Google。

如果您用于管理员工作站和集群节点的机器使用代理服务器访问互联网,则您的代理服务器必须允许一些特定连接。如需了解详情,请参阅在代理后安装的前提条件部分。

内部网络要求

Google Distributed Cloud 可与集群节点之间的第 2 层或第 3 层连接搭配使用。负载均衡器节点可以是控制平面节点,也可以是一组专用节点。如需了解详情,请参阅选择和配置负载均衡器

当您使用与 MetalLB 的捆绑式第 2 层负载均衡spec.loadBalancer.mode: bundledspec.loadBalancer.type: layer2)时,负载均衡器节点需要第 2 层相邻负载。无论您是在控制平面节点还是一组专用负载均衡节点上运行负载均衡器,第 2 层相邻要求都适用。使用 BGP 进行捆绑式负载均衡支持第 3 层协议,因此不需要严格的第 2 层相邻连接。

负载均衡器机器的要求如下:

  • 对于捆绑式第 2 层负载均衡,给定集群的所有负载均衡器都在同一个第 2 层网域中。控制平面节点还必须位于同一个第 2 层网域中。
  • 对于捆绑式第 2 层负载均衡功能,所有虚拟 IP 地址 (VIP) 都必须位于负载均衡器机器子网中,并且可路由到子网的网关。
  • 用户负责允许入站流量负载均衡器流量。

Pod 和 Service 网络

集群配置文件中指定了可供服务和 Pod 使用的 IP 地址范围。以下部分介绍了地址范围的最小和最大限制,以及规划集群安装时需要考虑的一些相关因素。

您可以在集群中拥有的 Pod 和 Service 数量由以下设置控制:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: admin-basic
  namespace: cluster-admin-basic
spec:
  type: admin
  profile: default
  ...
  clusterNetwork:
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/20
  ...
  nodeConfig:
    podDensity:
      maxPodsPerNode: 250

Pod 和 Service 的 IP 地址范围

您可以将一个 IP 地址范围指定为要用于 Pod 的无类别域间路由 (CIDR) 块,并将另一个 CIDR 块指定为要用于 Kubernetes 服务的 ClusterIP 地址。使用专用地址空间中的 IP 地址,如 RFC 1918 中所述。集群配置文件中预先填充的值应在下表中所述的限制范围内:

限制 pod 服务
最小范围 /18 的掩码值(16,384 个地址) /24 的掩码值(256 个地址)
预填充的范围 /16 的掩码值(65,536 个地址) 掩码值为 /20(4,096 个地址)
最大范围 /8 的掩码值(16,777,216 个地址) /12 的掩码值(1,048,576 个地址)

为避免与网络中可访问的 IP 地址重叠,您可能需要使用与预填充值不同的 CIDR 范围。具体来说,Service 和 pod 范围不得与以下各项重叠:

  • 任何集群中节点的 IP 地址

  • 控制平面节点和负载均衡器使用的 VIP 地址

  • DNS 服务器或 NTP 服务器的 IP 地址

如果发现重叠的 IP 地址,预检检查会阻止创建和升级集群。

创建集群后,您可以增加服务网络范围 (clusterNetwork.services.cidrBlocks),但无法减少分配的 IP 地址数量或进行更改。您只能更改 CIDR 地址块后缀,通过缩小掩码值来增加 IP 地址数量。

clusterNetwork.pods.cidrBlocksnodeConfig.podDensity.maxPodsPerNode(在下一部分中介绍)都是不可变的,因此请仔细规划集群的未来增长,以免节点容量耗尽。如需了解基于测试的每个集群的 Pod 数、每个节点的 Pod 数和每个集群的节点数的建议上限,请参阅限制

每个节点的最大 Pod 数量

在裸机上,Google Distributed Cloud 允许您为每个节点配置最多 250 个 pod。Kubernetes 会为每个节点分配一个 CIDR 地址块,以便每个 pod 都可以有一个唯一的 IP 地址。pod CIDR 块的大小对应于每个节点的最大 pod 数量。

下表列出了 Kubernetes 根据每个节点的配置的最大 pod 数量分配给每个节点的 CIDR 地址块的大小:

每个节点的最大 Pod 数量 每个节点的 CIDR 地址块 IP 地址数量
32 /26 64
33-64 /25 128
65-128 /24 256
129-250 /23 512

若要在每个节点运行 250 个 pod,则需要 Kubernetes 为每个节点预留 /23 CIDR 地址块。假设您的集群为 clusterNetwork.pods.cidrBlocks 字段使用默认值 /16,则集群的节点数上限为 (2(23-16))=128 个。

如果您打算让该集群超出此上限,我们强烈建议您将 clusterNetwork.pods.cidrBlocks 设置为比预先填充的值大得多的 pod CIDR 块。

如需详细了解 Pod 和 Service 的数量以及其他因素如何影响集群可伸缩性,请参阅扩容 Google Distributed Cloud 集群

具有高可用性的单用户集群部署

下图通过一种可能的网络配置介绍了 Google Distributed Cloud 的一些关键网络概念。

Google Distributed Cloud 典型网络配置

请考虑以下信息以满足网络要求:

  • 控制平面节点运行负载均衡器,并且它们都具有第 2 层连接,而其他连接(包括工作器节点)只需要第 3 层连接。
  • 配置文件定义工作器节点池的 IP 地址。配置文件还定义用于以下用途的 VIP:
    • 服务
    • 入站
    • 通过 Kubernetes API 访问控制层面
  • 您需要连接到 Google Cloud。

端口使用量

本部分确定了 Google Distributed Cloud 集群的端口要求。下表展示了集群和负载均衡器节点上的 Kubernetes 组件如何使用 UDP 和 TCP 端口。

控制平面节点

1.29 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和健康状况 kube-apiserveretcd
TCP 入站 2382 - 2384 etcd-events 服务器客户端 API、指标和健康状况 kube-apiserveretcd-events
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 6444 Kubernetes API 服务器 全部
TCP 入站 9100 auth-proxy node-exporter
TCP 入站 9101 仅在 localhost 上提供节点指标

(适用于 1.28 版及更高版本)

node-exporter
TCP 入站 9977 从 API 服务器接收审核事件 audit-proxy
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 10257 kube-controller-manager

(1.28 版及更高版本的端口号已更改)

本身
TCP 入站 10259 kube-scheduler

(1.28 版及更高版本的端口号已更改)

本身
TCP 入站 11002 GKE Identity Service 核心容器通过 hostPort 绑定到端口

(适用于 1.29 版及更高版本)

本身
TCP 入站 14443 ANG Webhook 服务 kube-apiserverang-controller-manager

1.28 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和健康状况 kube-apiserveretcd
TCP 入站 2382 - 2384 etcd-events 服务器客户端 API、指标和健康状况 kube-apiserveretcd-events
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 6444 Kubernetes API 服务器 全部
TCP 入站 8444 GKE Identity Service 核心容器通过 hostPort 绑定到端口

(仅适用于 1.28 版)

全部
TCP 入站 9100 auth-proxy node-exporter
TCP 入站 9101 仅在 localhost 上提供节点指标

(适用于 1.28 版及更高版本)

node-exporter
TCP 入站 9977 从 API 服务器接收审核事件 audit-proxy
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 10257 kube-controller-manager

(1.28 版及更高版本的端口号已更改)

本身
TCP 入站 10259 kube-scheduler

(1.28 版及更高版本的端口号已更改)

本身
TCP 入站 14443 ANG Webhook 服务 kube-apiserverang-controller-manager

1.16 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和健康状况 kube-apiserveretcd
TCP 入站 2382 - 2384 etcd-events 服务器客户端 API、指标和健康状况

(适用于 1.16 版及更高版本)

kube-apiserveretcd-events
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 6444 Kubernetes API 服务器 全部
TCP 入站 9100 提供指标 node-exporter
TCP 入站 9443 为控制平面组件提供/代理指标(此端口要求适用于集群 1.16 版及更低版本。) kube-control-plane-metrics-proxy
TCP 入站 9977 从 API 服务器接收审核事件 audit-proxy
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10251 kube-scheduler 本身
TCP 入站 10252 kube-controller-manager 本身
TCP 入站 10256 节点健康检查 全部
TCP 入站 14443 ANG Webhook 服务 kube-apiserverang-controller-manager

1.15 版及更低版本

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和健康状况 kube-apiserveretcd
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 6444 Kubernetes API 服务器 全部
TCP 入站 9100 提供指标 node-exporter
TCP 入站 9443 为控制平面组件提供/代理指标(此端口要求适用于集群 1.16 版及更低版本。) kube-control-plane-metrics-proxy
TCP 入站 9977 从 API 服务器接收审核事件 audit-proxy
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10251 kube-scheduler 本身
TCP 入站 10252 kube-controller-manager 本身
TCP 入站 10256 节点健康检查 全部
TCP 入站 14443 ANG Webhook 服务 kube-apiserverang-controller-manager

工作器节点

1.29 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 9100 auth-proxy node-exporter
TCP 入站 9101 仅在 localhost 上提供节点指标

(适用于 1.28 版及更高版本)

node-exporter
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 30000 - 32767 NodePort 项服务 本身

1.28 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 9100 auth-proxy node-exporter
TCP 入站 9101 仅在 localhost 上提供节点指标

(适用于 1.28 版及更高版本)

node-exporter
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 30000 - 32767 NodePort 项服务 本身

1.16 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 9100 提供指标 node-exporter
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 30000 - 32767 NodePort 项服务 本身

1.15 版及更低版本

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 9100 提供指标 node-exporter
TCP 入站 10250 kubelet API 自行控制平面
TCP 入站 10256 节点健康检查 全部
TCP 入站 30000 - 32767 NodePort 项服务 本身

负载均衡器节点

1.29 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 入站 443 集群管理

您可以使用 controlPlaneLBPort 字段在集群配置文件中配置此端口。

全部
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 和 UDP 入站 7946 MetalLB 健康检查 负载均衡器节点
TCP 入站 10256 节点健康检查 全部
TCP 入站 11000 HAProxy 指标的监听端口(不可变)

(适用于 1.29 版及更高版本)

全部
TCP 入站 11001 GKE Identity Service 的监听端口(不可变)

(适用于 1.29 版及更高版本)

全部

1.28 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 入站 443 集群管理

您可以使用 controlPlaneLBPort 字段在集群配置文件中配置此端口。

全部
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 和 UDP 入站 7946 MetalLB 健康检查 负载均衡器节点
TCP 入站 8443 GKE Identity Service 的监听端口(不可变)

(仅适用于 1.28 版)

全部
TCP 入站 10256 节点健康检查 全部

1.16 版

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 入站 443 集群管理

您可以使用 controlPlaneLBPort 字段在集群配置文件中配置此端口。

全部
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 7946 MetalLB 健康检查 负载均衡器节点
TCP 入站 10256 节点健康检查 全部

1.15 版及更低版本

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新用户集群节点 管理员集群节点
TCP 入站 443 集群管理

您可以使用 controlPlaneLBPort 字段在集群配置文件中配置此端口。

全部
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 7946 MetalLB 健康检查 负载均衡器节点
TCP 入站 10256 节点健康检查 全部

多集群端口要求

在多集群配置中,添加的集群必须包含以下端口才能与管理员集群通信。

协议 方向 端口范围 用途 使用者
TCP 入站 22 预配和更新集群节点 所有节点
TCP 入站 443 用于添加集群的 Kubernetes API 服务器

您可以使用 controlPlaneLBPort 字段在集群配置中配置此端口。

控制平面和负载均衡器节点

配置 firewalld 端口

您无需停用 firewalld 即可在 Red Hat Enterprise Linux (RHEL) 上运行 Google Distributed Cloud。如需使用 firewalld,您必须打开控制平面节点、工作器节点和负载均衡器节点使用的 UDP 和 TCP 端口,如本页面上的端口使用情况中所述。以下示例配置展示了如何使用 firewalld 命令行实用程序 firewall-cmd 打开端口。您应以根用户身份运行这些命令。

控制平面节点示例配置

以下命令块展示了如何在运行控制平面节点的服务器上打开所需端口的示例:

firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --permanent --zone=public --add-port=4240/tcp
firewall-cmd --permanent --zone=public --add-port=6444/tcp
firewall-cmd --permanent --zone=public --add-port=6081/udp
firewall-cmd --permanent --zone=public --add-port=10256/tcp
firewall-cmd --permanent --zone=public --add-port=10257/tcp
firewall-cmd --permanent --zone=public --add-port=10259/tcp
firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --permanent --new-zone=k8s-pods
firewall-cmd --permanent --zone=k8s-pods --add-source PODS_CIDR
firewall-cmd --permanent --zone=k8s-pods --set-target=ACCEPT
firewall-cmd --reload

如需了解您打算使用的集群版本的特定端口要求,请参阅上述端口使用情况部分。相应地更新示例命令。

PODS_CIDR 替换为为 clusterNetwork.pods.cidrBlocks 字段中配置的 pod 预留的 CIDR 地址块。Pod 的默认 CIDR 地址块是 192.168.0.0/16

工作器节点示例配置

以下命令块展示了如何在运行工作器节点的服务器上打开所需端口的示例:

firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --permanent --zone=public --add-port=4240/tcp
firewall-cmd --permanent --zone=public --add-port=6444/tcp
firewall-cmd --permanent --zone=public --add-port=6081/udp
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=10256/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --permanent --new-zone=k8s-pods
firewall-cmd --permanent --zone=k8s-pods --add-source PODS_CIDR
firewall-cmd --permanent --zone=k8s-pods --set-target=ACCEPT
firewall-cmd --reload

如需了解您打算使用的集群版本的特定端口要求,请参阅上述端口使用情况部分。相应地更新示例命令。

PODS_CIDR 替换为为 clusterNetwork.pods.cidrBlocks 字段中配置的 pod 预留的 CIDR 地址块。Pod 的默认 CIDR 地址块是 192.168.0.0/16

负载均衡器节点示例配置

以下命令块展示了如何在运行负载均衡器节点的服务器上打开所需端口的示例:

firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --permanent --zone=public --add-port=4240/tcp
firewall-cmd --permanent --zone=public --add-port=6444/tcp
firewall-cmd --permanent --zone=public --add-port=7946/tcp
firewall-cmd --permanent --zone=public --add-port=7946/udp
firewall-cmd --permanent --zone=public --add-port=6081/udp
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=10256/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --permanent --new-zone=k8s-pods
firewall-cmd --permanent --zone=k8s-pods --add-source PODS_CIDR
firewall-cmd --permanent --zone=k8s-pods --set-target=ACCEPT
firewall-cmd --reload

如需了解您打算使用的集群版本的特定端口要求,请参阅上述端口使用情况部分。相应地更新示例命令。

PODS_CIDR 替换为为 clusterNetwork.pods.cidrBlocks 字段中配置的 pod 预留的 CIDR 地址块。Pod 的默认 CIDR 地址块是 192.168.0.0/16

RHEL 9.2 和 9.4 的补充配置

Red Hat Enterprise Linux (RHEL) 版本 9.2 和 9.4 在 1.29.400 及更高版本中作为正式版受支持。对于 RHEL 版本 9.2 和 9.4,您必须在节点上执行额外的 firewalld 配置,才能让服务和 pod 正常运行:

  1. 列出节点的活跃接口,以查找主节点接口:

    firewall-cmd --list-interfaces
    

    根据 Linux 机器接口的命名惯例,主接口名称可能如以下之一所示:eth0eno1ens1enp2s0

  2. 列出节点的可用区,以查找主接口使用的可用区:

    firewall-cmd --list-all-zones
    

    例如,如果主接口是 eno1,则响应中的以下部分会表明主接口位于 public 可用区:

    ...
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eno1
      sources:
      ...
    
  3. 运行以下 firewalld 命令,为 RHEL 9.2 或 9.4 设置自定义区域和政策详细信息:

    firewall-cmd --permanent --new-zone=cilium
    firewall-cmd --permanent --zone=cilium --add-interface=cilium_host
    firewall-cmd --permanent --zone=cilium --set-target ACCEPT
    firewall-cmd --permanent --zone=cilium --add-masquerade
    firewall-cmd --permanent --zone=cilium --add-forward
    firewall-cmd --permanent --new-policy cilium-host-port-forwarding
    firewall-cmd --permanent --policy cilium-host-port-forwarding --add-ingress-zone IN_ZONE
    firewall-cmd --permanent --policy cilium-host-port-forwarding --add-egress-zone cilium
    firewall-cmd --permanent --policy cilium-host-port-forwarding --set-target ACCEPT
    firewall-cmd --reload
    

    根据您在上述步骤中找到的各项,将 IN_ZONE 替换为以下某个值:

    • public:预定义可用区,用于仅接受所选传入连接的公共区域。
    • trusted:受控环境中预定义可用区,其中所有网络连接都被接受。
    • 您定义的自定义区域的名称。
  4. 按照供应商文档配置存储解决方案。

    例如,如果您使用 Portworx 管理有状态的工作负载,Portworx 网络要求会列出需要保持打开状态的端口。

    对于供应商文档中列出的每个端口,请运行以下命令:

    firewall-cmd --permanent --zone=public --add-port=PORT_INFO
    

    PORT_INFO 替换为端口号或端口号范围,后跟协议。例如 10250-10252/tcp

确认端口配置

如需验证端口配置,请在控制平面、工作器和负载均衡器节点上执行以下步骤:

  1. 运行以下 Network Mapper 命令以查看哪些端口处于打开状态:

    nmap localhost
    
  2. 运行以下命令以获取 firewalld 配置设置:

    firewall-cmd --info-zone=public
    firewall-cmd --info-zone=k8s-pods
    firewall-cmd --list-all-policies
    
  3. 如有必要,请重新运行前面部分中的命令以正确配置您的节点。您可能需要以根用户身份运行这些命令。

firewalld 的已知问题

在 Red Hat Enterprise Linux (RHEL) 上运行启用了 firewalld 的 Google Distributed Cloud 时,firewalld 的更改可能会移除主机网络上的 Cilium iptables 链。anetd Pod 在启动时会添加 iptables 链。丢失 Cilium iptables 链会导致节点上的 Pod 丢失节点外部的网络连接。

导致移除 iptables 链的 firewalld 更改包括但不限于:

  • 使用 systemctl 重启 firewalld

  • 使用命令行客户端 (firewall-cmd --reload) 重新加载 firewalld

如需应用 firewalld 更改而不移除 iptables 链,请在节点上重启 anetd

  1. 使用以下命令找到并删除 anetd Pod,以重启 anetd

    kubectl get pods -n kube-system kubectl delete pods -n kube-system ANETD_XYZ
    

    ANETD_XYZ 替换为 anetd Pod 的名称。