首页 文章

如何在服务于Kubernetes Ingress的GCE L7 balancer 器中获得自定义 Health 检查路径?

提问于
浏览
8

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

Deploymentfull 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
          …

Service

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

Ingress

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

事实证明,grafana服务于 / 上的302,但默认的GCE入口 Health 检查预计在 /source)上有200 . 如您所见,Deployment(第22行)中有一个自定义的readinessProbe .

一旦我将这些资源发布到kube-apiserver,一切都会毫无错误地创建 . 具体来说,Ingress得到一个公共ip4地址,但 the healtcheck is set up with the default / path instead of the custom one configured in the readinessProbe . 因此,如果我是Ingress的公共ip4地址,我会获得502 .

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

2 回答

  • 9

    引自here

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

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

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

    自定义 Health 检查

    使用GLBC插件

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

    目前,所有服务后端必须满足以下任一要求才能通过从GCE loadbalancer发送给它的HTTP(S)运行状况检查:响应200 on'/' . 内容无关紧要 . 在支持服务的pod上公开任意URL作为准备探测 . Ingress控制器首先查找兼容的就绪探测,如果找到,则将其作为GCE负载均衡器的HTTP(S)运行状况检查 . 如果没有就绪探测器,或者就绪探测器需要特殊的HTTP头,则Ingress控制器将GCE负载均衡器的HTTP运行状况检查指向“/” . 这是一个Ingress的示例,它采用来自 endpoints 的就绪探测作为其 Health 检查 .

    GLBC插件页面在_2762652中提及:

    所有Kubernetes服务必须在'/'上提供200页,或者通过GLBC的--health-check-path参数指定的任何自定义值 .

    没有GLBC插件

    如果您没有使用插件,目前Kubernetes确实要求您在 / 路径上为 GET 请求提供成功的运行状况检查,否则后端将不会获得任何流量 .

    在这个bug中有一些关于此的背景知识 .

    Google容器引擎(GKE)

    如果您使用的是Google容器引擎(GKE),则 Health 检查的默认Kubernetes要求相同apply there too .

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

    回答您的真实问题

    说完所有这些,正如你(@mmoya)在你的答案中指出的那样,将用于准备探测的相同端口添加为pod中的一个端口可以解决你的情况问题,因为端口本身没有暴露在外面否则就是吊舱 . 这导致Kubernetes依赖于 / 的 Health 检查 .

相关问题