GKE 网络已知问题

本页面列出了 GKE 网络的已知问题。本页面适用于管理底层技术基础设施生命周期,并在未实现服务等级目标 (SLO) 或应用故障时对提醒和页面做出响应的管理员和架构师。

如需按产品版本过滤已知问题,请从下面的下拉菜单中选择所需的过滤条件。

选择您的 GKE 版本:

或者,搜索您的问题:

已识别的版本 已修复的版本 问题和解决方法
1.28、1.29、1.30、1.31、1.32、1.33

GKE Dataplane V2 节点上的 Pod IP 地址泄漏

启用了 GKE Dataplane V2 的集群可能会遇到节点上的 Pod IP 地址耗尽问题。此问题是由容器运行时 bug 引起的,当 Pod 在创建期间遇到临时 CNI 错误时,该 bug 可能会泄漏已分配的 IP 地址。

当 GKE 集群节点升级到以下 GKE 版本之一或使用以下版本进行创建时,就会引发此问题:

  • 1.33 及更高版本
  • 1.32 及更高版本
  • 1.31.2-gke.1115000 或更高版本
  • 1.30.8-gke.1051001 或更高版本
  • 1.29.10-gke.1059000 或更高版本
  • 1.28.15-gke.1024000 或更高版本

出现此问题时,调度到受影响节点的新 Pod 无法启动,并返回类似于以下内容的错误消息:failed to assign an IP address to container


临时解决方法:

为了缓解此问题,您可以将缓解 DaemonSet 应用于集群,以清理泄漏的 IP 资源:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cleanup-ipam-dir
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: cleanup-ipam
  template:
    metadata:
      labels:
        name: cleanup-ipam
    spec:
      hostNetwork: true
      securityContext:
        runAsUser: 0
        runAsGroup: 0
        seccompProfile:
          type: RuntimeDefault
      automountServiceAccountToken: false
      containers:
      - name: cleanup-ipam
        image: gcr.io/gke-networking-test-images/ubuntu-test:2022@sha256:6cfbdf42ccaa85ec93146263b6e4c60ebae78951bd732469bca303e7ebddd85e
        command:
        - /bin/bash
        - -c
        - |
          while true; do
          for hash in $(find /hostipam -iregex '/hostipam/[0-9].*' -mmin +10 -exec head -n1 {} \; ); do
          hash="${hash%%[[:space:]]}"
          if [ -z $(ctr -n k8s.io c ls | grep $hash | awk '{print $1}') ]; then
          grep -ilr $hash /hostipam
          fi
          done | xargs -r rm
          echo "Done cleaning up /var/lib/cni/networks/gke-pod-network at $(date)"
          sleep 120s
          done
        volumeMounts:
        - name: host-ipam
          mountPath: /hostipam
        - name: host-ctr
          mountPath: /run/containerd
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
      volumes:
      - name: host-ipam
        hostPath:
          path: /var/lib/cni/networks/gke-pod-network
      - name: host-ctr
        hostPath:
          path: /run/containerd

1.31、1.32、1.33
  • 1.33.1-gke.1107000 及更高版本
  • 1.32.8-gke.1108000 及更高版本

使用旧版网络的集群中 Ingress 和服务负载均衡器的中断

旧版网络不兼容会导致使用 Ingress 或 Service 部署的 GKE 托管负载均衡器的后端分离。这会导致负载均衡器没有活跃的后端,进而导致发送到这些负载均衡器的所有入站请求都被丢弃。

此问题会影响使用旧版网络且版本为 1.31 或更高版本的 GKE 集群。

如需识别使用旧版网络的 GKE 集群,请运行以下命令:

    gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(subnetwork)"
  

如果集群采用旧版网络,此命令将返回空输出。

临时解决方法:

由于旧版网络已弃用一段时间,因此首选解决方案是将旧版网络迁移到 VPC 网络。为此,您可以转换包含 GKE 集群的旧版网络。如果您目前无法执行此迁移,请与 Cloud Customer Care 联系。

