У меня есть веб-сервер nginx, развернутый с docker swarm, и я хочу иметь возможность развернуть его также с kubernetes.
Прямо сейчас у меня проблемы с вставкой конфигурации nginx файлы в контейнер.
Сначала я опубликую здесь то, что я уже делал в docker swarm, а затем то, что я пробовал в kubernetes.
Dockerfile
:
FROM "nginx:1.19.1-alpine" AS nginx
[...]
RUN \
rm -fv /etc/nginx/nginx.conf && \
ln -svT /usr/local/etc/nginx/nginx.conf \
/etc/nginx/nginx.conf && \
rm -frv /etc/nginx/conf.d && \
ln -svT /usr/local/etc/nginx/conf.d \
/etc/nginx/conf.d
[...]
Обычно я настраиваю образ так, чтобы я мог разместить свои пользовательские nginx файлы конфигурации в /usr/local/etc/
вместо /etc/
Docker swarm:
docker-compose.yaml
:
configs:
nginx_conf:
file: /run/configs/www/etc/nginx/nginx.conf
nginx_conf_security-parameters:
file: /run/configs/www/etc/nginx/conf.d/security-parameters.conf
nginx_conf_server:
file: /run/configs/www/etc/nginx/conf.d/server.conf
networks:
alejandro-colomar:
services:
www:
configs:
-
mode: 0440
source: nginx_conf
target: /usr/local/etc/nginx/nginx.conf
-
mode: 0440
source: nginx_conf_security-parameters
target: /usr/local/etc/nginx/conf.d/security-parameters.conf
-
mode: 0440
source: nginx_conf_server
target: /usr/local/etc/nginx/conf.d/server.conf
deploy:
placement:
constraints:
- node.role == worker
replicas: 1
restart_policy:
condition: any
image: "alejandrocolomar/www:0.16-a6-kube"
networks:
-
"alejandro-colomar"
ports:
- "32001:8080"
version: "3.8"
Здесь я беру файлы конфигурации nginx, которые я сначала вставляю в /run/configs/
со сценарием, чтобы они были в оперативной памяти, и помещаю их в контейнер как конфигурации в нужное место (/usr/local/etc/nginx/
и его подкаталог conf.d/
).
Я хотел бы сделать то же самое в кубернетах, и я читал, что для этого мне следует использовать прогнозируемый том (если это возможно с обычными томами или каким-либо другим способом, без использования каких-либо грязных обходных путей, я также открыт для этого), поэтому я попробовал fo llowing (после просмотра некоторых примеров, которые мне были не очень понятны):
config.sh
:
kubectl create configmap "nginx-conf-cm" \
--from-file "/run/configs/www/etc/nginx/nginx.conf"
kubectl create configmap "nginx-conf-security-parameters-cm" \
--from-file "/run/configs/www/etc/nginx/conf.d/security-parameters.conf"
kubectl create configmap "nginx-conf-server-cm" \
--from-file "/run/configs/www/etc/nginx/conf.d/server.conf"
deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: www-deploy
spec:
replicas: 1
selector:
matchLabels:
service: www-svc
template:
metadata:
labels:
service: www-svc
spec:
containers:
-
image: "alejandrocolomar/www:0.16-a6-kube"
name: www-container
volumeMounts:
-
mountPath: /usr/local/etc/nginx/
name: nginx-volume
readOnly: true
volumes:
-
name: nginx-volume
projected:
sources:
-
configMap:
name: nginx-conf-cm
path: "nginx.conf"
-
configMap:
name: nginx-conf-security-parameters-cm
path: "conf.d/security-parameters.conf"
-
configMap:
name: nginx-conf-server-cm
path: "conf.d/server.conf"
service.yaml
: (Этот я поместил сюда только для полноты)
apiVersion: v1
kind: Service
metadata:
name: www
spec:
ports:
-
nodePort: 32001
port: 8080
selector:
service: www-svc
type: NodePort
Развертывание, конечно же, завершилось неудачно, но я думаю, это было не так уж плохо. Когда я вошел в контейнер для его отладки, проблема заключалась в том, что три файла были помещены в /usr/local/etc/nginx/
, а подкаталог conf.d/
не был создан:
/usr/local/etc/nginx/nginx.conf
/usr/local/etc/nginx/security-parameters.conf
/usr/local/etc/nginx/server.conf
Как мне это исправить (предположительно в deployment.yaml
), чтобы в контейнере были следующие файлы?:
/usr/local/etc/nginx/nginx.conf
/usr/local/etc/nginx/conf.d/security-parameters.conf
/usr/local/etc/nginx/conf.d/server.conf