网络要求

本文档概述了安装和操作 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 可让您为每个节点最多配置 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 的值。这种方法存在一些缺点。

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

下图说明了 GKE on Bare Metal 的许多关键网络概念,采用一种可能的网络配置。

GKE on Bare Metal 典型网络配置

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

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

端口使用量

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

控制平面节点

版本 1.28

协议 方向 端口范围 Purpose 使用者
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 入站 8443 和 8444 GKE Identity Service v2 ais 个部署在 anthos-identity-service 命名空间中运行
TCP 入站 9100 身份验证代理 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 网络钩子服务 kube-apiserverang-controller-manager

版本 1.16

协议 方向 端口范围 Purpose 使用者
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 网络钩子服务 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 仅在 localhost 上提供节点指标

(针对版本 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 Haat Enterprise Linux (RHEL) 上,您无需停用防火墙规则,即可在 Bare Metal 上运行 GKE。如需使用防火墙规则,您必须打开控制平面、工作器和负载均衡器节点使用的 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 的已知问题

在 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 的名称。