17

我正在尝试在 GCE 中的 Kubernetes(服务器 1.6.4)内部署一个 grafana 实例。我正在使用以下清单:

部署完整版):

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: grafana
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: grafana
    spec:
      initContainers:
        …                                
      containers:
        - name: grafana
          image: grafana/grafana
          readinessProbe:
            httpGet:
              path: /login
              port: 3000
          …

服务

apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  selector:
    name: grafana
  ports:
    - protocol: TCP
      port: 3000
  type: NodePort

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana
spec:
  tls:
    - secretName: grafana.example.com
  backend:
    serviceName: grafana
    servicePort: 3000

事实证明,grafana 提供 302 开启,/但默认 GCE 入口运行状况检查预计开启 200 /来源)。如您所见,Deployment中有一个自定义的readinessProbe(第 22 行)。

一旦我将这些资源发布到 kube-apiserver 上,所有内容都将被正确创建。具体来说,Ingress获得一个公共 ip4 地址,但使用默认路径设置了 healthcheck,/而不是在readinessProbe. 因此,如果我curl使用 Ingress 的公共 ip4 地址,我会得到 502。

/login该问题可以通过在 GCE 控制台中手动更改探测路径来解决。

4

4 回答 4

14

从这里引用:

GLBC 要求您在 Pod 规范中定义端口(在您的情况下为 3000)。

ports解决方案是在添加自定义之外声明用于运行状况检查的端口readinessProbe

containers:
  - name: grafana
    readinessProbe:
      httpGet:
        path: /login
        port: 3000
    ports:
      - name: grafana
        containerPort: 3000
    …
于 2017-06-20T18:54:33.830 回答
7

自定义运行状况检查

使用 GLBC 插件

从您的问题中不太清楚,但是如果您使用的是GCE Load-Balancer Controller (GLBC) Cluster Addon,您可以自定义运行状况检查路径

目前,所有服务后端必须满足以下任一要求,才能通过 GCE 负载均衡器发送给它的 HTTP(S) 健康检查:

  • 200on响应'/'。内容无所谓。
  • 在支持服务的 pod 上公开一个任意 url 作为就绪探测。

Ingress 控制器首先寻找一个兼容的就绪探测,如果找到,它会将其作为 GCE 负载均衡器的 HTTP(S) 健康检查。如果没有就绪探测,或者就绪探测需要特殊的 HTTP 标头,则 Ingress 控制器将 GCE 负载均衡器的 HTTP 健康检查指向“/”。这是一个 Ingress 示例,它采用来自端点的就绪探测作为其健康检查。

GLBC 插件页面在限制部分中提到了这一点:

所有 Kubernetes 服务都必须提供一个200页面'/',或者您通过 GLBC 的--health-check-path 参数指定的任何自定义值。

没有 GLBC 插件

如果您不使用插件,当前 Kubernetes 确实要求您为成功检查路径上的请求提供服务200,否则后端将不会获得任何流量。GET/

在这个bug中有一些背景知识。

谷歌容器引擎 (GKE)

如果您使用的是 Google Container Engine (GKE),则同样适用于健康检查的默认 Kubernetes 要求。

通过 Ingress 公开的服务必须为路径上的请求提供带有HTTP 200状态的响应。这用于健康检查。如果您的应用程序未在 上提供服务,则后端将被标记为不健康并且不会获得流量。GET/HTTP 200/

回答你的真正问题

说了这么多,正如您(@mmoya)在您的回答中指出的那样,添加用于就绪探测的相同端口作为 pod 中的一个端口可以解决您的问题,因为端口本身没有暴露在外面否则吊舱。这导致 Kubernetes 转而依赖健康检查/

于 2017-06-16T19:31:16.123 回答
1

Ingress 创建时推断的健康检查的条件是

一个 Ingress backend.servicePort 引用一个 Service 端口,匹配 Pod 的 spec.containers[].readinessProbe.httpGet.port 并且 Service 的 targetPort 引用服务 Pod 的容器 [].spec.ports.containerPort。

2020 年年中,GKE 引入了注解和自定义资源定义BackendConfig来明确配置运行状况检查,请参阅concepts/ingress#health_checks

警告:如果您再次更改 readinessProbe,则在推断的运行状况检查中, GKE 不会使准备情况探测和运行状况检查保持同步。它只会在 Ingress(重新)创建时再次推断。

要直接编辑外部负载均衡器运行状况检查(对于自定义 http 路径),请使用

gcloud compute backend-services list
gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
gcloud compute health-checks describe
gcloud compute health-checks update http BACKEND_SERVICE_NAME --request-path=/api/health
于 2021-07-04T13:02:21.290 回答
0

这适用于 1.9。设置httpHeaders也消除了在ALLOWED_HOSTS设置中添加额外主机名的必要性。

readinessProbe:
  httpGet:
    path: /login
    port: 3000 # Must be same as containerPort
    httpHeaders:
    - name: Host
      value: yourdomain.com
于 2021-08-13T07:26:53.613 回答