如何允许非root用户写入挂载的EFS in EKS

108次阅读
没有评论

问题描述

在使用AWS EFS CSI驱动程序时,遇到了一个问题。他想要配置一个静态分配的EFS,以便多个以非root用户身份运行的Pod可以读取和写入文件系统。他尝试了一些配置,但是非root用户无法写入挂载的EFS。他想知道如何正确配置静态分配的EFS,以便多个以非root用户身份运行的Pod可以在挂载的EFS中读取和写入。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户的描述,可以尝试使用initContainer来解决这个问题。initContainer可以在需要写入文件系统的任何Pod中使用。
以下是一个示例Pod的定义:

apiVersion: v1
kind: Pod
metadata:
  name: app3
spec:
  containers:
  - name: app3
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out3.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
    securityContext:
      runAsGroup: 1337
  initContainers:
  - name: fs-owner-change
    image: busybox
    command:
    - chown
    - "root:1337"
    - "/efs-fs"
    volumeMounts:
    - mountPath: /efs-fs
      name: persistent-storage
  securityContext:
    fsGroup: 1337
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

在上面的示例中,我们定义了一个名为app3的Pod。app3容器是以非root用户身份运行的。我们使用initContainer来更改/efs-fs目录的所有者为root:1337,以便app3容器可以写入该目录。fsGroup属性设置了app3容器的文件系统组为1337,以确保容器可以访问该目录。

方案2

根据用户@JerryChen的建议,可以尝试使用EFS的访问点(access points)来简化配置。访问点可以允许多个Pod共享访问EFS实例。
以下是使用动态分配的EFS的示例StorageClass、PersistentVolumeClaim和Pod的定义:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: {{ .Values.efsVolumeHandle }}
  directoryPerms: "775"
reclaimPolicy: Retain

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi

---

apiVersion: v1
kind: Pod
metadata:
  name: app3
spec:
  containers:
  - name: app3
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out3.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  securityContext:
    runAsUser: 1000
    runAsGroup: 1337
    fsGroup: 1337
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

在上面的示例中,我们定义了一个名为efs-sc的StorageClass,它使用了动态分配的EFS。directoryPerms属性设置了目录的权限为775。我们还定义了一个名为efs-claim的PersistentVolumeClaim,它使用了上述的StorageClass。最后,我们定义了一个名为app3的Pod,它运行在非root用户身份下。runAsGroupfsGroup属性设置了容器的文件系统组为1337,以确保容器可以访问挂载的EFS。
这种方法比使用initContainer来强制更改文件系统权限要好得多。
以上是解决这个问题的两种方案,你可以根据自己的需求选择适合的方案。

正文完