Как правильно использовать подкаталоги с проецируемыми объемами и configMaps - PullRequest
1 голос
/ 01 августа 2020

У меня есть веб-сервер 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

1 Ответ

2 голосов
/ 01 августа 2020

Есть несколько способов справиться с этим. Одним из решений было бы создать 3 отдельных тома из этих отдельных карт конфигурации и смонтировать каждый в соответствующий целевой файл / папку.

volumes:
        - name: nginx-cm
          configMap:
              name: nginx-conf-cm
        - name: nginx-sec
          configMap:
              name: nginx-conf-security-parameters-cm
        - name: nginx-serv
          configMap:
              name: nginx-conf-server-cm

        ...
        containers:
            -
                image: "alejandrocolomar/www:0.16-a6-kube"
                name: www-container
                volumeMounts:
                -   mountPath: /usr/local/etc/nginx/nginx.conf
                    name: nginx-cm
                    subPath: nginx.conf
                    readOnly: true
                -   mountPath: /usr/local/etc/nginx/conf.d/security-parameters.conf
                    name: nginx-sec
                    subPath: security-parameters.conf
                    readOnly: true
                -   mountPath: /usr/local/etc/nginx/conf.d/server.conf
                    name: nginx-serv
                    subPath: server.conf
                    readOnly: true

с использованием mountPath и subPath в volumeMounts позволяет вам выберите файл спецификаций c из заданной карты конфигурации (не имеет большого значения, поскольку у вас есть файл на см) и смонтируйте его как файл (не перекрывая другой контент в существующей папке).

Чтобы немного объясните приведенный выше код:

-   mountPath: /usr/local/etc/nginx/nginx.conf
    name: nginx-cm
    subPath: nginx.conf

указывает кубернетам использовать том с name из nignx-cm (определено в разделе томов). Выберите файл nginx.conf (через subpath), который можно найти на связанной карте конфигурации, и откройте его в контейнере (mountPath) в месте /usr/local/etc/nginx/nginx.conf.

Я не запустите код, чтобы не было опечаток

PS: обратите внимание, что может быть лучше создать собственный файл конфигурации внутри ../etc/nginx/conf.d/, а не заменять ../etc/nginx/nginx.conf. Таким образом, вам не нужно беспокоиться об уничтожении исходных файлов ../etc/nginx/, и вы можете смонтировать весь том вместо использования subpath (чтобы избежать проблем с обновлениями конфигурации)

...