1.30、1.31、1.32
  • 1.30.10-gke.1070000 及更高版本
  • 1.31.5-gke.1068000 及更高版本
  • 1.32.1-gke.1002000 及更高版本

新创建的节点未添加到第 4 层内部负载均衡器

为内部 LoadBalancer Service 创建的 Google Cloud 负载均衡器可能在后端实例组中缺失新创建的节点。

该问题在缩减至零个节点,然后又扩增回一个或多个节点的集群中非常明显。

解决方法:

  • 启用 GKE 子集并重新创建 Service。

    注意:GKE 子集一旦启用便无法关闭。

  • 创建另一个内部 LoadBalancing Service。同步后,受影响的 Service 的实例组也会得到修复。同步完成后,可以移除新 Service。
  • 在其中一个节点中添加 node.kubernetes.io/exclude-from-external-load-balancers 标签,然后将其移除。
  • 向集群添加节点。Service 开始正常运行后,您可以移除该节点。
1.31,1.32
  • 1.31.7-gke.1158000 及更高版本
  • 1.32.3-gke.1499000 及更高版本

因从 CRD 状态中移除了 storedVersions 而导致的 Gateway API 问题

GKE 中的 Kube-Addon-Manager 会错误地从 Gateway API CRD(例如 gatewayhttpRoutegatewayClassreferenceGrant)的状态中移除 v1alpha2 storedVersion。即使集群中仍有以 v1alpha2 格式存储的这些 CRD 的实例,也会出现此问题。如果升级 GKE 集群版本时未添加 storedVersions,Gateway API 调用会失败。失败的调用还可能会破坏实现 Gateway API 的控制器。

如果您的集群满足以下所有条件,则可能面临风险:

  • 您的集群已启用 Gateway API。
  • 您曾在过去安装过 v1alpha2 版本的 Gateway API CRD。
  • 您的集群一直在受影响的 GKE 版本上运行。

临时解决方法:

建议的解决方法是延迟集群升级,直到问题得到解决。

或者,如果您需要升级集群版本,则必须将所有受影响的 Gateway API CRD 的存储版本更新为 v1beta1。以下示例更新了 gatewayClass CRD:

  1. 检查是否存在 v1alpha2 存储版本:
    kubectl get crd gatewayclasses.gateway.networking.k8s.io -ojsonpath="{.status.storedVersions}"
  2. 通过在集群中存在的所有 GatewayClass 资源上运行以下命令,将存储版本调整为 v1beta1
    kubectl annotate gatewayclass gateway-class-name bump-storage-version="yes"
  3. 移除 v1alpha2 存储版本,并将存储版本设置为 v1beta1
    kubectl patch customresourcedefinitions gatewayclasses.gateway.networking.k8s.io --subresource='status' --type='merge' -p '{"status":{"storedVersions":["v1beta1"]}}'
  4. 照常执行升级。
1.32
  • 1.32.3-gke.1170000 及更高版本

新 Pod 无法初始化,卡在 ContainerCreating 状态

新 Pod 无法创建,并卡在 ContainerCreating 状态。出现此问题时,服务容器会记录以下内容:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "[sandbox-ID]": plugin type="cilium-cni" failed (add): unable to create endpoint: Cilium API client timeout exceeded

此问题会影响版本介于 1.32 和 1.32.3-gke.1170000 之间的 GKE 集群,这些集群是在 GKE 版本 1.31 或 1.32 下创建的。根本原因是,维护已分配 Cilium 身份集合的内存中数据结构未与 Kubernetes API 服务器状态正确同步。

如需确认用于创建集群的 GKE 版本,您可以使用以下命令查询 initialClusterVersion 资源:

  gcloud container clusters describe [cluster_name] --location [location] --format='value(initialClusterVersion)'
  

如果 GKE 集群已启用日志记录,则 cilium-agent 容器会使用以下查询在 Logs Explorer 中记录 unable to resolve identity: timed out waiting for cilium-operator to allocate CiliumIdentity for key 消息:

   resource.type="k8s_container"
   resource.labels.container_name="cilium-agent"
  

