Как преобразовать эту конфигурацию Nginx в Kubernetes Nginx Ingress?

У меня есть приложение django, которое обслуживается как wsgi с помощью gunicorn.

gunicorn --workers=4 --bind :8000 backend.wsgi

В моей локальной среде разработки я использовал docker-compose для установки обратного прокси Nginx перед ним для обслуживания статических файлов, как показано ниже (я опустил файлы env и другие не относящиеся к делу вещи). Я настроил DJANGO_ROOT_URL на использование пользовательского пути (например, "/be/") перед запросами. WORKDIR для каждого файла Django находится /backend на контейнере Docker и собирает статические файлы во время сборки, они помещаются, как ожидалось, внутри /backend/static.

  backend:
    image: backend-image
    volumes:
      - ./data/backend/static:/backend/static
    ports:
      - "9999:8000"
    environment:
      - DJANGO_ROOT_URL=/be/

  nginx:
    image: nginx
    volumes:
      - ./django/nginx.conf:/etc/nginx/templates/default.conf.template
      - ./data/backend/static:/static
    ports:
      - "8000:80"
    environment:
      - DJANGO_ROOT_URL=/be/
      # To show Nginx logs
      - ACCESS_LOG=${ACCESS_LOG:-off}
    depends_on:
      - backend

А это конфигурация:

upstream django {
    server backend:8000;
}

server {

    listen 80;

    # Max upload size
    client_max_body_size 100M;

    # Suppress log (on/off)
    access_log ${ACCESS_LOG};

    location ${DJANGO_ROOT_URL} {
        rewrite ${DJANGO_ROOT_URL}(.*) /$1  break;

        proxy_pass http://django;
        proxy_redirect off;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host; # to add port to DRF resources and allow CSRF
        proxy_set_header Connection "";
    }

    location ${DJANGO_ROOT_URL}static {
        rewrite ${DJANGO_ROOT_URL}(.*) /$1  break;

        root /;
    }
}
<

Теперь мне нужно собрать все это вместе в среде Kubernetes. Поскольку я уже настроил Nginx Ingress Controller, я подумал, что нет необходимости размещать еще один экземпляр nginx внутри pod, поскольку я могу использовать непосредственно ресурс Ingress. Вот мой скрипт k8s, который должен развернуть приложение Django:

apiVersion: v1
kind: ConfigMap
metadata:
  name: backend-config
data:
  DJANGO_ROOT_URL: "/be/"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  labels:
    app: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      serviceAccountName: cluster-manager
      containers:
        - name: backend
          image: backend-test
          imagePullPolicy: "Always"
          envFrom:
            - configMapRef:
                name: backend-config
---
apiVersion: v1
kind: Service
metadata:
  name: backend
  labels:
    app: backend
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 8000
      protocol: TCP
      targetPort: 8000
  selector:
    app: backend
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/app-root: /backend
spec:
  tls:
    - hosts:
        - backend.192.168.49.2.nip.io
  rules:
    - host: backend.192.168.49.2.nip.io
      http:
        paths:
          - path: /be(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: backend
                port:
                  number: 8000
          - path: /be/static(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: backend
                port:
                  number: 8000

Это работает, но статические файлы не обслуживаются вообще и не могут быть найдены. Есть ли лучший/правильный способ преобразовать установку docker-compose на Kubernetes?

Вернуться на верх