Py学习  »  Django

如何在Kubernetes内部运行的django应用程序中服务静态文件

ForMartha • 4 年前 • 218 次点击  

我在Django内置了一个小应用程序。它作为前端,安装在K8S中的一个集群中。

我正在使用helm部署图表,但未能正确地为Django提供静态文件。

我在多个地方搜索过,但最终找不到能解决我问题的地方。

这是我的入口文件:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: orion-toolbelt
  namespace: {{ .Values.global.namespace }}
  annotations:
    #    ingress.kubernetes.io/secure-backends: "false"
    #    nginx.ingress.kubernetes.io/secure-backends: "false"
    ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/rewrite-target: /
    ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    ingress.kubernetes.io/ingress.allow-http: "true"
    nginx.ingress.kubernetes.io/ingress.allow-http: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 500m
spec:
  rules:
    - http:
        paths:
          - path: /orion-toolbelt
            backend:
              serviceName: orion-toolbelt
              servicePort: {{ .Values.service.port }}


Django中的静态文件位置保持默认,例如

STATIC_URL = "/static"

用户最终无法以这种方式访问静态文件。

接下来我该怎么办?

附件是错误: HTML-static_files-error --编辑:5/8/19-- pod的deployment.yaml如下所示:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: {{ .Values.global.namespace }}
  name: orion-toolbelt
  labels:
    app: orion-toolbelt
spec:
  replicas: 1
  selector:
    matchLabels:
      app: orion-toolbelt
  template:
    metadata:
      labels:
        app: orion-toolbelt
    spec:
      containers:
        - name: orion-toolbelt
          image: {{ .Values.global.repository.imagerepo }}/orion-toolbelt:10.4-SNAPSHOT-15
          ports:
            - containerPort: {{ .Values.service.port }}
          env:
            - name: "USERNAME"
              valueFrom:
                secretKeyRef:
                  key:  username
                  name: {{ .Values.global.secretname }}
            - name: "PASSWORD"
              valueFrom:
                secretKeyRef:
                  key:  password
                  name: {{ .Values.global.secretname }}
            - name: "MASTER_IP"
              valueFrom:
                secretKeyRef:
                  key:  master_ip
                  name: {{ .Values.global.secretname }}
          imagePullPolicy: {{ .Values.global.pullPolicy }}
      imagePullSecrets:
        - name: {{ .Values.global.secretname }}

edit2:20/8/19-添加服务.yam

apiVersion: v1
kind: Service
metadata:
  namespace: {{ .Values.global.namespace }}
  name: orion-toolbelt
spec:
  selector:
    app: orion-toolbelt
  ports:
    - protocol: TCP
      port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38401
 
218 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Marcin Ginszt
Reply   •   1 楼
Marcin Ginszt    4 年前

您应该只在容器中包含/static目录,并在应用程序中调整到该目录的路径。 否则,如果它必须是/static,或者您不希望在容器中包含静态文件,或者您希望其他容器访问卷,那么您应该考虑将kubernetes卷装入部署/statefulset。

@编辑

您可以这样测试kubernetes pod中是否存在此路径:

kubectl get po <-此命令将为您提供pod的名称

kubectl exec -it <name of pod> sh <-此命令将允许您在容器外壳中执行命令。

如果你的路径存在,你可以在那里测试。如果是的话,那是你的应用程序的错误,如果不是的话,你在Docker中加错了。

您还可以向kubernetes pod添加路径,而不必在 码头集装箱。 Check this link for details