kubernetes不健康的入口后端

Wil*_*ink 21 docker kubernetes google-kubernetes-engine

我按照负载均衡器教程:https: //cloud.google.com/container-engine/docs/tutorials/http-balancer,当我使用Nginx图像时工作正常,当我尝试使用自己的应用程序图像时后端切换到不健康.

我的应用程序重定向到/(返回302),但我livenessProbe在pod定义中添加了一个:

    livenessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.bar.com
Run Code Online (Sandbox Code Playgroud)

我的入口看起来像:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
spec:
  backend:
    serviceName: foo
    servicePort: 80
  rules:
  - host: foo.bar.com
Run Code Online (Sandbox Code Playgroud)

服务配置是:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 80 
      targetPort: 4001
Run Code Online (Sandbox Code Playgroud)

后端运行状况ingress describe ing如下:

backends:       {"k8s-be-32180--5117658971cfc555":"UNHEALTHY"}
Run Code Online (Sandbox Code Playgroud)

入口的规则如下:

Rules:
  Host  Path    Backends
  ----  ----    --------
  * *   foo:80 (10.0.0.7:4001,10.0.1.6:4001)
Run Code Online (Sandbox Code Playgroud)

任何指针都非常受欢迎,我一直在努力工作几个小时而没有运气.

更新

我已经添加了readinessProbe我的部署,但仍然出现了一些东西,并且入口仍然是不健康的.我的探针看起来像:

    readinessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.com
Run Code Online (Sandbox Code Playgroud)

我将服务改为:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 4001
      targetPort: 4001
Run Code Online (Sandbox Code Playgroud)

UPDATE2

从我readinessProbe开始工作后删除自定义标头后!非常感谢.

tex*_*tex 35

您需要添加一个readinessProbe(只需复制您的livenessProbe).

它在GCE L7 Ingress Docs中有解释.

健康检查

目前,所有服务后端必须满足以下任一要求才能通过从GCE loadbalancer发送给它的HTTP运行状况检查:1.响应200 on'/'.内容无关紧要.2.在支持服务的pod上公开任意URL作为准备探测.

还要确保readinessProbe指向您向Ingress公开的同一端口.在您的情况下,因为您只有一个端口,所以很好,如果您添加另一个端口,您可能会遇到麻烦.


dus*_*ris 6

我认为值得注意的是,这是文档中一个非常重要的限制:

对 Pod 的 readinessProbe 的更改不会影响创建后的 Ingress。

在添加了我的 readinessProbe 之后,我基本上删除了我的入口 ( kubectl delete ingress <name>),然后再次应用我的 yaml 文件来重新创建它,并在一切恢复正常后不久。


Mau*_*cio 5

我遇到了同样的问题。遵循 Tex 的提示,但继续查看该消息。事实证明,我不得不等待几分钟才能进入验证服务健康状况。如果有人要执行相同的操作并完成所有步骤,例如readinessProbelinvenessProbe,只需确保您的入口指向的服务是NodePort,然后等待几分钟,直到黄色警告图标变为绿色。此外,检查 StackDriver 上的日志以更好地了解发生了什么。