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 的提示,但继续看到该消息。事实证明,我必须在入口前等待几分钟才能验证服务运行状况。如果有人要这样做并完成了readinessProbe
和linvenessProbe
之类的所有步骤,只需确保您的入口指向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 资源