带有 Ingress 的 BackendConfig 提供不健康的后端

BackendConfig with Ingress gives UNHEALTHY backend

我正在学习如何使用入口公开我的应用程序 GKE v1.19。 我按照服务、入口和后端配置的 GKE 文档教程进行了以下设置。但是,一段时间后我的后端服务仍然变得不健康。我的目标是覆盖入口控制器的默认“/”健康检查路径。

我在 livenessProbe 和 readinessProbe 下的 deployment.yaml 文件中定义了相同的健康检查,自从 Pod 进入 运行 阶段后,它们似乎工作正常。我还尝试卷曲端点,它 returns 200 状态。

我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的 NodePort 服务访问。任何建议或帮助将不胜感激。谢谢。

我将在下面添加我的 yaml 文件:

deployment.yaml

....
      livenessProbe:
          httpGet:
            path: /api
            port: 3100
          initialDelaySeconds: 180
      readinessProbe:
          httpGet:
            path: /api
            port: 3100
          initialDelaySeconds: 180
.....

backendconfig.yaml

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: backend-config
  namespace: ns1
spec:
  healthCheck:
    checkIntervalSec: 30
    port: 3100
    type: HTTP #case-sensitive
    requestPath: /api

service.yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/backend-config: '{"default": "backend-config"}'
  name: service-ns1
  namespace: ns1
  labels:
    app: service-ns1
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 3100
    targetPort: 3100
  selector:
    app: service-ns1

ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ns1-ingress
  namespace: ns1
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ns1-ip
    networking.gke.io/managed-certificates: ns1-cert
    kubernetes.io/ingress.allow-http: "false" 
spec:
  rules:
  - http:
      paths:
      - path: /api/*
        backend:
          serviceName: service-ns1
          servicePort: 3100

如果您使用的是 Anthos Ingress 控制器,或者如果您需要控制用于负载均衡器的健康检查,那么你应该使用 BackendConfig CDR 来定义 health check parameters. Refer to the 1.

当后端服务的健康检查参数是从服务 Pod 的就绪探测中推断出来的时,GKE 不会使就绪探测和健康检查保持同步。因此,您对 readiness probe will not be copied to the health check of the corresponding backend service on the load balancer as per 2.

所做的任何更改

在您的场景中,后端在遵循路径“/”时是健康的,但在使用路径“/api”时显示不健康,因此您的入口可能存在一些配置错误。

我建议您添加注释:ingress.kubernetes.io/rewrite-target: /api 所以spec.path中提到的路径在请求发送到后端服务之前会被重写为/api。