问题描述
在使用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用户身份下。runAsGroup
和fsGroup
属性设置了容器的文件系统组为1337
,以确保容器可以访问挂载的EFS。
这种方法比使用initContainer
来强制更改文件系统权限要好得多。
以上是解决这个问题的两种方案,你可以根据自己的需求选择适合的方案。