![如何在 Kubernetes Pod 中挂载具有特定 UID 的卷?](https://linux22.com/image/720001/%E5%A6%82%E4%BD%95%E5%9C%A8%20Kubernetes%20Pod%20%E4%B8%AD%E6%8C%82%E8%BD%BD%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%20UID%20%E7%9A%84%E5%8D%B7%EF%BC%9F.png)
因此,我尝试让 Nexus 基于这Kubernetes 中的图像,但失败了:
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory
文档中说该进程以 UID 200 运行,并且必须使用以下权限挂载该卷:
A persistent directory, /nexus-data, is used for configuration,
logs, and storage. This directory needs to be writable by the Nexus
process, which runs as UID 200.
我尝试搜索文档以找到使用这些权限安装卷的方法,但是,我找不到任何方法。
是否有人知道您是否可以在 PVC/PV 或部署的配置中指定使用哪个 UID 来挂载卷?如果可以,怎么做?
答案1
没有办法UID
使用的定义来设置Pod
,但 Kubernetes 保存了UID
源卷的。
因此,您可以设置UID
在InitContainer
主容器之前启动的,只需将其添加到containers
的路径中Deployment
:
initContainers:
- name: volume-mount-hack
image: busybox
command: ["sh", "-c", "chown -R 200:200 /nexus"]
volumeMounts:
- name: <your nexus volume>
mountPath: /nexus
答案2
就像 Anton 所说的,虽然我们不能使用 Pod 的定义来设置 UID。但这里有另一个解决这个问题的办法。
请参考Kubernetes官方文档为 Pod 或容器配置安全上下文
我使用的 pod 定义:
apiVersion: v1
kind: Pod
metadata:
name: nexus3
labels:
app: nexus3
spec:
securityContext:
fsGroup: 200
volumes:
- name: nexus-data-vol
emptyDir: {}
containers:
- name: nexus3-container
image: sonatype/nexus3
volumeMounts:
- name: nexus-data-vol
mountPath: /nexus-data
服务定义:
apiVersion: v1
kind: Service
metadata:
name: nexus3-service
spec:
type: NodePort
ports:
- port: 8081
nodePort: 30390
protocol: TCP
targetPort: 8081
selector:
app: nexus3
然后创建 pod 和服务,没有任何权限被拒绝或其他错误:
# kubectl create -f nexus3.yaml
# kubectl create -f nexus3-svc.yaml
尝试登录 Nexus3 容器并检查 /nexus-data 的所有者/权限:
# kubectl exec -it nexus3 -- sh
sh-4.2$ ls -ld /nexus-data/
drwxrwsrwx 16 root nexus 4096 Mar 13 09:00 /nexus-data/
sh-4.2$
可以看到,该目录属于root:nexus,同时还可以检查该目录中的文件:
sh-4.2$ cd /nexus-data/
sh-4.2$ ls -l
total 72
drwxr-sr-x 3 nexus nexus 4096 Mar 13 09:00 blobs
drwxr-sr-x 269 nexus nexus 12288 Mar 13 08:59 cache
drwxr-sr-x 8 nexus nexus 4096 Mar 13 09:00 db
drwxr-sr-x 3 nexus nexus 4096 Mar 13 09:00 elasticsearch
drwxr-sr-x 3 nexus nexus 4096 Mar 13 08:59 etc
drwxr-sr-x 2 nexus nexus 4096 Mar 13 08:59 generated-bundles
drwxr-sr-x 2 nexus nexus 4096 Mar 13 08:59 instances
drwxr-sr-x 3 nexus nexus 4096 Mar 13 08:59 javaprefs
drwxr-sr-x 2 nexus nexus 4096 Mar 13 08:59 kar
drwxr-sr-x 3 nexus nexus 4096 Mar 13 08:59 keystores
-rw-r--r-- 1 nexus nexus 8 Mar 13 08:59 lock
drwxr-sr-x 2 nexus nexus 4096 Mar 13 09:00 log
drwxr-sr-x 2 nexus nexus 4096 Mar 13 08:59 orient
-rw-r--r-- 1 nexus nexus 5 Mar 13 08:59 port
drwxr-sr-x 2 nexus nexus 4096 Mar 13 08:59 restore-from-backup
drwxr-sr-x 7 nexus nexus 4096 Mar 13 09:00 tmp
sh-4.2$ touch test-file
sh-4.2$ ls -l test-file
-rw-r--r-- 1 nexus nexus 0 Mar 13 09:13 test-file
sh-4.2$ mkdir test-dir
sh-4.2$ ls -l test-dir
total 0
sh-4.2$ ls -ld test-dir
drwxr-sr-x 2 nexus nexus 4096 Mar 13 09:13 test-dir
这就是 SetGID 的力量:)
现在让我们检查一下服务是否正常工作。我使用 minikube 来运行 Kubernetes 集群:
chris@XPS-13-9350 ~ $ minikube service nexus3-service --url
http://192.168.39.95:30390
chris@XPS-13-9350 ~ $ curl -u admin:admin123 http://192.168.39.95:30390/service/metrics/ping
pong
服务运行如预期。
答案3
关于托尔斯滕·布隆格的评论,当您在 pod 规范中的卷数组中配置 ConfigMaps 和 Secrets 时,您可以使用属性指定权限以允许您想要的访问defaultMode
,因此虽然您无法设置组和用户所有权,但您可以允许 pod 中的进程读取这些挂载中的文件。写入机密或配置图实际上没有任何意义并且默认权限模式是 755,因此对于任何用户来说读取都不是问题。