容器使用不同用户运行时共享存储卷
使用存储卷在pod的不同容器中共享数据。可以顺利地在一个容器中写入数据,在另 一个容器中读出这些数据。
但这只是因为两个容器都以root用户运行,对存储卷中的所有文件拥有全部权限。
现在假设使用前面介绍的runAsUser选项。你可能需要在一个pod中用两个不同的用户运行两个容器(可能是两个第三方的容器,都以它们自己的特定用户运行进程)。如果这样的两个容器通过存储卷共享文件,它们不一定能够读取或写入另 一个容器的文件。
因此,Kubemetes允许为pod中所有容器指定supplemental组,以允许它们无论以哪个用户ID运行都可以共享文件 。这可以通过以下两个属性设置:
• fsGroup : 卷内创建的任何文件都将使用 GID (由于fsGroup参数))
• supplementalGroups
解释它们的效果的最好方法是使用例子说明,下面来看一 下如何在pod中使用它们,以及它们效果。以下代码清单描述了一个拥有两个共享同一存储卷的容器的pod。
两个容器使用同一存储卷:
[root@master ~]# cat volume-fsgroup.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-shared-volume-fsgroup
spec:
securityContext:
fsGroup: 555
supplementalGroups: [666, 777]
containers:
- name: first
image: alpine
command: ["/bin/sleep","999999"]
securityContext:
runAsUser: 1111
volumeMounts:
- name: shared-volume
mountPath: /volume
readOnly: false
- name: second
image: alpine
command: ["/bin/sleep","999999"]
securityContext:
runAsUser: 2222
volumeMounts:
- name: shared-volume
mountPath: /volume
readOnly: false
volumes:
- name: shared-volume
emptyDir: {}
# fsGroup和supplementalGroups在pod级别的安全上下文中定义
securityContext:
fsGroup: 555
supplementalGroups: [666, 777]
# securityContext:
runAsUser: 1111
第一个容器用户ID为1111
创建这个pod之后, 进入第一个容器查看它的用户ID和组ID:
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-with-shared-volume-fsgroup 2/2 Running 0 29m
[root@master ~]# kubectl exec -it pod-with-shared-volume-fsgroup -c first sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
/ $ id
uid=1111 gid=0(root) groups=555,666,777
id命令显示, 这个pod运行在ID为1111 的用户下, 它的用户组为0 (root),但用户组555、 666、 777也关联到了该用户下。
在pod的定义中, 将fsGroup设置成了555, 因此, 存储卷属千用户组ID为555 的用户组:
/ $ ls -ld /volume
drwxrwsrwx 2 root 555 4096 Aug 12 02:16 /volume
该容器在这个存储卷所在目录中创建的文件, 所属的用户ID为1111,即该容器运行时使用的用户ID),所属的用户组ID为555 :
/ $ echo foo > /volume/foe
/ $ ls -l /volume/
total 4
-rw-r--r-- 1 1111 555 4 Aug 12 02:49 foe
这个文件的所属用户情况与通常设置下的新建文件不同。 在通常情况下, 某一用户新创建文件所属的用户组ID,与该用户的所属用户组ID相同,在这种情下是0。在这个容器的根文件系统中创建一个文件, 可以验证这一点:
/ $ ls -l /tmp/
total 4
-rw-r--r-- 1 1111 root 4 Aug 12 02:54 foo
如你所见, 安全上下文中的fsGroup属性当进程在存储卷中创建文件时起作用, 而supplementalGroups属性定义了某个用户所关联的额外的用户组。