kubernetes不健康的进入后端

时间:2016-09-02 14:02:34

标签: docker kubernetes google-kubernetes-engine

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

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

    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

我的入口看起来像:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
spec:
  backend:
    serviceName: foo
    servicePort: 80
  rules:
  - host: foo.bar.com

服务配置是:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 80 
      targetPort: 4001

ingress describe ing中的后端健康状况如下:

backends:       {"k8s-be-32180--5117658971cfc555":"UNHEALTHY"}

并且入口的规则如下:

Rules:
  Host  Path    Backends
  ----  ----    --------
  * *   foo:80 (10.0.0.7:4001,10.0.1.6:4001)

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

更新

我已将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

我将服务改为:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 4001
      targetPort: 4001

UPDATE2

readinessProbe移除自定义标题后,它开始工作了!非常感谢。

4 个答案:

答案 0 :(得分:28)

You need to add a readinessProbe (just copy your livenessProbe).

It's explained in the GCE L7 Ingress Docs

  

健康检查

     

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

还要确保readinessProbe指向您向Ingress公开的同一端口。在你的情况下没问题,因为你只有一个端口,如果再添​​加一个端口,你可能会遇到麻烦。

答案 1 :(得分:3)

我遇到了同样的问题。跟随Tex的提示,但继续看到这个消息。事实证明,我必须在进入之前等待几分钟才能验证服务运行状况。如果有人要进行同样的操作并完成readinessProbelinvenessProbe等所有步骤,请确保您的入口指向的服务是NodePort,并等待几分钟直到黄色警告图标变为绿色警告图标。另外,检查StackDriver上的日志以更好地了解正在发生的事情。

答案 2 :(得分:3)

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

对Pod的readinessProbe所做的更改不会影响Ingress创建后的状态。

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

答案 3 :(得分:2)

在更新我的入口 readinessProbe 之后,我也遇到了完全相同的问题。

我可以看到黄色标记为 某些后端服务处于未知状态 的Ingress状态。 我等待了30分钟以上,但更改未反映出来。

超过24小时后,更改将反映出来,并且状态变为绿色。 我没有获得任何官方文档,但似乎是GCP Ingress资源中的错误。