Миникуб том разрешений на запись? - PullRequest
0 голосов
/ 01 марта 2020

Общая картина такова: я пытаюсь установить WordPress с плагинами в Kubernetes, для разработки в Minikube.

Я хочу использовать официальный образ wp-cli Docker для установки плагинов. Я пытаюсь использовать том персистентности с включенной записью. В Minikube я включаю монтирование в кластер minikube командой:

minikube mount ./src/plugins:/data/plugins

Теперь определение PV выглядит следующим образом:

---
apiVersion: v1
kind: PersistentVolume
metadata:
    name: wordpress-install-plugins-pv
    labels:
        app: wordpress
        env: dev
spec:
    capacity:
        storage: 5Gi
    storageClassName: ""
    volumeMode: Filesystem
    accessModes:
        - ReadWriteOnce
    hostPath:
        path: /data/plugins

PV C выглядит следующим образом:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: wordpress-install-plugins-pvc
    labels:
        app: wordpress
spec:
    accessModes:
        - ReadWriteOnce    
    resources:
        requests:
            storage: 5Gi
    storageClassName: ""
    volumeName: wordpress-install-plugins-pv

Создание и связывание успешны. Определение задания для установки плагина выглядит следующим образом:

---
apiVersion: batch/v1
kind: Job
metadata:
    name: install-plugins
    labels:
        env: dev
        app: wordpress
spec:
    template:
        spec:
            securityContext:
              fsGroup: 82 # www-data
            volumes:
                - name: plugins-volume
                  persistentVolumeClaim:
                       claimName: wordpress-install-plugins-pvc                
                - name: config-volume
                  configMap:
                       name: wordpress-plugins
            containers:
            - name: wpcli
              image: wordpress:cli
              volumeMounts:
              - mountPath: "/configmap"
                name: config-volume
              - mountPath: "/var/www/html/wp-content/plugins"
                name: plugins-volume
              command: ["sh", "-c", "id; \
                                     touch /var/www/html/wp-content/plugins/test; \
                                     ls -al /var/www/html/wp-content; \
                                     wp core download --skip-content --force && \
                                     wp config create --dbhost=mysql \
                                                      --dbname=$MYSQL_DATABASE \
                                                      --dbuser=$MYSQL_USER \
                                                      --dbpass=$MYSQL_PASSWORD && \
                                     cat /configmap/wp-plugins.txt | xargs -I % wp plugin install % --activate" ]
              env:
                  - name: MYSQL_USER
                    valueFrom:
                        secretKeyRef:
                            name: mysql-secrets
                            key: username
                  - name: MYSQL_PASSWORD
                    valueFrom:
                        secretKeyRef:
                            name: mysql-secrets
                            key: password
                  - name: MYSQL_DATABASE
                    valueFrom:
                        secretKeyRef:
                            name: mysql-secrets
                            key: dbname
            restartPolicy: Never
    backoffLimit: 3

Опять же, создание выглядит хорошо, и все шаги выглядят хорошо. Проблема, которая у меня есть, заключается в том, что, по-видимому, разрешения для подключенного тома не позволяют текущему пользователю выполнять запись в папку. Вот содержимое журнала:

uid=82(www-data) gid=82(www-data) groups=82(www-data)
touch: /var/www/html/wp-content/plugins/test: Permission denied
total 9
drwxr-xr-x    3 root     root          4096 Mar  1 20:15 .
drwxrwxrwx    3 www-data www-data      4096 Mar  1 20:15 ..
drwxr-xr-x    1 1000     1000            64 Mar  1 17:15 plugins
Downloading WordPress 5.3.2 (en_US)...
md5 hash verified: 380d41ad22c97bd4fc08b19a4eb97403
Success: WordPress downloaded.
Success: Generated 'wp-config.php' file.
Installing WooCommerce (3.9.2)
Downloading installation package from https://downloads.wordpress.org/plugin/woocommerce.3.9.2.zip...
Unpacking the package...
Warning: Could not create directory.
Warning: The 'woocommerce' plugin could not be found.
Error: No plugins installed.

Я что-то не так делаю? Я пробовал разные варианты minikube mount, но ничего не помогло! Кто-нибудь сталкивался с этой проблемой с minikube?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Это долгосрочная проблема, которая не позволяет пользователю, не являющемуся root, писать в контейнер при монтировании hostPath PersistentVolume в Minikube.

Существует два распространенных обходных пути:

  1. Просто используйте пользователя root.

  2. Настройте контекст безопасности для контейнера или контейнера , используя runAsUser, runAsGroup и fsGroup. Вы можете найти подробную информацию с примером в приведенной ссылке.

Пожалуйста, дайте мне знать, если это помогло.

0 голосов
/ 03 марта 2020

Я посмотрел глубже в том, как монтирование тома работает в мини-кубе, и я думаю, что нашел решение.

TL; DR

minikube mount ./src/plugins:/data/mnt/plugins --uid 82 --gid 82

Объяснение

Возможны следующие моменты:

  • minikube, монтирующий каталог с minikube mount
  • томом, монтируемым в Kubernetes

minikube mount устанавливает каталог в виртуальной машине с UID и GID, предоставленными в качестве параметров, по умолчанию docker пользователь и группа.

Когда том монтируется в модуле Pod как каталог, он монтируется с точно такие же UID и GID, как у хоста! Вы можете видеть это в моем вопросе:

drwxr-xr-x    1 1000     1000            64 Mar  1 17:15 plugins

UID = 1000 и GID = 1000 относятся к docker UID и GID в хосте мини-куба. Это дало мне идею, что я должен попробовать смонтировать с UID и GID пользователя в Pod.

82 - это идентификатор пользователя и группы www-data в wordpress:cli Docker image, и это работает!

Последнее, на что стоит обратить внимание: том смонтирован как подкаталог в модуле Pod (wp-content в моем случае). Оказалось, что wp-cli действительно нужен доступ к этому каталогу, чтобы создать временную папку. В итоге я добавил том emptyDir, например:

volumes
  - name: content
    emptyDir: {}

Надеюсь, это кому-нибудь поможет! Моя версия minikube стоит 1.7.3 и работает на OS X с драйвером VirtualBox.

...