使用 GKE Dataplane V2

本页面介绍了如何为 Google Kubernetes Engine (GKE) 集群启用 GKE Dataplane V2

新的 Autopilot 集群在 1.22.7-gke.1500 版及更高版本和 1.23.4-gke.1500 版及更高版本中启用了 GKE Dataplane V2。

使用 GKE Dataplane V2 创建 GKE 集群

您可以在创建具有 GKE 1.20.6-gke.700 版及更高版本的新集群时使用 gcloud CLI 或 Kubernetes Engine AP 来启用 GKE Dataplane V2。您还可以在创建具有 GKE 1.17.9 版及更高版本的新集群时启用预览版 GKE Dataplane V2

控制台

如需使用 GKE Dataplane V2 创建新集群,请执行以下任务:

  1. 进入控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 点击配置以配置标准集群。

  4. 在“网络”部分中,选中启用 Dataplane V2复选框。当您选择“启用 Dataplane V2”时,“启用 Kubernetes 网络政策”选项会停用,因为网络政策强制执行功能内置于 GKE Dataplane V2 中。

  5. 点击创建

gcloud

如需使用 GKE Dataplane V2 创建新集群,请使用以下命令:

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --release-channel CHANNEL_NAME \
    --region COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • CHANNEL_NAME:包含 GKE 1.20.6-gke.700 版或更高版本的发布版本。如果您不想使用发布版本,还可以使用 --version 标志而不是 --release-channel,从而指定 1.20.6-gke.700 或更高版本。
  • COMPUTE_REGION:新集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE

API

如需使用 GKE Dataplane V2 创建新集群,请在集群 create 请求中指定 networkConfig 对象datapathProvider 字段

以下 JSON 代码段显示了启用 GKE Dataplane V2 所需的配置:

"cluster":{
   "initialClusterVersion":"VERSION",
   "ipAllocationPolicy":{
      "useIpAliases":true
   },
   "networkConfig":{
      "datapathProvider":"ADVANCED_DATAPATH"
   },
   "releaseChannel":{
      "channel":"CHANNEL_NAME"
   }
}

替换以下内容:

  • VERSION:您的集群版本,必须为 GKE 1.20.6-gke.700 或更高版本。
  • CHANNEL_NAME:包含 GKE 1.20.6-gke.700 版或更高版本的发布版本

GKE Dataplane V2 问题排查

  1. 检查系统 Pod 的状态:

    kubectl -n kube-system get pods -l k8s-app=cilium -o wide
    

    如果 GKE Dataplane V2 正在运行,则输出包含前缀为 anetd- 的 Pod。anetd 是 GKE Dataplane V2 的网络控制器。

  2. 如果问题在于服务或网络政策强制执行方式,请检查 anetd Pod 日志:

    kubectl -n kube-system get events --field-selector involvedObject.name=anetd
    kubectl -n kube-system logs -l k8s-app=cilium
    
  3. 如果 Pod 创建失败,请检查 kubelet 日志以获取相关线索。您可以使用 ssh 在 GKE 中执行此任务:

    gcloud compute ssh NODE -- sudo journalctl -u kubelet
    

    NODE 替换为虚拟机实例的名称。

已知问题

网络政策端口范围不生效

如果您在已启用 GKE Dataplane V2 的集群的网络政策中指定 endPort 字段,则该字段将不会生效。

从 GKE 1.22 开始,Kubernetes Network Policy API 允许您指定强制执行网络政策的端口范围。具有 Calico 网络政策的集群支持此 API,但具有 GKE Dataplane V2 的集群不支持此 API。

如需验证 NetworkPolicy 对象的行为,您可以在将它们写入 API 服务器后重新读取这些对象。如果对象仍包含 endPort 字段,则系统会强制执行该功能。如果缺少 endPort 字段,则不会强制执行该功能。在所有情况下,存储在 API 服务器中的对象都是网络政策的可靠来源。

如需了解详情,请参阅 KEP-2079:支持端口范围的网络政策

Pod 显示 failed to allocate for range 0: no IP addresses available in range set 错误消息

受影响的 GKE 版本:1.18 及更高版本

运行使用 containerd 并启用了 GKE Dataplane V2 的节点池的 GKE 集群可能会遇到 IP 地址泄露问题,并耗尽节点上的所有 Pod IP 地址。受影响的节点上安排的 Pod 会显示类似于以下内容的错误消息:

failed to allocate for range 0: no IP addresses available in range set: 10.48.131.1-10.48.131.62

如需详细了解该问题,请参阅 containerd 问题 #5768

如需解决此问题,请将集群升级到以下某个 GKE 版本:

  • 1.23.4-gke.1600 或更高版本。
  • 1.22.8-gke.200 或更高版本。
  • 1.21.11-gke.1100 或更高版本。
  • 1.20.15-gke.5200 或更高版本。

解决方法

您可以通过删除节点的泄露 Pod IP 地址来缓解此问题。

如需删除泄露的 Pod IP 地址,请获取集群的身份验证凭据并执行以下步骤:

  1. 将以下清单另存为名为 cleanup.sh 的 shell 脚本:

    for hash in $(sudo find /var/lib/cni/networks/gke-pod-network -iregex '/var/lib/cni/networks/gke-pod-network/[0-9].*' -exec head -n1 {} \;); do if [ -z $(sudo ctr -n k8s.io c ls | grep $hash | awk '{print $1}') ]; then sudo grep -ilr $hash /var/lib/cni/networks/gke-pod-network; fi; done | sudo xargs rm
    
    sudo systemctl restart kubelet containerd;
    
  2. 在所有可能受影响的集群节点上运行脚本:

    for node in `kubectl get nodes -o wide | grep Ready | awk '{print $1}' | sort -u`; do gcloud compute ssh --zone "ZONE" --project "PROJECT" $node --command "$(cat cleanup.sh)"; done
    

由于连接跟踪查找不正确,网络政策丢弃了连接

当客户端 Pod 通过 Service 或内部 TCP/UDP 负载均衡器的虚拟 IP 地址连接到自身时,由于数据平面中不正确的 conntrack 查找,回复数据包不会被识别为现有连接的一部分。这意味着限制 pod 入口流量的网络政策未在数据包上正确施行。

此问题的影响取决于为 Service 配置的 Pod 数量。比方说,如果 Service 有 1 个后端 Pod,则连接始终失败。如果 Service 有 2 个后端 Pod,则连接失败时间占总时间的 50%。

解决方法

要缓解此问题,您可以将 Service 清单中的 portcontainerPort 配置为相同的值。

后续步骤