临时解决方法:

一种临时缓解措施是重启控制平面。为此,您可以将控制平面升级到它已在运行的同一版本:

  gcloud container clusters upgrade [cluster_name] --location [location] --cluster-version=[version] --master
  
1.27、1.28、1.29、1.30、1.31

从 Service 中移除端口后,NEG 控制器停止管理端点

当 NEG 控制器配置为为某个 Service 创建独立 NEG 时,如果其中一个已配置的端口稍后从该 Service 中移除,NEG 控制器最终会停止管理该 NEG 的端点。除了用户在其中创建独立 NEG 注解的 Service 之外,这还会影响 GKE 网关、MCI 和 GKE 多集群网关引用的服务。

临时解决方法:

从具有独立 NEG 注解的 Service 中移除端口时,还需要更新该注解以移除相关端口。

1.28

网关 TLS 配置错误

我们发现了在运行 GKE 1.28.4-gke.1083000 版的集群中为网关配置 TLS 时存在问题。这会影响使用 SSLCertificateCertificateMap 的 TLS 配置。 如果您要升级包含现有网关的集群,则对网关所做的更新将失败。新网关的问题则是,负载均衡器未得到预配。我们会在即将发布的 GKE 1.28 补丁版本中修复此问题。

1.27、1.28、1.29
  • 1.26.13-gke.1052000 及更高版本
  • 1.27.10-gke.1055000 及更高版本
  • 1.28.6-gke.1095000 及更高版本
  • 1.29.1-gke.1016000 及更高版本

连接建立间歇性故障

在控制平面 1.26.6-gke.1900 及更高版本上的集群可能会遇到连接建立间歇性故障的问题。

发生故障的可能性很低,并且不会影响所有集群。从出现问题起,几天后故障应完全消停。

1.27、1.28、1.29
  • 1.27.11-gke.1118000 或更高版本
  • 1.28.7-gke.1100000 或更高版本
  • 1.29.2-gke.1217000 或更高版本

Container-Optimized OS 的 DNS 解析问题

在包含基于 Container-Optimized OS 的节点的 GKE 集群上运行的工作负载可能会遇到 DNS 解析问题。

1.28 1.28.3-gke.1090000 或更高版本

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

对于已启用 GKE Dataplane V2 的集群,当客户端 Pod 使用 Service 或内部直通式网络负载均衡器的虚拟 IP 地址连接到自身时,由于数据平面中的 conntrack 查找不正确,回复数据包不被认定为现有连接的一部分。这意味着限制 Pod 入口流量的网络政策未在数据包上正确施行。

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

临时解决方法:

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

1.27、1.28
  • 1.28.3-gke.1090000 或更高版本
  • 1.27.11-gke.1097000 或更高版本

“发卡”(hairpin) 连接流的数据包丢弃

对于已启用 GKE Dataplane V2 的集群,当 Pod 使用 Service 创建一个连接到自身的 TCP 连接,以便 Pod 同时充当连接的来源和目的地时,GKE Dataplane V2 eBPF 连接跟踪功能错误地跟踪连接状态,导致 conntrack 条目泄露。

当连接元组(协议、源/目标 IP 和源/目标端口)泄露时,使用同一连接元组的新连接可能会导致返回数据包丢弃。

临时解决方法:

请使用下列解决方法之一:

  • 为可能使用 Service 与自己通信的 Pod 中运行的应用启用 TCP 重复使用 (keep-alive)。这可以防止发出 TCP FIN 标志,并避免泄露 conntrack 条目。
  • 使用短期连接时,请使用代理负载均衡器(例如网关)公开 Pod,以公开 Service。这会导致连接请求的目的地设置为负载均衡器 IP 地址,从而阻止 GKE Dataplane V2 对环回 IP 地址执行 SNAT。
1.31.0-gke.1506000 之前的版本 1.31.0-gke.1506000 及更高版本

