Как преобразовать эту конфигурацию 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?