作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220125450139/
相干话题:https://www.cnsre.cn/tags/eks/
前言
之前在 aws 中创立了 eks,在数据存储这一块中,我抉择了应用 AWS 的 EFS 具体部署配置参考Amazon EKS 中 EFS 持久性存储。文章中的动静供应是 AWS 官网给的示例,应用的是root用户启动的容器。在我前面的测试中发现,我在应用非root用户启动容器的时候,发现应用动态供应是有权限并且没有报错的。然而在应用静载供应的时候呈现了 Operation not permitted
的报错。
问题形容
我依据efs dynamic_provisioning 创立了 dynamic provisioning
root用户的容器运行没有问题,然而非root用户容器运行时提醒 “Operation not permitted”
pod配置清单:
apiVersion: v1kind: Servicemetadata: name: wordpress-mysql labels: app: wordpressspec: ports: - port: 3306 selector: app: wordpress tier: mysql clusterIP: None---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-pv-claim labels: app: wordpressspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi---apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata: name: wordpress-mysql labels: app: wordpressspec: selector: matchLabels: app: wordpress tier: mysql strategy: type: Recreate template: metadata: labels: app: wordpress tier: mysql spec: containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim
StorageClass配置清单:
kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: efs-scprovisioner: efs.csi.aws.comparameters: provisioningMode: efs-ap fileSystemId: fs-xxxxx directoryPerms: "700" gidRangeStart: "1000" # optional gidRangeEnd: "2000" # optional basePath: "/dynamic_provisioning" # optional
剖析和查看
该报错是因为采纳了dynamic provisioning
PV
部署形式,这种模式的实现须要利用 efs-ap:access point拜访点
模式做 EFS
挂载。从 EFS
的角度来讲,EFS
的 access point
模式挂载的 EFS
卷,客户端不可批改 uid/gid
,只领有使用权(读写)详情点击查看。从本人的pod环境也能够看到,客户端挂载目录/dynamic_provisioning
的uid跟gid都是一个随机数字。 ls -l /dynamic_provisioning
能够看到是 `1018 (不同环境uid会不同)。
EFS-AP模式指的是access point拜访点模式。对于拜访点的介绍:
EFS Access Points:
An access point applies an operating system user, group, and file system path to any file system request made using the access point. The access point's operating system user and group override any identity information provided by the NFS client.
简略来讲,EFS-AP也就是access point拜访点挂载模式下,efs客户端的门路user/gid是不可被批改的。的客户端用户只有使用权(读写),然而不能够批改owner。因而遇到的报错是该配置的预期体现。
EFS-AP模式的配置是在storageclass中定义的:provisioningMode: efs-ap,比方:
kind: StorageClassapiVersion: storage.k8s.io/v1 metadata: name: efs-sc-dynamicprovisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap <<<<<<<<<<<<<<------------------------------EFS拜访点挂载模式 fileSystemId: fs-xxxxxx directoryPerms: "700" gidRangeStart: "1000" # optional gidRangeEnd: "2000" # optional basePath: "/dynamic_provisioning" # optional
目前AWS EFS的 dynamic provisioning
模式的实现就是应用 storageclass
的 efs-sc-dynamic
模式。
这种模式的弊病曾经在 github
中有issue在跟踪,详情点击查看,然而因为该模式也有肯定的设计意义 详情点击查看,所以目前还没有明确的论断。
长期解决办法
应用动态模式创立
能够创立EKS pv/pvc时应用static模式部署PV,不会应用access point模式挂载EFS卷,那么能够顺利批改uid/gid。
详情参考Amazon EKS 中 EFS 持久性存储
在pod中指定 uid 和 gid
在创立pod之前,先创立 pvc在创立完pvc后查看uid 和gid
[root@ip-10-0-100-206 ~]# ls -l /efs/dynamic_provisioning/total 12drwxr-xr-x 5 1015 1015 6144 Jan 20 02:44 pvc-40b922c7-8d4d-47d9-8783-60d25abe123drwxr-xr-x 5 1017 1017 6144 Jan 20 04:22 pvc-4ee000a8-7ab2-4ffc-8fd3-72ef31b7123drwx------ 5 1014 1014 6144 Jan 20 01:08 pvc-f6622cb3-7c24-4172-a427-d4b9a996122
将输入内容的pvc的uid gid 记下并在pod的yaml清单中指定uid曾经gid让pod领有该目录的权限。
pod配置清单:
apiVersion: v1kind: Servicemetadata: name: wordpress-mysql labels: app: wordpressspec: ports: - port: 3306 selector: app: wordpress tier: mysql clusterIP: None---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-pv-claim labels: app: wordpressspec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi---apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata: name: wordpress-mysql labels: app: wordpressspec: selector: matchLabels: app: wordpress tier: mysql strategy: type: Recreate template: metadata: labels: app: wordpress tier: mysql spec: securityContext: fsGroup: 1014 runAsUser: 1014 runAsGroup: 1014 containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim
查看
kubectl get pv|grep mysql pvc-f6622cb3-7c24-4172-a427-d4b9a9962cd8 5Gi RWX Delete Bound default/mysql-pv-claim efs-sc 5d23hkubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmysql-pv-claim Bound pvc-f6622cb3-7c24-4172-a427-d4b9a9962cd8 5Gi RWX efs-sc 5d23hkubectl get podNAME READY STATUS RESTARTS AGEwordpress-mysql-6f6455f449-52zrp 1/1 Running 0 5d7h
作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220125450139/
相干话题:https://www.cnsre.cn/tags/eks/