多集群 Ingress 的问题排查和操作


GKE Enterprise Ingress 控制器用于管理 Compute Engine 资源。MultiClusterIngressMultiClusterService 资源会映射到不同的 Compute Engine 资源,因此了解这些资源之间的关系有助于您排查问题。例如,您可以检查以下 MultiClusterIngress 资源:

apiVersion: extensions/v1beta1
kind: MultiClusterIngress
metadata:
  name: foo-ingress
spec:
  template:
    spec:
      rules:
      - host: store.foo.com
        http:
          paths:
          - backend:
              serviceName: store-foo
              servicePort: 80
      - host: search.foo.com
        http:
          paths:
          - backend:
              serviceName: search-foo
              servicePort: 80

Compute Engine 到多集群 Ingress 资源的映射

下表显示了队列资源与 Kubernetes 集群和 Google Cloud 中创建的资源之间的映射:

Kubernetes 资源 Google Cloud 资源 说明
MultiClusterIngress 转发规则 HTTP(S) 负载均衡器 VIP。
目标代理 从注释和 TLS 块获取的 HTTP/S 终止设置。
网址映射 规则部分中的虚拟主机路径映射。
MultiClusterService Kubernetes Service 从模板派生的资源。
后端服务 为每个 (Service, ServicePort) 对创建一个后端服务。
网络端点组 参与 Service 的一组后端 Pod。

检查 Compute Engine 负载均衡器资源

创建负载均衡器后,多集群 Ingress 状态将包含为构建该负载均衡器而创建的每个 Compute Engine 资源的名称。例如:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
  CloudResources:
    Firewalls: "mci-l7"
    ForwardingRules: "mci-abcdef-myforwardingrule"
    TargetProxies: "mci-abcdef-mytargetproxy"
    UrlMap: "mci-abcdef-myurlmap"
    HealthChecks: "mci-abcdef-80-myhealthcheck"
    BackendServices: "mci-abcdef-80-mybackendservice"
    NetworkEndpointGroups: "k8s1-neg1", "k8s1-neg2", "k8s1-neg3"

未创建 VIP

如果未看到 VIP 地址,则 VIP 地址创建过程可能出错了。如需查看是否发生了错误,请运行以下命令:

kubectl describe mci shopping-service

输出可能类似于以下内容:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
Events:
  Type     Reason  Age   From                              Message
  ----     ------  ----  ----                              -------
  Warning  SYNC    29s   multi-cluster-ingress-controller  error translating MCI prod/shopping-service: exceeded 4 retries with final error: error translating MCI prod/shopping-service: multiclusterservice prod/shopping-service does not exist

此示例之所以出现错误,是因为用户没有创建由 MultiClusterIngress 引用的 MultiClusterService 资源。

502 响应

如果您的负载均衡器获得了 VIP 地址,但一直提供 502 响应,则表示负载均衡器健康检查可能失败了。健康检查可能会因两个原因而失败:

  1. 应用 Pod 运行状况不佳(例如,请参阅 Cloud 控制台调试)。
  2. 防火墙配置有误,导致 Google 健康检查程序无法执行健康检查。

对于第一种原因,请确保您的应用确实在“/”路径上提供了 200 响应。

对于第二种原因,请确保您的 VPC 中存在名为“mci-default-l7”的防火墙。Ingress 控制器会在您的 VPC 中创建防火墙,以确保 Google 健康检查程序可以访问您的后端。如果防火墙不存在,请确保没有任何外部自动化机制会在防火墙创建时将其删除。

流量未添加到集群或未从集群移除

添加新的成员资格时,流量应在适用时到达底层集群中的后端。同样,如果移除了成员资格,则任何流量都不应到达底层集群中的后端。如果您未观察到此行为,请检查 MultiClusterIngressMultiClusterService 资源是否存在错误。

发生此错误的常见情况包括:在未处于 VPC 原生模式的 GKE 集群上添加新的成员资格;或者添加了新的成员资格,但未在 GKE 集群中部署应用。

  1. 描述 MultiClusterService

    kubectl describe mcs zone-svc
    
  2. 描述 MultiClusterIngress

    kubectl describe mci zone-mci
    

配置集群迁移

如需详细了解迁移的使用场景,请参阅配置集群设计概念

如果处理不当,则配置集群迁移可能会成为一项破坏性操作。执行配置集群迁移时,请遵循以下准则:

  1. 务必在您的 MultiClusterIngress 资源上使用 static-ip 注解。否则,在迁移时,流量会中断。在迁移配置集群时,系统会重新创建临时 IP 地址。
  2. MultiClusterIngressMultiClusterService 资源必须以相同的方式部署到现有配置集群和新的配置集群。它们之间的差异将导致系统对新配置集群中的不同 MultiClusterServiceMultiClusterIngress 资源进行协调。
  3. 在任何时候,只有一个配置集群处于活跃状态。在更改配置集群之前,新配置集群中的 MultiClusterIngressMultiClusterService 资源将不会影响负载均衡器资源。

如需迁移配置集群,请运行以下命令:

  gcloud container fleet ingress update \
    --config-membership=projects/project_id/locations/global/memberships/new_config_cluster

通过确保功能状态中没有明显的错误来验证命令是否正常运行:

  gcloud container fleet ingress describe

