Kubernetes准备检查未正确设置HTTP主机头

时间:2019-06-11 08:36:34

标签: kubernetes

我有一个要在容器中运行的Django应用程序,我想检查该容器是否准备就绪。 kubernetes版本是1.10.12。 settings.py指定仅允许来自特定域的流量:

ALLOWED_HOSTS = ['.example.net']

如果我设置探针时未设置任何标头,例如:

      containers:
      - name: django
       readinessProbe:
          httpGet:
            path: /readiness-path
            port: 8003

然后,我收到400响应,正如预期的那样-探针被阻止访问readiness-path

Invalid HTTP_HOST header: '10.5.0.67:8003'. You may need to add '10.5.0.67' to ALLOWED_HOSTS.

我已经测试过,只要我手动在请求上设置主机头,就可以成功卷曲准备路径,因此我尝试将httpGet上的主机头设置为partially documented here,如下所示:< / p>

        readinessProbe:
          httpGet:
            path: /readiness-path
            port: 8003
            httpHeaders:
              - name: Host
                value: local.example.net:8003

探针继续失败并显示400。

在附近,我尝试将httpHeader设置为小写h,如下所示:

        readinessProbe:
          httpGet:
            path: /django-admin
            port: 8003
            httpHeaders:
              - name: host
                value: local.example.net:8003

现在,该探针实际上已命中服务器,但是从日志中可以明显看出,它没有附加具有正确值的HTTP_HOST标头,而是被附加了,并且由于合并的HTTP_HOST标头无效而失败:

Invalid HTTP_HOST header: '10.5.0.67:8003,local.example.net:8003'. The domain name provided is not valid according to RFC 1034/1035

为什么它会在这里识别标头并添加它,而不是替换它?

我试图验证的一个怀疑是,也许仅在1.10之后才将对主机标头的正确处理添加到Kubernetes httpHeaders规范中。关于何时将主机头添加到Kubernetes,我一直找不到明确的答案-API documentation for 1.10中没有描述特定的头。

是否可以在Kubernetes 1.10中的就绪探针上设置主机标头,如果是的话,如何完成?如果不是,是否有其他指针可以使此准备就绪探针正确地到达我的应用程序的准备就绪路径?

更新

我现在已经尝试按照注释者的建议在没有端口的情况下设置值:

            httpHeaders:
              - name: Host
                value: local.acmi.net.au

结果与使用端口设置值相同。使用大写字母H时,主机头值根本不会被提取,使用小写字母h时,主机头值将附加到现有的主机头值上。

2 个答案:

答案 0 :(得分:1)

此问题已在Kubernetes 1.2.3+中修复-请参见kubernetes/kubernetes#24288。我以类似的方式(出于相似的原因)配置了一个部署。这适用于不需要在/admin/login网址上进行身份验证的Craft CMS实例:

    readinessProbe:
      httpGet:
        path: /admin/login
        port: 80
        httpHeaders:
        - name: Host
          value: www.example.com
      timeoutSeconds: 5

答案 1 :(得分:1)

肖恩·肖的答案很有用,但最终的胜利组合最终是:

readinessProbe:
          httpGet:
            path: /readiness-path/ # << NO REDIRECTS ON THIS PATH
            port: 8003
            httpHeaders:
              - name: host
                value: local.example.net # << NO PORT ON THE HOST VALUE

经过一些日志考虑后,我终于意识到,我准备就绪的路径正在从/readiness-path重定向到/readiness-path/。一旦提供了斜杠来回避重定向,它就开始起作用。由此得出的结论是,重定向并没有保留在探测请求上设置的httpHeaders。