繁体   English   中英

GCP HTTP(S) 负载平衡器忽略 GKE readinessProbe 规范

[英]GCP HTTP(S) load balancer ignoring GKE readinessProbe specification

我已经看过这个问题了 AFAIK 我正在那里的答案中做所有事情。

使用 GKE,我为 kubernetes 集群部署了一个基于 GCP HTTP(S) 负载均衡器的入口,该集群包含两个几乎相同的部署:同一应用程序的生产和开发实例。

我在每个 pod 模板上设置了一个专用端口,用于负载均衡器的运行状况检查,这样它们就不会受到来自主 HTTP 端口上根路径的重定向的影响。 但是,运行状况检查始终失败。

这些文档中,我在部署中添加了一个readinessProbe参数,负载均衡器似乎完全忽略了该参数。

我已经使用以下(在单独的终端中)验证了:p-ready (9292;专用运行状况检查端口)上的服务器是否正常运行:

➜ kubectl port-forward deployment/d-an-server p-ready
➜ curl http://localhost:9292/ -D -
HTTP/1.1 200 OK
content-length: 0
date: Wed, 26 Feb 2020 01:21:55 GMT

我错过了什么?

关于以下配置的一些说明:

  • 下面的${...}变量由构建脚本作为部署的一部分填充。
  • 第二个服务 ( s-an-server-dev ) 几乎是第一个服务(使用它自己的部署)的完全重复,只是在名称和标签上带有-dev后缀。

部署

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "d-an-server"
  namespace: "default"
  labels:
    app: "a-an-server"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "a-an-server"
  template:
    metadata:
      labels:
        app: "a-an-server"
    spec:
      containers:
        - name: "c-an-server-app"
          image: "gcr.io/${PROJECT_ID}/an-server-app:${SHORT_SHA}"
          ports:
            - name: "p-http"
              containerPort: 8080
            - name: "p-ready"
              containerPort: 9292
          readinessProbe:
            httpGet:
              path: "/"
              port: "p-ready"
            initialDelaySeconds: 30

服务

apiVersion: "v1"
kind: "Service"
metadata:
  name: "s-an-server"
  namespace: "default"
spec:
  ports:
    - port: 8080
      targetPort: "p-http"
      protocol: "TCP"
      name: "sp-http"
  selector:
    app: "a-an-server"
  type: "NodePort"

入口

apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
  name: "primary-ingress"
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "primary-static-ipv4"
    networking.gke.io/managed-certificates: "appname-production-cert,appname-development-cert"
spec:
  rules:
    - host: "appname.example.com"
      http:
        paths:
          - backend:
              serviceName: "s-an-server"
              servicePort: "sp-http"
    - host: "dev.appname.example.com"
      http:
        paths:
          - backend:
              serviceName: "s-an-server-dev"
              servicePort: "sp-http-dev"

我认为这里发生的事情是 GKE 入口根本没有被告知端口 9292。你指的是入口中的sp-http ,它指的是端口 8080。

您需要确保以下内容:

1.服务的targetPort字段必须指向pod端口的containerPort值或名称。

2.readiness探针必须暴露在与Ingress中指定的servicePort相匹配的端口上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM