0

我已经看过这个问题了;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"
4

1 回答 1

2

我认为这里发生的事情是 GKE 入口根本没有通知端口 9292。您指sp-http的是入口是指端口 8080。

您需要确保以下内容:

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

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

于 2020-02-26T03:25:36.517 回答