【问题标题】:Minikube volume write permissions?Minikube 卷写入权限?
【发布时间】:2020-03-01 20:45:19
【问题描述】:

大局是:我正在尝试在 Kubernetes 中安装带有插件的 WordPress,以便在 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

PVC 看起来像这样:

---
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

创建和绑定都成功。插件安装的 Job 定义如下:

---
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 遇到过这个问题吗?

【问题讨论】:

    标签: kubernetes permissions minikube persistent-volumes persistent-volume-claims


    【解决方案1】:

    这是一个长期问题,会阻止非 root 用户在 Minikube 中挂载 hostPath PersistentVolume 时写入容器。

    有两种常见的解决方法:

    1. 只需使用root用户即可。

    2. Configure a Security Context for a Pod or Container 使用 runAsUserrunAsGroupfsGroup。您可以在提供的链接中找到带有示例的详细信息。

    如果有帮助,请告诉我。

    【讨论】:

    • 感谢您的回答!出于安全原因,我不愿意使用 root 用户。我找到了一个 minikube 特定的解决方法(我认为这是一种解决方法,至少)。我在单独的回复中描述它!
    • 嗨!你能举个例子,如何正确地做到这一点,好吗?为runAsUser 等尝试了不同的值,仍然得到这个错误。
    【解决方案2】:

    我深入研究了 minikube 中卷挂载的工作方式,我想我想出了解决方案。

    TL;DR

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

    解释

    有安装时刻:

    • minikube 用minikube mount 挂载目录
    • 卷被挂载在 Kubernetes 中

    minikube mount 以参数提供的 UID 和 GID 设置 VM 中的目录,默认为 docker 用户和组。

    当卷作为目录挂载在 Pod 中时,它会以与主机的 完全相同的 UID 和 GID 进行挂载!您可以在我的问题中看到这一点:

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

    UID=1000 和 GID=1000 指的是 minikube 主机中的docker UID 和 GID。这给了我一个想法,我应该尝试在 Pod 中使用用户的 UID 和 GID 进行挂载。

    82 是wordpress:cli Docker 映像中用户和组www-data 的ID,它可以工作!

    最后一个值得一提的想法是:卷作为子目录安装在 Pod 中(在我的例子中是wp-content)。事实证明,wp-cli 实际上也需要访问该目录以创建临时文件夹。我最终做的是添加一个emptyDir 卷,如下所示:

    volumes
      - name: content
        emptyDir: {}
    

    希望对大家有帮助!值得一提的是,我的 minikube 版本是 1.7.3,在 OS X 上运行,带有 VirtualBox 驱动程序。

    【讨论】:

    • 这是一个很好的临时解决方案。但是,这会强制始终手动处理挂载,并且可能会发生其他错误(尤其是符号链接:请参阅minikube#9757。实际正确的解决方案是配置安全上下文并使用runAsUserrunAsGroup 作为@987654322 @
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2017-10-07
    • 2020-03-03
    • 2017-05-04
    • 2018-02-08
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多