网络要求

本文档概述了安装和运行 Google Distributed Cloud 的网络要求。

外部网络要求

Google Distributed Cloud 需要互联网连接才能运行。Google Distributed Cloud 会从 Container Registry 中检索集群组件,并通过 Connect 注册集群。

您可以使用公共互联网,通过 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 网络

Google Distributed Cloud 允许您为每个节点配置最多 250 个 Pod。Kubernetes 为每个节点分配一个无类别域间路由 (CIDR) 块,以便每个 Pod 可以拥有唯一的 IP 地址。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 的值或减小 nodeConfig.podDensity.maxPodsPerNode 的值。这种方法存在一些缺点。

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

下图展示了一种可能的网络配置中 Google Distributed Cloud 的许多关键网络概念。

Google Distributed Cloud 的典型网络配置

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

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

端口使用量

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

控制平面节点

版本 1.28

协议 方向 端口范围 Purpose 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和运行状况 kube-apiserveretcd
TCP 入站 2382 - 2384 etcd 事件服务器客户端 API、指标和运行状况 kube-apiserveretcd-events
TCP 两者 4240 CNI 健康检查 全部
UDP 入站 6081 GENEVE 封装 本身
TCP 入站 6444 Kubernetes API 服务器 全部
TCP 入站 8443 和 8444 GKE Identity Service v2 ais”部署正在“anthos-identity-service”命名空间中运行
TCP 入站 9100 身份验证代理 node-exporter
TCP 入站 9101 仅在本地主机上提供节点指标

(为版本 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 网络钩子服务 kube-apiserverang-controller-manager

版本 1.16

协议 方向 端口范围 Purpose 使用者
TCP 入站 22 预配和更新管理员集群节点 管理员工作站
TCP 入站 2379 - 2381 etcd 服务器客户端 API、指标和运行状况 kube-apiserveretcd
TCP 入站 2382 - 2384 etcd 事件服务器客户端 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 网络钩子服务 kube-apiserverang-controller-manager

版本 1.15 及更低版本

协议 方向 端口范围 Purpose 使用者
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 网络钩子服务 kube-apiserverang-controller-manager

工作器节点

版本 1.28

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

(为版本 1.28 及更高版本添加了端口要求。)

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

版本 1.16

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

版本 1.15 及更低版本

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

负载均衡器节点

版本 1.28

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

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

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

版本 1.16

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

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

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

版本 1.15 及更低版本

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

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

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

多集群端口要求

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

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

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

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

配置 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=10250-10252/tcp
firewall-cmd --permanent --zone=public --add-port=10256/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

确认端口配置

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

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

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

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

防火墙的已知问题

在 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

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

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

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

    ANETD_XYZ 替换为 anetd Pod 的名称。