本页面介绍了如何为 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 创建新集群,请执行以下任务:
进入控制台中的 Google Kubernetes Engine 页面。
点击 add_box 创建。
点击配置以配置标准集群。
在“网络”部分中,选中启用 Dataplane V2复选框。当您选择“启用 Dataplane V2”时,“启用 Kubernetes 网络政策”选项会停用,因为网络政策强制执行功能内置于 GKE Dataplane V2 中。
点击创建。
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 问题排查
检查系统 Pod 的状态:
kubectl -n kube-system get pods -l k8s-app=cilium -o wide
如果 GKE Dataplane V2 正在运行,则输出包含前缀为
anetd-
的 Pod。anetd 是 GKE Dataplane V2 的网络控制器。如果问题在于服务或网络政策强制执行方式,请检查
anetd
Pod 日志:kubectl -n kube-system get events --field-selector involvedObject.name=anetd kubectl -n kube-system logs -l k8s-app=cilium
如果 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 地址,请获取集群的身份验证凭据并执行以下步骤:
将以下清单另存为名为
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;
在所有可能受影响的集群节点上运行脚本:
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 清单中的 port
和 containerPort
配置为相同的值。
后续步骤
- 使用网络政策日志记录功能记录集群网络政策允许或拒绝与 Pod 连接的时间。
- 了解 GKE Dataplane V2 的工作原理。