GKE Ingress显示后端服务不健康

时间:2020-08-05 15:32:34

标签: google-kubernetes-engine kubernetes-ingress

我有一个在实例组中有4个节点的GKE集群。 我部署了Ingress和多个Pod(每个Pod仅1个副本,因此它们仅位于1个节点上)。 我在Google控制台(“入口详细信息”页面)上注意到,尽管正在运行的Pod上的运行状况检查正常并且我的应用程序正在运行,但所有后端服务仍然无法正常运行。 据我了解,它说这是不健康的,因为在4个节点中,只有1个节点正在运行给定pod的实例(在后端服务详细信息上,它说“ 4个实例中的1个是健康的”)。 我是否正确,我应该担心并尝试解决此问题吗?在应用程序运行时接受不正常状态有点奇怪...

编辑: 经过进一步调查(最多2个节点)并激活了运行状况检查日志,我可以看到后端服务状态似乎是最后执行的运行状况检查的状态。因此,如果它最后检查托管Pod的节点,则表明它是健康的,否则就不健康。

GKE版本:1.16.13-gke.1

我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-dc729887-5c67-4388-9327-e4f76baf9eaf
    ingress.kubernetes.io/backends: '{"k8s-be-30301--503461913abc33d7":"UNHEALTHY","k8s-be-31206--503461913abc33d7":"HEALTHY","k8s-be-31253--503461913abc33d7":"HEALTHY","k8s-be-31267--503461913abc33d7":"HEALTHY","k8s-be-31432--503461913abc33d7":"UNHEALTHY","k8s-be-32238--503461913abc33d7":"HEALTHY","k8s-be-32577--503461913abc33d7":"UNHEALTHY","k8s-be-32601--503461913abc33d7":"UNHEALTHY"}'
    ingress.kubernetes.io/https-forwarding-rule: k8s2-fs-sfdowd2x-city-foobar-cloud-8cfrc00p
    ingress.kubernetes.io/https-target-proxy: k8s2-ts-sfdowd2x-city-foobar-cloud-8cfrc00p
    ingress.kubernetes.io/ssl-cert: mcrt-dc729887-5c67-4388-9327-e4f76baf9eaf
    ingress.kubernetes.io/url-map: k8s2-um-sfdowd2x-city-foobar-cloud-8cfrc00p
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: city
    networking.gke.io/managed-certificates: foobar-cloud
  creationTimestamp: "2020-08-06T08:25:18Z"
  finalizers:
  - networking.gke.io/ingress-finalizer-V2
  generation: 1
  labels:
    app.kubernetes.io/instance: foobar-cloud
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: foobar-cloud
    helm.sh/chart: foobar-cloud-0.4.58
  name: foobar-cloud
  namespace: city
  resourceVersion: "37878"
  selfLink: /apis/extensions/v1beta1/namespaces/city/ingresses/foobar-cloud
  uid: 751f78cf-2344-46e3-b87e-04d6d903acd5
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: foobar-cloud-server
          servicePort: 9999
        path: /foobar/server
      - backend:
          serviceName: foobar-cloud-server
          servicePort: 9999
        path: /foobar/server/*
status:
  loadBalancer:
    ingress:
    - ip: xx.xx.xx.xx

3 个答案:

答案 0 :(得分:1)

我有一个非常相似的问题。我不需要共享我的设置,因为它与OP几乎相同。我也像OP一样使用GKE入口控制器。我已经手动将externalTrafficPolicy:Local添加到了Ingress Controller后端服务所调用的服务,并且当我将externalTrafficPolicy从“ Local”更改为“ Cluster”(如上述da L所述)时,Ingress后端服务立即报告运行状况良好。

我从被调用的服务中删除了“ externalTrafficPolicy:”行,现在使用容器本地负载平衡和所有后端服务报告正常的GKE入口控制器进行了设置。

答案 1 :(得分:0)

请检查您的Yaml文件以获取服务。如果显示externalTrafficPolicy: local,则为预期行为。

Local(本地)意味着流量将始终流到同一节点上的Pod,而其他所有内容都将丢弃。因此,如果您的部署只有一个正在服务的副本,那么您将只有一个正常的实例。

您可以轻松地验证该理论,最多扩展2个副本并观察行为。如果第二个副本与第一个副本位于同一节点上,则我预见1个正常实例,如果第二个副本在不同节点上与2/4个实例正常。让我知道。

答案 2 :(得分:0)

我终于找到了原因。 我的服务未提及externalTrafficPolicy的任何值,因此应用了Cluster的默认值。
但是,我有一个NetworkPolicy定义了哪个目标是防止来自其他名称空间的流量,如here所述。 我按照本doc中的说明添加了负载均衡器探测器的IP,但缺少了集群中其他节点IP的允许连接。