GKE 外部负载均衡器配置,NEG 为空,运行状况检查不起作用

GKE External Load Balancer Configuration, NEG's are empty, health checks are not working

我正在 GKE 中进行部署,这是我的第一个部署,所以我对这些概念还很陌生,但我了解他们使用这些工具的目的,只是需要经验才能自信。

首先,我有一个包含大约五个服务的集群,其中两个我想通过外部负载均衡器公开。我已经为 Gcloud 定义了一个注释来在负载平衡下设置这些,这似乎有效,我还设置了一个注释来为服务设置网络端点组。下面是部署和服务清单中的配置方式。

---
#api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert -f ./docker-compose.yml
    kompose.version: 1.21.0 ()
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: api
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert -f ./docker-compose.yml
        kompose.version: 1.21.0 ()
      creationTimestamp: null
      labels:
        io.kompose.service: api
    spec:
      containers:
      - args:
        - bash
        - -c
        - node src/server.js
        env:
        - name: NODE_ENV
          value: production
        - name: TZ
          value: America/New_York
        image: gcr.io/<PROJECT_ID>/api
        imagePullPolicy: Always
        name: api
        ports:
        - containerPort: 8087
        resources: {}
      restartPolicy: Always
      serviceAccountName: ""
status: {}

---
#api-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
    cloud.google.com/neg: '{"ingress": true}'
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  type: LoadBalancer
  ports:
  - name: "8087"
    port: 8087
    targetPort: 8087
status:
  loadBalancer: {}


我想我可能在这里缺少某种配置,但我不确定。

我还看到我可以通过添加

在 yaml 中定义 Liveness 检查
livenessProbe:
      httpGet:
        path: /healthz
        port: 8080

我的入口也是这样配置的:

---
# master-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: master-application-ingress
  annotations:
    ingress.kubernetes.io/secure-backends: "true"
spec:
  rules:
  - http:
      paths:
      - path: /api
        backend:
          serviceName: api
          servicePort: 8087
  - http:
      paths:
      - path: /ui
        backend:
          serviceName: ui
          servicePort: 80

而且我已经在它只需要端口的地方看到它,用于 TCP 检查,但我已经在我的应用程序和负载平衡器中定义了这些。我想我想知道应该在哪里定义这些检查。

另外,我有一个问题,即注释创建的 NEG 为空,或者这对于清单创建的 NEG 是否正常?

健康检查是基于您的 readinessProbe 而不是 livenessProbe 创建的。在创建入口资源之前,请确保在您的 pod 规范中配置了 readinessProbe。

至于空的NEG,这可能是由于Health Check不匹配造成的。 NEG 将依赖于就绪门功能 (explained here),因为您只定义了 livenessProbe,健康检查完全有可能配置错误并因此失败。

您创建的内部 LB 应该也有一个内部 IP,这样可以到达 pods 吗?如果两者都失败了,健康检查可能是问题所在,因为 NEG 没有将 pods 添加到它认为尚未准备就绪的组中

现在您还可以创建 BackendConfig 作为单独的 Kubernetes 声明。 我的例子:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: cms-backend-config
  namespace: prod
spec:
  healthCheck:
    checkIntervalSec: 60
    port: 80
    type: HTTP #case-sensitive
    requestPath: /your-healthcheck-path
  connectionDraining:
    drainingTimeoutSec: 60 

我没有任何 readiness/liveness 显式定义的探测器 并且一切正常。我还注意到 GKE 和 GCP 的其余部分之间有时仍然存在故障。我记得在尝试了很长一段时间不同的选项后,我需要在某个时候从头开始重新创建我的部署和入口。
我还做了什么,这可能是我开始在自动注册的 NEG 中看到端点的主要原因,是 添加了一个默认后端 到入口,而不是在 Load Balancer 中注册一个单独的默认后端:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: prod-ingress
  namespace: prod
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: load-balancer-ip
    networking.gke.io/managed-certificates: my-certificate
spec:
  backend:
    serviceName: my-service
    servicePort: 80
  rules:
    - host: "example.com"
      http:
        paths:
          - path: /
            backend:
              serviceName: my-service
              servicePort: 80