GKE Ingress 后端标记为 "Unhealthy"

GKE Ingress backends marked as "Unhealthy"

我正在学习如何使用入口在 Google Kubernetes Engine 上公开我的应用程序。我遵循了几个教程并对所需内容进行了粗略设置。但是,我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的 NodePort 服务访问。

这是我的部署文件:(我删除了一些数据,但大部分数据保持不变)

--
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "deployment-1"
  namespace: "default"
    spec:
      containers:
      - name: myContainer
        image: "myImage/"
        readinessProbe:
          httpGet:
            path: /app1
            port: 8080
          initialDelaySeconds: 70      
        livenessProbe:
          httpGet:
            path: /app1
            port: 8080
          initialDelaySeconds: 70    
        ports:
        - containerPort: 8080
          protocol: TCP
        volumeMounts:
        - mountPath: opt/folder/libs/jdbc/
          name: lib
      volumes:
      - name: lib
        persistentVolumeClaim:
          claimName: lib                            
---

正如我所读,我需要一个 ReadinessProbe 和 LivinessProbe,以便 GKE 运行 对我定义的路径进行健康检查,并使用我自己定义的路径,在此处显示为 /app1(这将 return a 200 OK),生成的健康检查应该通过。我设置了70秒的初始延迟作为图像中tomcat服务器运行ning启动的缓冲时间。

接下来我创建了一个 NodePort 服务作为 Ingress 的后端: 我通过连接到该服务的节点的 public IP 和节点端口进行测试,并成功 运行s。

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - name: my-port
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: deployment-1
  type: NodePort

然后是 Ingress 清单文件:

我在这里保留了一个名称为 "gke-my-static-ip" 的静态 IP 地址,并创建了一个域名为 "mydomain.web.com" 的 managedCertificate "gke-my-certificate"。这也已在 DNS 记录上配置为指向该保留的静态 IP。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gke-my-ingress-1
  annotations:
    kubernetes.io/ingress.global-static-ip-name: gke-my-static-ip
    networking.gke.io/managed-certificates: gke-my-certificate
spec:
  rules:
  - host: mydomain.web.com
    http:
      paths:
      - backend:
          serviceName: my-service
          servicePort: my-port

入口默认创建 2 个后端,一个在 /healthz 路径上,一个在我自定义的路径 /app1 上。 healthz 路径 returns 200 正常,但我的自定义路径无法连接。我检查了防火墙规则并允许端口 tcp30000-32767。

检查 stackdriver,运行状况检查尝试使用 /app1 路径访问我的 LoadBalancer 的 IP,但它似乎总是 return 502 错误。

我是否遗漏了任何设置步骤?

附加入口、端点:

NAME                                        HOSTS                    ADDRESS          PORTS   AGE
ingress.extensions/gke-my-ingress-1   mydomain.web.com   <IP_ADDRESS>   80      3d15h

NAME                         ENDPOINTS           AGE
endpoints/kubernetes          <IP_ADDRESS>443   9d
endpoints/presales-service    <IP_ADDRESS>:8080     4d16h

kubectl 获取入口:

Name:             gke-my-ingress-1
Namespace:        default
Address:          <IP_ADDRESS>
Default backend:  default-http-backend:80 (<IP_ADDRESS>)
Rules:
  Host                    Path  Backends
  ----                    ----  --------
  mydomain.web.com
                          /   my-service:my-port (<IP_ADDRESS>:8080)
Annotations:
  ingress.kubernetes.io/target-proxy:                k8s-tp-default-gke-my-ingress-1--d8d0fcf4484c1dfd
  ingress.kubernetes.io/url-map:                     k8s-um-default-gke-my-ingress-1--d8d0fcf4484c1dfd
  kubernetes.io/ingress.global-static-ip-name:       gke-my-static-ip
  networking.gke.io/managed-certificates:            gke-my-certificate
  ingress.gcp.kubernetes.io/pre-shared-cert:         mcrt-e7dd5612-e6b4-42ca-91c9-7d9a86abcfb2
  ingress.kubernetes.io/forwarding-rule:             k8s-fw-default-gke-my-ingress-1--d8d0fcf4484c1dfd
  ingress.kubernetes.io/ssl-cert:                    mcrt-e7dd5612-e6b4-42ca-91c9-7d9a86abcfb2
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.global-static-ip-name":"gke-my-static-ip","networking.gke.io/managed-certificates":"gke-my-certificate"},"name":"gke-my-ingress-1","namespace":"default"},"spec":{"rules":[{"host":"mydomain.web.com","http":{"paths":[{"backend":{"serviceName":"my-service","servicePort":"my-port"},"path":"/"}]}}]}}

  ingress.kubernetes.io/backends:               {"k8s-be-30242--d8d0fcf4484c1dfd":"HEALTHY","k8s-be-30310--d8d0fcf4484c1dfd":"UNHEALTHY"}
  ingress.kubernetes.io/https-forwarding-rule:  k8s-fws-default-gke-my-ingress-1--d8d0fcf4484c1dfd
  ingress.kubernetes.io/https-target-proxy:     k8s-tps-default-gke-my-ingress-1--d8d0fcf4484c1dfd

通过添加 successThreshold 和 FailureThreshold 来修改 Readiness 和 Liveliness 探测器,我设法使我的入口正常工作。可能是因为我的应用程序需要更多缓冲时间才能 运行。

        readinessProbe:
          httpGet:
            path: /app1/
            port: 8080
          periodSeconds: 5
          timeoutSeconds: 60 
          successThreshold: 1
          failureThreshold: 3
          initialDelaySeconds: 70      
        livenessProbe:
          httpGet:
            path: /app1/
            port: 8080
          periodSeconds: 5
          timeoutSeconds: 60
          successThreshold: 1
          failureThreshold: 3          
          initialDelaySeconds: 70