如何在Kubernetes Pod中使用特定的UID挂载卷?


14

因此,我正在尝试根据Kubernetes中的映像来运行Nexus ,但是失败了:

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?如果是这样,怎么办?

Answers:


31

无法UID使用定义设置Pod,但是Kubernetes保存UID源卷的。

因此,您可以设置UIDby 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

效果很好。感谢您的破解。与Oracle DB映像一起使用。
托马斯·霍夫曼'18

但是,这对ConfigMap和Secrets没有帮助。
Torsten Bronger

这也对我有用(也适用于chmod)。我希望有人(或Kubernetes)实施一种不太hacky的方法。
leeman24 '19

我正在使用类似的方法command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]来确保文件夹可写。
Martin Tapp

但是问题是,我们如何知道主容器中进程的UID?也可以是200以外的其他内容,对吧?
纳瓦兹

7

就像安东所说,尽管我们无法使用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

该服务正在按预期方式工作。


0

关于Torsten Bronger注释,当您在Pod规范的volumes数组中配置ConfigMaps和Secrets时,可以指定权限以允许使用该defaultMode属性进行访问,因此,尽管无法设置组和用户所有权,但您可以可以允许Pod中的进程读取那些安装中的文件。写入机密或配置映射实际上没有任何意义,并且默认的权限模式仍然是755,因此对于任何用户而言,读取都不应该成为问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.