Minikube卷写入权限



总体情况是:我正在尝试在Kubernetes中安装带有插件的WordPress,以便在Minikube中进行开发。

我想使用官方的wpcli 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的这个问题?

这是一个长期问题,它阻止非root用户在Minikube中装载hostPathPersistentVolume时写入容器。

有两种常见的解决方法:

  1. 只需使用root用户。

  2. 使用runAsUserrunAsGroupfsGroup为Pod或Container配置安全上下文。您可以在提供的链接中找到详细的信息和示例。

如果有帮助,请告诉我。

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

TL;DR

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

解释

有安装时刻:

  • minikube使用minikube mount装载目录
  • volume安装在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是指minikube主机中的dockerUID和GID。这给了我一个想法,我应该尝试在Pod中安装用户的UID和GID。

82是wordpress:cliDocker镜像中用户和组www-data的id,它有效!

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

volumes
- name: content
emptyDir: {}

我希望它能帮助任何人!值得一提的是,我的minikube版本是1.7.3,运行在带有VirtualBox驱动程序的OSX上。

不幸的是,对于今天的Minikube来说,2(使用runAsUser、runAsGroup和fsGroup为Pod或Container配置安全上下文。您可以在提供的链接中找到详细的信息和示例。(似乎不是一个可行的选项,因为在后台使用的HostPast提供程序不支持安全上下文。似乎有一个更新的HostPath Provisioner,它会先发制人地将新装载设置为777,但我的1.25 MiniKube附带的那个仍然将这些路径返回为755。

我正在部署一个守护程序集,它装载hostpath provisioner目录,并将所有子目录设置为每秒777个。显然不是很好,但我更喜欢这种解决方法,因为它是minikube集群的自包含(没有安装shennanigans(,而且它不像扰乱provisioner插件那样具有侵入性(无论如何可能工作,也可能不工作(。

apiVersion: v1
kind: Namespace
metadata:
name: minikube-pv-hack
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: minikube-pv-hack
namespace: minikube-pv-hack
spec:
selector:
matchLabels:
name: minikube-pv-hack
template:
metadata:
labels:
name: minikube-pv-hack
spec:
terminationGracePeriodSeconds: 0
containers:
- name: minikube-pv-hack
image: registry.access.redhat.com/ubi8:latest
command:
- bash
- -c
- |
while : ; do
chmod 777 /target/*
sleep 1
done
volumeMounts:
- name: host-vol
mountPath: /target
volumes:
- name: host-vol
hostPath:
path: /tmp/hostpath-provisioner/default

相关内容

  • 没有找到相关文章

最新更新