如何在服务Kubernetes Ingress的GCE L7平衡器中获得自定义健康检查路径?

时间:2017-06-16 08:18:32

标签: kubernetes google-compute-engine kubernetes-health-check

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

部署full version):

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入口健康检查预计在/source)上有200。如您所见,Deployment(第22行)中有一个自定义 readinessProbe

一旦我将这些资源发布到kube-apiserver,一切都会毫无错误地创建。具体来说, Ingress 获取公共IP4地址,但使用默认/路径设置healtcheck,而不是readinessProbe 。因此,如果我curl Ingress的公共ip4地址,我会得到502。

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

3 个答案:

答案 0 :(得分:9)

引自here

  

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

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

containers:
  - name: grafana
    readinessProbe:
      httpGet:
        path: /login
        port: 3000
    ports:
      - name: grafana
        containerPort: 3000
    …

答案 1 :(得分:5)

自定义运行状况检查

使用GLBC插件

您的问题并不十分清楚,但如果您使用的是GCE Load-Balancer Controller (GLBC) Cluster Addon,则可以customize the health check path

  

目前,所有服务后端都必须满足以下任一条件   要求传递从GCE发送给它的HTTP(S)运行状况检查   负载均衡器:

     
      
  • 200上回复'/'。内容无关紧要。
  •   
  • 在支持服务的pod上公开任意URL作为准备探测。
  •   
     

Ingress控制器首先寻找兼容的就绪探测器,   如果找到一个,则将其作为GCE负载均衡器的HTTP(S)运行状况   校验。如果没有准备就绪探针,或准备探针需要   特殊的HTTP标头,Ingress控制器指向GCE   loadbalancer在'/'处的HTTP运行状况检查。 This is an example   Ingress采用来自端点的准备探测作为其   健康检查。

GLBC插件页面在 Limitations section 中提到了这一点:

  

所有Kubernetes服务必须在200上提供'/'页面,或其他任何内容   您通过GLBC --health-check-path指定的自定义价值   参数。

没有GLBC插件

如果您没有使用该插件,目前Kubernetes确实要求您200 GET /HTTP 200路径请求,以便成功进行健康检查,否则后端将无法获得任何流量

bug中有一些关于此问题的背景知识。

Google容器引擎(GKE)

如果您使用的是Google容器引擎(GKE),则健康检查的默认Kubernetes要求为apply there too

  

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

回答您的真实问题

如上所述,正如您(@mmoya)在您的回答中指出的那样,将用于准备探测的相同端口添加为pod中的一个端口可以解决您的案例问题,因为端口本身是否则不要暴露在吊舱外面。这导致Kubernetes依赖于p的健康检查。

答案 2 :(得分:0)

对 Ingress 创建进行推断健康检查的条件是

<块引用>

一个 Ingress backend.servicePort 引用一个 Service 端口,匹配一个 Pods 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