网络要求

本文档概述了安装和操作 GKE on Bare Metal 的网络要求。

外部网络要求

GKE on Bare Metal 需要互联网连接才能执行操作。GKE on Bare Metal 从 Container Registry 中检索集群组件,并且集群会通过 Connect 注册。

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

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

内部网络要求

GKE on Bare Metal 支持集群节点之间的第 2 层第 3 层连接。负载均衡器节点可以是控制平面节点,也可以是一组专用节点。如需了解详情,请参阅选择和配置负载均衡器

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

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

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

Pod 网络

GKE on Bare Metal 1.7.0 及更高版本允许您为每个节点最多配置 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 的值。此方法有一些缺点。

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

下图说明了在一种可能的网络配置中适用于 Bare Metal 的 GDCV 的一些关键网络概念。

GKE on Bare Metal 典型网络配置

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

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

端口使用量

本部分介绍在集群和负载均衡器节点上如何使用 UDP 和 TCP 端口。

控制层面节点

协议方向端口范围目的使用者
UDP入站6081GENEVE 封装本身
TCP入站22管理员集群节点的预配和更新管理员工作站
TCP入站6444Kubernetes API 服务器全部
TCP入站2379 - 2381etcd 服务器客户端 APIkube-apiserveretcd
TCP入站2382 - 2384etcd-events 服务器客户端 APIkube-apiserveretcd-events
TCP入站10250kubelet API自行控制层面
TCP入站10251kube-scheduler本身
TCP入站10252kube-controller-manager本身
TCP入站10256节点健康检查全部
TCP两者4240CNI 健康检查全部

工作器节点

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

负载均衡器节点

协议方向端口范围目的使用者
TCP入站22用户集群节点的预配和更新管理员集群节点
UDP入站6081GENEVE 封装本身
TCP入站443*集群管理全部
TCP两者4240CNI 健康检查全部
TCP入站7946Metal LB 健康检查负载均衡器节点
UDP入站7946Metal LB 健康检查负载均衡器节点
TCP入站10256节点健康检查全部

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

多集群端口要求

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

协议方向端口范围目的使用者
TCP入站22集群节点的预配和更新所有节点
TCP入站443*用于添加集群的 Kubernetes API 服务器控制平面和负载均衡器节点

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

配置 firewalld 端口

在 Red Haat Enterprise Linux (RHEL) 或 CentOS 上,您无需停用 Firewalld,也可以在 Bare Metal 上运行 GKE。如需使用 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. 如有必要,请重新运行前面部分中的命令以正确配置您的节点。您可能需要以根用户身份运行这些命令。

shortcutsd 的已知问题

在 CentOS 或 Red Hat Enterprise Linux (RHEL) 上运行启用了 firewalld 的 GKE on Bare Metal 时,对 firewalld 的更改可以移除主机网络上的 Cilium iptables 链。iptables 链由 anetd Pod 在启动时添加。丢失 Cilium iptables 链会导致节点上的 Pod 丢失节点外部的网络连接。

firewalld 所做的移除 iptables 链的更改包括但不限于:

  • 使用 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 的名称。