You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:45:46