Kubernetes 带有入口的BackendConfig提供了不健康的后端

Kubernetes 带有入口的BackendConfig提供了不健康的后端,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我正在学习如何使用入口来公开我的应用程序GKE v1.19。 我按照GKE文档中关于服务、入口和后端配置的教程进行设置。然而,我的后端服务在一段时间后仍然变得不健康。我的目标是覆盖入口控制器的默认“/”健康检查路径 我在livenessProbe和readinessProbe下的deployment.yaml文件中定义了相同的运行状况检查,自从Pod进入运行阶段以来,它们似乎工作正常。我还尝试卷曲端点,它返回200状态 我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的NodePo

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

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

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

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

部署。yaml

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

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
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
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

backendconfig.yaml

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

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
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
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

服务。yaml

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

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
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
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

ingress.yaml

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

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
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
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


使用“BackendConfig”的理想方法是,当您的服务的服务吊舱包含多个容器时,如果您正在使用Anthos Ingres控制器,或者如果您需要控制用于负载平衡器健康检查的端口,那么您应该使用BackendConfig CDR来定义参数。请参阅

当后端服务的运行状况检查参数是从服务Pod的就绪探测推断出来的时,GKE不会使就绪探测和运行状况检查保持同步。因此,您对所做的任何更改都不会按照复制到负载平衡器上相应后端服务的运行状况检查中

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

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

您根本不需要使用BackendConfig,ingress gce应该推断您列出的所有值。我也尝试过。后端服务仍处于不正常状态。唯一有效的方法是将心跳检查添加到根路径,即“/”而不是“/api”。是否存在入口健康检查使用默认路径而不是“/api”的原因?有关详细信息,请参阅