K8s livenessProbe配置httpHeaders自定义Host头未生效如何解决
问题根因
该现象由Kubernetes kubelet的探针实现逻辑导致:
- kubelet构造
httpGet类型探针请求时,默认会将请求Host头设置为被探测Pod的IP地址 - 1.24版本前的Kubernetes存在逻辑缺陷:
startupProbe作为后续新增的探针类型,httpHeaders自定义字段覆盖默认值的逻辑正常,但livenessProbe、readinessProbe中httpHeaders配置的自定义Host头,会被默认的Pod IP值反向覆盖,最终发出去的请求还是携带Pod IP作为Host头 httpGet配置块本身提供了专用的host字段,用于指定探测请求的目标主机名与默认Host头,该字段优先级高于httpHeaders中配置的Host字段,不会被默认值覆盖。仅在httpHeaders中配置Host并非官方推荐的自定义探测Host的实现方式。
解决方案
可任选一种方案修复:
方案1:显式配置httpGet.host字段(推荐,无版本兼容问题)
调整探针配置,在httpGet层级直接添加host: k8s-probes,无需在httpHeaders中重复配置Host头,参考配置如下:
livenessProbe: httpGet: host: k8s-probes path: /health/liveness port: http scheme: HTTP startupProbe: httpGet: host: k8s-probes path: /health/ port: http scheme: HTTP
该写法在所有支持httpGet探针的Kubernetes版本中均可正常生效,不会出现自定义Host被覆盖的问题。
方案2:Django侧适配
如果不便修改探针配置,可调整Django应用配置兼容探测请求:
- 将
k8s-probes加入ALLOWED_HOSTS列表(需配合探针正确配置Host头使用) - 若需兼容默认携带Pod IP的探测请求,可在应用启动时动态获取当前Pod IP并加入
ALLOWED_HOSTS;也可针对健康检查路径单独配置豁免规则,跳过ALLOWED_HOSTS校验,注意仅豁免健康检查路径,不要全局关闭Host校验。
方案3:升级集群版本
将Kubernetes集群升级至1.24及以上版本,该版本已修复liveness、readiness探针自定义Host头被默认值覆盖的缺陷。但即使升级版本,仍然推荐使用httpGet.host字段配置自定义Host,避免后续版本逻辑变动导致配置失效。
内容的提问来源于stack exchange,提问作者Endophage
相关产品推荐
相关产品推荐

