【问题标题】:Cannot mount volume as non-root using securityContext无法使用 securityContext 将卷挂载为非 root
【发布时间】:2020-10-02 15:34:56
【问题描述】:

根据the kubernetes docsecurityContext.fsGroup可以用来指定挂载卷的权限:

由于指定了 fsGroup 字段,容器的所有进程也是补充组 ID 2000 的一部分。卷 /data/demo 的所有者以及在该卷中创建的任何文件都将是组 ID 2000。

我无法使用该功能。

test.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/docker/mypv2
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  securityContext:
    runAsUser: 1001
    runAsGroup: 1001
    fsGroup: 1001
  volumes:
    - name: myvolume
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: mycontainer
      image: myimage:latest
      command: ['sleep', 'infinity']
      volumeMounts:
        - mountPath: "/mytest"
          name: myvolume

Dockerfile

FROM python:3.6

RUN groupadd --gid 1001 mygroup
RUN useradd --uid 1001 --gid mygroup --shell /bin/bash --create-home myuser

当我在 pod 上运行 shell 时,我正确地登录为用户 1001 (myuser)。但是,挂载的卷归组 root 所有:

myuser@mypod:/$ ls -la /mytest
total 8
drwxr-xr-x 2 root root 4096 Jun 12 18:49 .
drwxr-xr-x 1 root root 4096 Jun 12 18:49 ..

在 minikube 1.11.0 和 kubernetes 1.18.0 上测试

注意:在部署场景中,我无法访问 kubernetes 主机,因此无法在其中运行 chown 或 chmod。

【问题讨论】:

  • 你能通过在容器上设置securityContext.allowPrivilegeEscalation: false来检查吗?
  • @hoque 我测试过:没有变化。

标签: kubernetes


【解决方案1】:

这是因为您正在从 root 拥有的主机上挂载一个目录。如果将主机目录的所有权更改为 1001,它将更新容器上挂载目录的权限。

$ ls -la /home/docker/mypv/
total 0
drwxr-xr-x 2 root   root   40 Jun 12 21:41 .
drwxr-xr-x 4 docker docker 80 Jun 12 21:41 ..

$ kubectl exec -it mypod bash
myuser@mypod:/$ ls -la /mytest/
total 4
drwxr-xr-x 2 root root   40 Jun 12 21:41 .
drwxr-xr-x 1 root root 4096 Jun 12 21:45 ..

在主机上更新所有权

$ sudo chown docker:docker mypv
$ ls -la /home/docker/mypv/
total 0
drwxr-xr-x 2 docker docker 40 Jun 12 21:41 .
drwxr-xr-x 4 docker docker 80 Jun 12 21:41 ..

$ myuser@mypod:/$ ls -la /mytest/
total 4
drwxr-xr-x 2 1000 1000   40 Jun 12 21:41 .
drwxr-xr-x 1 root root 4096 Jun 12 21:45 ..
myuser@mypod:/$

【讨论】:

  • 我应该指定在部署场景中,我没有访问kubernetes主机的权限,所以我不能在那里运行chownchmod。我会更新问题。
【解决方案2】:

您可以添加 initContainers 来设置适当的权限

  initContainers:
  - name: volume-permission
    image: busybox
    command: ["sh", "-c", "chown -R 1001:1001 /mytest"]
    volumeMounts:
    - name: myvolume
      mountPath: /mytest
    securityContext:
      runAsUser: 0

【讨论】:

  • 这种方法有效,但它需要运行一个根容器,我试图避免这种情况。
  • @AurélienGasser 然后将runAsUserrunAsGroupfsGroup 更改为1000
  • @hariK 我正在尝试以用户 1001 的身份运行容器
  • @hoque 就像一个魅力!
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2020-02-20
  • 2020-12-10
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2022-07-27
相关资源
最近更新 更多