【问题标题】:DisallowedHost Django deployment in Kubernetes cluster: Invalid HTTP_HOST headerKubernetes 集群中的 DisallowedHost Django 部署:HTTP_HOST 标头无效
【发布时间】:2020-06-05 22:01:08
【问题描述】:

我在 Azure Kubernetes 集群中为前端服务部署了 Django,并进行了一些基本配置。但请注意,同样的问题也适用于我的本地 Minikube 集群。我从远程容器注册表中获取我的 Django 前端容器映像并公开port 8010。我的服务配置也很简单。

frontend.deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-v1
  labels:
    app: frontend-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend-v1
  template:
    metadata:
      labels:
        app: frontend-v1
    spec:
      containers:
        - name: frontend-v1
          imagePullPolicy: Always
          image: yourremotename.azurecr.io/frontend-remote:v1
          ports:
          - containerPort: 8010
      imagePullSecrets:
        - name: acr-secret

frontend.service.yaml

kind: Service
apiVersion: v1
metadata:
  name: frontend-v1
spec:
  selector:
    app: frontend-v1
  ports:
  - NodePort:
    protocol: TCP
    port: 8010
    targetPort: 8010
  type: NodePort

现在,当我在浏览器中访问我部署的前端服务时http://172.17.194.253:31436 使用 Django 的设置 DEBUG = True,我得到错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.6/dist-packages/django/utils/deprecation.py", line 93, in __call__
    response = self.process_request(request)
  File "/usr/local/lib/python3.6/dist-packages/django/middleware/common.py", line 48, in process_request
    host = request.get_host()
  File "/usr/local/lib/python3.6/dist-packages/django/http/request.py", line 122, in get_host
    raise DisallowedHost(msg)

Exception Type: DisallowedHost at /
Exception Value: Invalid HTTP_HOST header: '172.17.194.253:31436'. You may need to add '172.17.194.253' to ALLOWED_HOSTS.

但是如何将pod的动态创建的HostIp绑定到Django的ALLOWED_HOSTS

【问题讨论】:

    标签: django kubernetes azure-aks


    【解决方案1】:

    从 Kubernetes 1.7 开始,可以在 kubernetes 部署文件中请求 pod 的 HostIp。(1)

    首先调整部署文件,为HostIp设置所需的环境变量。在下面的场景中,我设置了 POD_IP 和 HOST_IP,因为它们是不同的。您可以使用 Kubernetes 部署文件中的环境变量注入各种 Kubernetes 应用程序数据变量,有关此主题的更多信息,请查看here

    frontend.service.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend-v1
      labels:
        app: frontend-v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: frontend-v1
      template:
        metadata:
          labels:
            app: frontend-v1
        spec:
          containers:
            - name: frontend-v1
              imagePullPolicy: Always
              image: yourremotename.azurecr.io/frontend-remote:v1
              ports:
              - containerPort: 8010
              env:
                - name: POD_IP
                  valueFrom:
                    fieldRef:
                      fieldPath: status.podIP
                - name: HOST_IP
                  valueFrom:
                    fieldRef:
                      fieldPath: status.hostIP
          imagePullSecrets:
            - name: acr-secret
    

    现在在您的 Django 设置中调整 ALLOWED_HOSTS 配置以指向 HOST_IP 环境变量。

    settings.py

    import os
    ...
    ALLOWED_HOSTS = [os.environ.get('HOST_IP'), '127.0.0.1']
    ....
    

    请注意,这允许 pod 的 HostIP 以及 localhost 用于本地开发目的。

    警告! 一些博文或教程建议您将ALLOWED_HOSTS = ['*'] 设置为接受所有主机IP,但这是一个严重的安全漏洞。不要这样做!

    现在重新部署您的 pod,您的 Django 应用程序应该会再次顺利运行。

    【讨论】:

    • 它在您的情况下是如何工作的? hostIp 是内部节点的 ip,服务(负载均衡器)外部 ip 不同,我无法从 pod 的状态访问它
    • @Sheed 这是一个不同的问题,也许这会有所帮助:stackoverflow.com/questions/58407345/…
    • 感谢您的链接,但我已经探索了该解决方案,问题是我目前无法购买链接到我的集群 Ip 的域名,我正在寻找更多动态解决方案,否则我会选择 ingress + clusterIp 甚至在外部 ip 分配后手动编辑部署
    • 您在哪个云提供商平台上工作? IE。 AKS、EKS 还是?
    • 我在提供者的文档中找到了一种方法 :)
    【解决方案2】:

    或者,只需在 readinessProbe 标头中添加 Host: yourdomain.com。您还可以自定义默认路径。

    readinessProbe:
      httpGet:
        path: /
        port: 8010  # Must be same as containerPort
        httpHeaders:
        - name: Host
          value: yourdomain.com
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 2014-04-20
      • 2013-02-20
      • 2019-09-29
      • 2016-01-10
      • 2017-03-27
      • 2016-07-11
      相关资源
      最近更新 更多