【问题标题】:My k8s liveness probe isn't setting the Host我的 k8s 活性探测器没有设置主机
【发布时间】:2023-02-25 03:49:58
【问题描述】:

我正在尝试部署一个配置了启动和活动探测的 Django 应用程序。因为它是一个 Django 应用程序,所以我需要探针上的 Host 标头来匹配我的 ALLOWED_HOSTS 中允许的内容。由于我的探测都是 httpGet 检查,最简单的解决方案似乎是将 httpHeaders 字段用作 suggested in the kubernetes docs

这似乎适用于 startupProbe,但不适用于 livenessProbe。

我的探针的净化版本:

livenessProbe:
  httpGet:
    httpHeaders:
      - name: Host
        value: k8s-probes
    path: /health/liveness
    port: http
    scheme: HTTP
startupProbe:
  httpGet:
    httpHeaders:
      - name: Host
        value: k8s-probes
    path: /health/
    port: http
    scheme: HTTP

当 pod 启动时,我看到 200 个对初始启动探测的响应,然后一旦 liveness 探测启动,我得到 400 个响应,错误是 pod IP 地址不在 ALLOWED_HOSTS 中,表明 k8s 没有设置主机头我已经为 liveness probe 定义了。

【问题讨论】:

  • 变量k8s-probes 的值是多少?
  • 实际值是服务的内部集群主机名,pod-name.namespace。两个探头之间是相同的,我已经非常仔细地检查过了。
  • 您可以在设置此 liveness 端点的位置显示您的 Django 应用程序代码吗?
  • 我不能,这也不相关。 Django 拒绝基于主机不在 ALLOWED_HOSTS 中的请求。在 livenessProbe 的情况下,它永远不会到达我的健康代码,而在 startupProbe 的情况下,Host 标头设置为 httpHeaders 字段中定义的,并且一切正常运行。特别是在 livenessProbe 拒绝时,Django 记录主机标头被设置为 pod 的 IP。
  • @Endophage:启用探测前后是否使用相同的 HTTP 请求?你能提供你正在使用的请求吗?

标签: django kubernetes


【解决方案1】:

虽然这是一个老问题,但我在网上找到的最简单的解决方案是在 ALLOWED_HOSTS 中添加 gethostbyname(gethostname())。这只需要在settings.py文件中添加from socket import gethostname, gethostbyname

可能存在一些关于安全性的注意事项,如果您正在寻找更强大的解决方案,这篇文章of the mozilla marketing engineering & Ops teams 会解决这个问题。

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多