排查 GKE Ingress 问题

Google Kubernetes Engine (GKE) 中的 Ingress 问题可能会阻止外部或内部流量到达您的服务。

您可参考本文档,找到与 Ingress 类、静态 IP 注解、证书密钥大小以及与网络层级交互相关的错误的解决方案。

此信息适用于在 GKE 中部署和管理使用 Ingress 公开的应用的平台管理员、运维人员和应用开发者。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

Ingress 类的注解不正确

症状

创建 Ingress 时,您可能会看到以下错误:

Missing one or more resources. If resource creation takes longer than expected, you might have an invalid configuration.

潜在原因

创建 Ingress 时,您可能在清单中错误地配置了 Ingress 类。

解决方法

如需指定 Ingress 类,您必须使用 kubernetes.io/ingress.class 注解。您不能使用 spec.ingressClassName 指定 GKE Ingress。

  • 如需部署内部应用负载均衡器,请使用 kubernetes.io/ingress.class: gce-internal 注解。
  • 如需部署外部应用负载均衡器,请使用 kubernetes.io/ingress.class: gce 注解。

静态 IP 地址的注解不正确

症状

将外部 Ingress 配置为使用静态 IP 地址时,您可能会看到以下错误:

Error syncing to GCP: error running load balancer syncing routine: loadbalancer <Name of load balancer> does not exist: the given static IP name <Static IP> doesn't translate to an existing static IP.

潜在原因

  • 您在部署 Ingress 之前未创建静态外部 IP 地址。
  • 您没有为负载均衡器类型使用正确的注解。

解决方法

如果您要配置内部 Ingress,请执行以下操作:

  • 在部署 Ingress 之前,预留静态外部 IP 地址
  • 在 Ingress 资源上使用 kubernetes.io/ingress.global-static-ip-name 注解。

如果您要配置内部 Ingress,请执行以下操作:

  • 在部署 Ingress 之前,预留区域级静态内部 IP 地址。
  • 在 Ingress 资源上使用 kubernetes.io/ingress.regional-static-ip-name 注解。

静态 IP 地址已被使用

症状

当您指定静态 IP 地址来预配内部或外部 Ingress 资源时,可能会看到以下错误:

Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <LB name> does not exist:
googleapi: Error 409: IP_IN_USE_BY_ANOTHER_RESOURCE - IP ''<IP address>'' is already being used by another resource.

潜在原因

该静态 IP 地址已被其他资源使用。

停用 HTTP 并使用 Google 管理的证书时出错

症状

如果您要配置 Google 管理的 SSL 证书并在 Ingress 上停用 HTTP 流量,则会看到以下错误:

Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <Load Balancer name> does not exist:
googleapi: Error 404: The resource ''projects/<Project>/global/sslPolicies/<Policy name>' was not found, notFound

潜在原因

配置 Ingress 时,您不能同时使用以下注解:

  • networking.gke.io/managed-certificates(用于将 Google 管理的证书与 Ingress 相关联)
  • kubernetes.io/ingress.allow-http: false(用于停用 HTTP 流量)

解决方法

仅在外部应用负载均衡器完全编程后才停用 HTTP 流量。您可以更新 Ingress 并将注解 kubernetes.io/ingress.allow-http: false 添加到清单中。

内部 Ingress 缺少代理专用子网

症状

为内部应用负载均衡器部署 Ingress 时,您可能会看到以下错误:

Error syncing to GCP: error running load balancer syncing routine:
loadbalancer <LB name> does not exist: googleapi: Error 400: Invalid value for field 'resource.target': 'https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/<Region>/targetHttpsProxies/<Target proxy>'.
An active proxy-only subnetwork is required in the same region and VPC as
the forwarding rule.

潜在原因

您在创建 Ingress 资源之前未创建代理专用子网。对于内部应用负载均衡器,代理专用子网是必需的。

解决方法

在部署内部 Ingress 之前,创建代理专用子网

SSL 证书密钥过大

症状

如果负载均衡器的 SSL 证书的密钥大小过大,您可能会看到以下错误:

Error syncing to GCP: error running load balancer syncing routine: loadbalancer gky76k70-load-test-trillian-api-ingress-fliismmb does not exist: Cert creation failures - k8s2-cr-gky76k70-znz6o1pfu3tfrguy-f9be3a4abbe573f7 Error:googleapi: Error 400: The SSL key is too large., sslCertificateKeyTooLarge

潜在原因

Google Cloud 对 SSL 证书密钥的长度的限制为 2,048 位。

解决方法

将 SSL 证书密钥的大小减小到 2,048 位或以下。

在标准层级中创建 Ingress 时出错

症状

如果您在将项目默认网络层级设置为标准的项目中部署 Ingress,系统会显示以下错误消息:

Error syncing to GCP: error running load balancer syncing routine: load balancer <LB Name> does not exist: googleapi: Error 400: STANDARD network tier (the project''s default network tier) is not supported: STANDARD network tier is not supported for global forwarding rule., badRequest

解决方法

将项目默认网络层级配置为高级。

后续步骤