GKE 多网络中的设备类型网络在网络名称过长时会失败

集群创建失败,并显示以下错误:

error starting very-long-string-that-exceeds-character-limit-gpu-nic0 device plugin endpoint: listen unix /var/lib/kubelet/plugins_registry/networking.gke.io.networks_very-long-string-that-exceeds-character-limit-gpu-nic0.sock: bind: invalid argument

临时解决方法:

将设备类型的网络对象名称的长度限制在 41 个字符以内。编写每个 UNIX 域套接字的完整路径,包括相应的网络名称。Linux 对套接字路径长度有限制(低于 107 个字节)。在考虑目录、文件名前缀和 .sock 扩展名后,网络名称的长度上限为 41 个字符。

1.27、1.28、1.29、1.30
  • 1.30.4-gke.1282000 或更高版本
  • 1.29.8-gke.1157000 或更高版本
  • 1.28.13-gke.1078000 或更高版本
  • 1.27.16-gke.1342000 或更高版本

控制平面升级后 hostPort Pod 出现连接问题

启用了网络政策的集群可能会遇到 hostPort Pod 出现连接问题。 此外,新创建的 Pod 可能需要多用 30 到 60 秒才能准备就绪。

当集群的 GKE 控制平面升级到以下 GKE 版本之一时,就会触发此问题

  • 1.30 升级到 1.30.4-gke.1281999
  • 1.29.1-gke.1545000 升级到 1.29.8-gke.1156999
  • 1.28.7-gke.1042000 升级到 1.28.13-gke.1077999
  • 1.27.12-gke.1107000 升级到 1.27.16-gke.1341999

临时解决方法:

在 GKE 控制平面升级后立即升级或重新创建节点。

1.31、1.32
  • 1.32.1-gke.1729000 或更高版本
  • 1.31.6-gke.1020000 或更高版本

在同一节点上运行的 Pod 之间的 UDP 流量中断

启用了节点内可见性的集群可能会遇到在同一节点上运行的 Pod 之间的 UDP 流量中断问题。

当 GKE 集群节点升级到以下 GKE 版本之一或使用以下版本进行创建时,就会引发此问题:

  • 1.32.1-gke.1729000 或更高版本
  • 1.31.6-gke.1020000 或更高版本

受影响的路径是同一节点上流经 Hostport 或 Service 的 Pod 到 Pod 的 UDP 流量。

解决方法

将集群升级到下面其中一个已修复的版本:

  • 1.32.3-gke.1927000 或更高版本
  • 1.31.7-gke.1390000 或更高版本
1.28、1.29、1.30、1.31

在总节点数少于 3 个且 vCPU 不足的集群中,Calico Pod 运行状况不佳

在满足以下所有条件的集群上,无法调度 calico-typha 和 calico-node Pod:总节点数少于 3 个,每个节点的可分配 vCPU 数为 1 或更少,并且已启用网络政策。这是由于 CPU 资源不足。

解决方法:

  • 扩容至至少 3 个节点池,其中 1 个节点使用 1 个可分配 vCPU。
  • 将单个节点池的大小调整为至少 3 个节点,且每个节点具有 1 个可分配 vCPU。
  • 使用在包含单个节点的节点池中至少具有 2 个可分配 vCPU 的机器类型。

在控制平面升级期间,可用区级集群上的多集群网关 (MCG) 中断

在导致控制平面重启的事件(例如集群升级)期间,在 GKE 可用区集群上使用多集群网关 (MCG) 的部署可能会遇到中断问题,并显示“503”错误。这是因为 MCG 依赖于用于网络端点组 (NEG) 发现的旧版机制,当可用区级集群中的节点在控制平面重启期间暂时不可用时,该机制会错误地报告零个后端。这会导致负载均衡器移除所有后端,从而导致流量丢失。

解决方法:

  • 建议的解决方案是从可用区级 GKE 集群迁移到区域级 GKE 集群。区域级集群具有高可用性控制平面,可消除升级或重启期间触发此问题的单点故障。