区域网络端点组不健康,即使该容器应用程序正常运行

Zonal network endpoint group unhealthy even though that container application working properly

我已经在 Google 云上创建了一个 Kubernetes 集群,即使应用程序 运行 正确(我已经检查了集群内的 运行 请求)似乎NEG 健康检查工作不正常。关于原因有什么想法吗?

我尝试将服务从 NodePort 更改为 LoadBalancer,为服务添加注释的不同方式。我在想,可能和django端的https要求有关。

# [START kubernetes_deployment]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: moner-app
  labels:
    app: moner-app
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: moner-app
  template:
    metadata:
      labels:
        app: moner-app
    spec:
      containers:
      - name: moner-core-container
        image: my-template
        imagePullPolicy: Always
        resources:
          requests:
            memory: "128Mi"
          limits:
            memory: "512Mi"
        startupProbe:
          httpGet:
            path: /ht/
            port: 5000
            httpHeaders:
              - name: "X-Forwarded-Proto"
                value: "https"
          failureThreshold: 30
          timeoutSeconds: 10
          periodSeconds: 10
          initialDelaySeconds: 90
        readinessProbe:
            initialDelaySeconds: 120
            httpGet:
              path: "/ht/"
              port: 5000
              httpHeaders:
              - name: "X-Forwarded-Proto"
                value: "https"
            periodSeconds: 10
            failureThreshold: 3
            timeoutSeconds: 10
        livenessProbe:
          initialDelaySeconds: 30
          failureThreshold: 3
          periodSeconds: 30
          timeoutSeconds: 10
          httpGet:
            path: "/ht/"
            port: 5000
            httpHeaders:
              - name: "X-Forwarded-Proto"
                value: "https"
        volumeMounts:
          - name: cloudstorage-credentials
            mountPath: /secrets/cloudstorage
            readOnly: true
        env:
            # [START_secrets]
            - name: THIS_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: GRACEFUL_TIMEOUT
              value: '120'
            - name: GUNICORN_HARD_TIMEOUT
              value: '90'
            - name: DJANGO_ALLOWED_HOSTS
              value: '*,$(THIS_POD_IP),0.0.0.0'
        ports:
        - containerPort: 5000
        args: ["/start"]
        
      # [START proxy_container]
      - image: gcr.io/cloudsql-docker/gce-proxy:1.16
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=moner-dev:us-east1:core-db=tcp:5432",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        resources:
          requests:
            memory: "64Mi"
          limits:
            memory: "128Mi"
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      # [END proxy_container]
      # [START volumes]
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir: {}
        - name: cloudstorage-credentials
          secret:
            secretName: cloudstorage-credentials
      # [END volumes]
# [END kubernetes_deployment]

---

# [START service]
apiVersion: v1
kind: Service
metadata:
  name: moner-svc
  annotations:
    cloud.google.com/neg: '{"ingress": true, "exposed_ports": {"5000":{}}}' # Creates an NEG after an Ingress is created
    cloud.google.com/backend-config: '{"default": "moner-backendconfig"}'
  labels:
    app: moner-svc
spec:
  type: NodePort
  ports:
  - name: moner-core-http
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: moner-app
# [END service]

---

# [START certificates_setup]
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: managed-cert
spec:
  domains:
    - domain.com
    - app.domain.com
# [END certificates_setup]

---

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: moner-backendconfig
spec:
  customRequestHeaders:
      headers:
      - "X-Forwarded-Proto:https"
  healthCheck:
    checkIntervalSec: 15
    port: 5000
    type: HTTP
    requestPath: /ht/


---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: managed-cert-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: moner-ssl
    networking.gke.io/managed-certificates: managed-cert
    kubernetes.io/ingress.class: "gce"
spec:
  defaultBackend:
    service:
      name: moner-svc
      port: 
        name: moner-core-http

我仍然不确定为什么,但是当我将服务移动到端口 80 并将运行状况检查保持在 5000 时,我已经设法工作了。

服务配置:

# [START service]
apiVersion: v1
kind: Service
metadata:
  name: moner-svc
  annotations:
    cloud.google.com/neg: '{"ingress": true, "exposed_ports": {"5000":{}}}' # Creates an NEG after an Ingress is created
    cloud.google.com/backend-config: '{"default": "moner-backendconfig"}'
  labels:
    app: moner-svc
spec:
  type: NodePort
  ports:
  - name: moner-core-http
    port: 80
    protocol: TCP
    targetPort: 5000
  selector:
    app: moner-app
# [END service]

后端配置:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: moner-backendconfig
spec:
  customRequestHeaders:
      headers:
      - "X-Forwarded-Proto:https"
  healthCheck:
    checkIntervalSec: 15
    port: 5000
    type: HTTP
    requestPath: /ht/

显然,您没有 GCP 防火墙规则来允许端口 5000 上的流量流向您的 GKE 节点。 Creating an ingress firewall rule IP 范围 - 0.0.0.0/0 和端口 - 针对您的 GKE 节点的 TCP 5000 可以让您的设置即使在端口 5000 下也能正常工作。