kubernetes 不健康的入口后端

Posted

技术标签:

【中文标题】kubernetes 不健康的入口后端【英文标题】:kubernetes unhealthy ingress backend 【发布时间】:2017-01-10 16:22:43 【问题描述】:

我遵循了负载均衡器教程: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

更新2

readinessProbe 中删除自定义标头后,它开始工作!非常感谢。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。按照 Tex 的提示,但继续看到该消息。事实证明,我必须在入口前等待几分钟才能验证服务运行状况。如果有人要这样做并完成了readinessProbelinvenessProbe 之类的所有步骤,只需确保您的入口指向NodePort 的服务,然后等待几分钟,直到出现黄色警告图标变为绿色。此外,请检查 StackDriver 上的日志以更好地了解发生了什么。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

我可以看到标记为 某些后端服务处于 UNKNOWN 状态 状态的 Ingress 状态为黄色。 我等了 30 多分钟,但没有反映更改。

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

【讨论】:

【参考方案4】:

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

在GCE L7 Ingress Docs中有解释。

健康检查

目前,所有服务后端必须满足以下任一要求才能通过从 GCE 负载均衡器发送给它的 HTTP 健康检查: 1. 以 '/' 上的 200 响应。内容无所谓。 2. 在支持服务的 pod 上公开一个任意 url 作为就绪探测。

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

【讨论】:

我有同样的问题,你的答案,加上这里的答案:***.com/questions/42967763/… 是帮助我解决这个问题的原因

以上是关于kubernetes 不健康的入口后端的主要内容,如果未能解决你的问题,请参考以下文章

无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

了解kubernates对象(第三集)

Kubernates Ingress 配置证书

Kubernetes 实战 -- 泛 kubernates 导论

kubernetes ingress traefik 入门

kubernates 学习笔记