美文网首页
eks使用efs dynamic provisioning 创建

eks使用efs dynamic provisioning 创建

作者: SRE运维博客 | 来源:发表于2022-02-09 08:57 被阅读0次

    作者: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: v1
    kind: Service
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      ports:
        - port: 3306
      selector:
        app: wordpress
        tier: mysql
      clusterIP: None
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
      labels:
        app: wordpress
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      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: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: efs-sc
    provisioner: efs.csi.aws.com
    parameters:
      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 的角度来讲,EFSaccess 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: StorageClass
    apiVersion: storage.k8s.io/v1 
    metadata:
      name: efs-sc-dynamic
    provisioner: 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 模式的实现就是使用 storageclassefs-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 12
    drwxr-xr-x 5 1015 1015 6144 Jan 20 02:44 pvc-40b922c7-8d4d-47d9-8783-60d25abe123
    drwxr-xr-x 5 1017 1017 6144 Jan 20 04:22 pvc-4ee000a8-7ab2-4ffc-8fd3-72ef31b7123
    drwx------ 5 1014 1014 6144 Jan 20 01:08 pvc-f6622cb3-7c24-4172-a427-d4b9a996122
    

    将输出内容的pvc的uid gid 记下并在pod的yaml清单中指定uid已经gid让pod拥有该目录的权限。
    pod配置清单:

    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      ports:
        - port: 3306
      selector:
        app: wordpress
        tier: mysql
      clusterIP: None
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
      labels:
        app: wordpress
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      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      5d23h
    
    kubectl get  pvc
    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mysql-pv-claim   Bound    pvc-f6622cb3-7c24-4172-a427-d4b9a9962cd8   5Gi        RWX            efs-sc         5d23h
    
    kubectl get  pod
    NAME                               READY   STATUS    RESTARTS   AGE
    wordpress-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/


    相关文章

      网友评论

          本文标题:eks使用efs dynamic provisioning 创建

          本文链接:https://www.haomeiwen.com/subject/fccwkrtx.html