是否需要在端点openapi.yaml文件中声明后端的readinessProbe路径?

时间:2019-08-06 19:45:22

标签: google-cloud-platform google-kubernetes-engine google-cloud-endpoints google-cloud-networking

我正在部署的项目是GKE容器后端,前端具有Cloud Endpoints API。它通过Ingress和NodePort服务。我已经在ESP容器上声明了就绪探测器:

        readinessProbe:
          httpGet:
            path: /ping
            port: 8080

但是我观察到/ ping路径必须在openapi.yaml中声明而没有任何安全性,否则它将返回404,或者在声明了某些安全性定义后返回401。

这是预期的吗?我在“端点样本”回购中看不到有关此内容的任何信息:

https://github.com/GoogleCloudPlatform/endpoints-samples/tree/master/k8s

4 个答案:

答案 0 :(得分:0)

在仔细研究了文档和代码示例之后,我发现ESP为此具有一个healthz自变量:

    spec:
      containers:
      - name: esp
        image: gcr.io/endpoints-release/endpoints-runtime:1
        args: [
          "-p", "8080",
          "-a", "127.0.0.1:8081",
          "-s", "SERVICE_NAME",
          "--rollout_strategy", "managed",
          "-z", "healthz",
        ]
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
        ports:
          - containerPort: 8080

https://github.com/GoogleCloudPlatform/endpoints-samples/blob/master/k8s/esp_echo_gke_ingress.yaml

在为ESP指定healthz参数时,它会将nginx配置为仅对该路径返回200:

% if healthz:
    location = /${healthz} {
      return 200;
      access_log off;
    }
% endif

https://github.com/cloudendpoints/esp/blob/5c9f586b14db58607d1780966cceac923809c150/start_esp/nginx-auto.conf.template#L123-L128

因此,看来Google希望您只对ESP容器而不是后端进行健康检查。

这回答了我最初的问题,尽管它仍然导致第二个问题,即:为什么不对后端进行健康检查?

答案 1 :(得分:0)

我假设术语“后端”是指集群的节点或GKE运行的Pod。对于这两种情况,GKE都是自我管理的,节点和Pod的运行状况由主节点监视,因此它们应始终可用。有关这方面的更多信息,请参见Kubernetes SchedulerGKE Cluster Architecture

在这种情况下,用于GKE入口的运行状况检查不检查后端,而是检查群集中运行的服务。要检查这些服务是否正常,请按照本article中的说明使用就绪和活跃性探针。

答案 2 :(得分:0)

如果您想对后端进行健康检查,则需要在openapi配置中列出健康检查路径,以使ESP进行转发。

答案 3 :(得分:0)

我遇到了同样的问题,但似乎可以对GCE边车和最终的后端(例如,您实际构建的api)进行健康检查。

诀窍是,必须在云端点容器(而不是api容器)上将api的运行状况检查配置为就绪探针。您检查的端点也没有针对它的安全性,因此它是可公开访问的(尽管似乎您也可以使用api密钥配置运行状况检查)。

我遵循了先前的建议,还向esp容器添加了“ healthz”参数。我的API运行在端口80上,状态端点为/api/status

,处于不受保护的状态
spec:
  containers:
  - name: esp
    image: gcr.io/endpoints-release/endpoints-runtime:1
    args: [
      "--http_port=8081",
      "--backend=127.0.0.1:80",
      "--service=MY SERVICE",
      "--rollout_strategy=managed",
      "-z", "healthz",
    ]
    ports:
    - containerPort: 8081
    readinessProbe:
      httpGet:
        path: /api/status/
        port: 8081
  - name: api
    image: MY IMAGE
    ports:
      - containerPort: 80

这有效,因此现在检查可以验证两个容器都在运行一个readinessProbe。有趣的是,当我检查LoadBalancer时,它还曾经针对/healthz进行了配置,而以前从未如此。在诊断端点容器正在工作的情况下这将毫无用处,但是该api无法工作