控制台调试

在大多数情况下,检查负载均衡器的确切状态对于问题调试很有帮助。您可以转到 Google Cloud 控制台中的负载均衡,找到负载均衡器。

错误/警告代码

对于已知问题,多集群 Ingress 会在 MultiClusterIngressMultiClusterService 资源以及 gcloud multiclusteringress 描述字段中发出错误和警告代码。以下消息记录了错误和警告代码,以便您在某个资源未按预期运行时可以更轻松地了解错误和警告代码的含义。每个代码都包含一个错误 ID(格式为 AVMBR123,其中 123 是与错误或警告对应的唯一编号),以及有关如何解决该错误的建议。

AVMBR101:Annotation [NAME] not recognized

如果 MultiClusterIngressMultiClusterService 清单中指定了注解,但该注解无法识别,则系统会显示此错误。导致注解无法识别的原因有以下几种:

  1. 多集群 Ingress 不支持该注解。如果为 GKE Enterprise Ingress 控制器预计不会使用的资源添加注释,则可能会出现这种情况。

  2. 注释受支持,但拼写错误,因此无法识别。

在这两种情况下,请参阅文档以了解支持的注释及其指定方式。

AVMBR102:[RESOURCE_NAME] not found

当在 MultiClusterIngress 中指定补充资源但在配置成员中找不到补充资源时,会显示此错误。例如,如果 MultiClusterIngress 引用了一个无法找到的 MultiClusterService 或者 MultiClusterService 引用了一个无法找到的 BackendConfig,则系统会抛出此错误。导致资源无法找到的原因有以下几种:

  1. 资源不在正确的命名空间中。请确保相互引用的资源都在同一命名空间中。
  2. 资源名称拼写错误。
  3. 虽然命名空间和名称都正确,但资源确实不存在。在这种情况下,请创建该资源。

AVMBR103:[CLUSTER_SELECTOR] is invalid

如果在 MultiClusterService 上指定的集群选择器无效,则系统会显示此错误。导致此选择器可能无效的原因有以下几种:

  1. 提供的字符串包含拼写错误。
  2. 提供的字符串引用了舰队中不再存在的集群成员资格。

AVMBR104:Cannot find NEGs for Service Port [SERVICE_PORT]

如果找不到给定 MultiClusterService 和服务端口对的 NetworkEndpointGroup (NEG),则会抛出此错误。NEG 是包含每个后端集群中的 Pod 端点的资源。NEG 可能不存在的主要原因是在后端集群中创建或更新派生服务时出现错误。如需了解详情,请参阅 MultiClusterService 资源上的事件。

AVMBR105:Missing GKE Enterprise license.

此错误显示在功能状态下,表示 GKE Enterprise API (anthos.googleapis.com) 未启用。

AVMBR106:Derived service is invalid: [REASON].

此错误显示在 MultiClusterService 资源的事件下。导致此错误的一个常见原因是派生自 MultiClusterService 的 Service 资源包含无效的规范。

例如,此 MultiClusterService 的规范中未定义任何 ServicePort

apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
  name: zone-mcs
  namespace: whereami
spec:
  clusters:
  - link: "us-central1-a/gke-us"
  - link: "europe-west1-c/gke-eu"

此错误显示在功能状态下,因为成员资格资源下没有 GKE 集群。您可以通过运行以下指令来验证这一点:

gcloud container fleet memberships describe membership-name

并确保端点字段下没有 GKE 集群资源链接。

AVMBR108:GKE cluster [NAME] not found.

此错误显示在功能状态下,如果成员的底层 GKE 集群不存在,则会抛出此错误。

AVMBR109:[NAME] is not a VPC-native GKE cluster.

此错误显示在功能状态下。如果指定的 GKE 集群是基于路由的集群,则会抛出此错误。多集群 Ingress 控制器使用 NEG 创建容器原生负载均衡器。集群必须是 VPC 原生集群才能使用容器原生负载均衡器。

如需了解详情,请参阅创建 VPC 原生集群

AVMBR110:[IAM_PERMISSION] permission missing for GKE cluster [NAME].

此错误显示在功能状态下。导致此错误的原因有很多,如下所示:

  1. 成员资格的底层 GKE 集群与成员资格本身位于不同的项目中。
  2. MultiClusterIngress 服务代理中移除了指定的 IAM 权限。

AVMBR111:Failed to get Config Membership: [REASON].

此错误显示在功能状态下。导致此错误的主要原因是启用该功能时删除了配置成员资格。

任何时候都不要删除配置成员资格。如果您要更改此设置,请按照配置集群迁移步骤进行操作。

AVMBR112:HTTPLoadBalancing Addon is disabled in GKE Cluster [NAME].

此错误显示在功能状态下,并且在 GKE 集群中停用 HTTPLoadBalancing 插件时会发生此错误。您可以更新 GKE 集群以启用 HTTPLoadBalancing 插件。

gcloud container clusters update name --update-addons=HttpLoadBalancing=ENABLED

AVMBR113:This resource is orphaned.

在某些情况下,资源的实用性取决于其他资源对该资源的引用情况。当创建 Kubernetes 资源但该资源并未被其他资源引用时,会抛出此错误。例如,如果您创建的 BackendConfig 资源未被 MultiClusterService 引用,就会看到此错误。