Minikube 卷写入权限?
Minikube volume write permissions?
大图是:我正在尝试在 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
创建绑定成功。插件安装的作业定义如下所示:
---
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 的这个问题吗?
这是一个长期问题,在 Minikube 中安装 hostPath
PersistentVolume 时会阻止非根用户写入容器。
有两种常见的解决方法:
只需使用root用户即可。
Configure a Security Context for a Pod or Container 使用 runAsUser
、runAsGroup
和 fsGroup
。您可以在提供的 link 中找到带有示例的详细信息。
如果有帮助,请告诉我。
我深入研究了 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,运行 on OS X with VirtualBox driver.
大图是:我正在尝试在 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
创建绑定成功。插件安装的作业定义如下所示:
---
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 的这个问题吗?
这是一个长期问题,在 Minikube 中安装 hostPath
PersistentVolume 时会阻止非根用户写入容器。
有两种常见的解决方法:
只需使用root用户即可。
Configure a Security Context for a Pod or Container 使用
runAsUser
、runAsGroup
和fsGroup
。您可以在提供的 link 中找到带有示例的详细信息。
如果有帮助,请告诉我。
我深入研究了 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,运行 on OS X with VirtualBox driver.