文档

使用CNFS托管NAS文件系统

更新时间:

为了提升NAS文件系统的性能,容器服务 Edge 版使用CNFS(Container Network File System)托管NAS文件系统,对文件系统层独立管理。本文介绍ACK Edge集群如何使用CNFS托管NAS文件系统。

前提条件

  • 已创建ACK Edge集群,具体操作,请参见创建ACK Edge集群

  • 边缘节点的Linux镜像类型为:CentOS镜像、Alinux2镜像、Alinux3镜像。

  • 将csi-plugin部署到边缘节点时,会拉取存储相关的RPM安装包,要求边缘节点带宽要大于50Mbit/s。

步骤一:为ACK Edge集群添加ENS实例

您需要按照如下步骤为目标ACK Edge集群添加ENS实例,文中以北京地域的ACK Edge集群为例:

  1. 登录ENS控制台

  2. 在左侧导航栏中,选择算力与镜像 > 实例,然后单击创建实例完成如下边缘实例的创建。

    文中创建如下3个ENS实例,运营商采用北京移动和北京联通,便于后续将ENS实例(云端节点)加入到目标ACK Edge集群中。边缘节点

  3. 在目标ACK Edge集群中创建边缘节点池。

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏,单击集群

    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

    4. 在集群管理页左侧导航栏,选择节点管理 > 节点池

    5. 节点池页面,单击创建边缘节点池,本文以输入节点池名称为edge-svg-nodepool为例,选择云边协同网络基础型,然后单击提交

  4. 为目标ACK Edge集群添加ENS实例。

    1. 节点池页面,单击刚创建好的目标节点池右侧操作列下的更多,然后单击添加已有节点

    2. 进入添加节点页面,选择自动添加,在已有ENS实例的列表中,选择2中创建好的3个ENS实例,然后单击下一步

    3. 确认实例信息无误后,单击下一步

    4. 在弹出的对话框中,单击确定,进入添加完成页面。

    5. 单击去集群列表查看,您可以在集群列表中看到ENS实例已添加到目标ACK Edge集群中。

      说明

      ENS实例成功加入集群需要大概3分钟。

  5. 在集群管理页左侧导航栏中,选择节点管理 > 节点进入节点管理页面,查看目标ACK Edge集群的边缘节点和云端节点的角色/状态列是否正常。

步骤二:配置边缘节点的挂载权限

您需要在csi-plugin中为RAM用户添加对应的AccessKey和AccessSecret,首先创建RAM用户并为其添加访问相关云资源的权限, 然后在目标容器集群中设置AccessKey用来访问云服务,权限配置完成后才能在边缘节点执行挂载操作。 具体配置步骤如下:

  1. 创建RAM用户。具体操作,请参见创建RAM用户

  2. 创建访问CSI组件的自定义权限策略,策略内容如下。具体操作,请参见创建自定义权限策略

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "nas:DescribeFileSystems",
                    "nas:DescribeMountTargets",
                    "nas:AddTags",
                    "nas:DescribeTags",
                    "nas:RemoveTags",
                    "nas:CreateFileSystem",
                    "nas:DeleteFileSystem",
                    "nas:ModifyFileSystem",
                    "nas:CreateMountTarget",
                    "nas:DeleteMountTarget",
                    "nas:ModifyMountTarget",
                    "nas:TagResources",
                    "nas:SetDirQuota",
                    "nas:EnableRecycleBin",
                    "nas:GetRecycleBinAttribute",
                    "nas:DescribeDirQuotas"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
  3. 为RAM用户添加权限。具体操作,请参见为RAM用户授权

  4. 为RAM用户创建AccessKey。具体操作,请参见获取AccessKey

  5. 执行以下命令,创建cnfs-nas组件使用的Secret。

    使用AccessKey在目标ACK Edge集群中创建的名为alibaba-addon-secret的Secret资源。

    kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your AccessKey ID>' --from-literal='access-key-secret=<your AccessKey Secret>
    说明

    您需要将<your AccessKey ID><your AccessKey Secret>替换为您获取的AccessKey信息。

  6. 执行以下命令,在csi-plugin的Container的env中添加引用AccessKey和AccessSecret。

    kubectl edit ds/csi-plugin -nkube-system
    env:
    - name: KUBE_NODE_NAME
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: spec.nodeName
    - name: CSI_ENDPOINT
      value: unix://var/lib/kubelet/csi-plugins/driverplugin.csi.alibabacloud.com-replace/csi.sock
    - name: MAX_VOLUMES_PERNODE
      value: "15"
    - name: SERVICE_TYPE
      value: plugin
    - name: ACCESS_KEY_TYPE
      valueFrom:
        secretKeyRef:
          key: access-key-id
          name: alibaba-addon-secret
          optional: true
    - name: ACCESS_KEY_SECRET
      valueFrom:
        secretKeyRef:
          key: access-key-secret
          name: alibaba-addon-secret
          optional: true

步骤三:安装存储相关组件

您需要按照以下步骤为目标ACK Edge集群安装csi-plugin、csi-provisioner和storage-operator组件。

  1. 在集群管理页左侧导航栏中,选择运维管理 > 组件管理

  2. 组件管理页面,单击存储页签,分别找到csi-plugin、csi-provisioner和storage-operator,单击右下方的安装

步骤四:验证使用效果

  1. 执行以下内容,创建一个cnfs-nas文件,并使用NAS动态存储卷自动挂载到创建的cnfs-nas文件中,同时将NAS动态存储卷绑定到工作负载StatefulSet中。

    cat << EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-nas
    spec:
      description: "filesystem1"
      type: nas
      reclaimPolicy: Retain
      parameters:
        filesystemType: standard
        storageType: Capacity
        protocolType: NFS
        encryptType: "SSE-KMS"
        enableTrashCan: "true"
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-cnfs-nas
    mountOptions:
      - nolock,tcp,noresvport
      - vers=3
    parameters:
      volumeAs: subpath
      containerNetworkFileSystem: "cnfs-nas"
      archiveOnDelete: "false"
      path: "/"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-nas-sts
      labels:
        app: nginx
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            volumeMounts:
            - mountPath: "/data"
              name: www
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alibabacloud-cnfs-nas"
          resources:
            requests:
              storage: 50Gi
    EOF
  2. 查看CNFS托管的NAS在边缘节点是否挂载成功。

    1. 执行以下命令,查看Pod的状态。

      kubectl get pod -o wide

      预期输出:

      NAME             READY   STATUS    RESTARTS   AGE     IP           NODE                          NOMINATED NODE   READINESS GATES
      cnfs-nas-sts-0   1/1     Running   0          2m40s   10.3.6.131   i-5tctf6oz8ljctgufwwx6k****   <none>           <none>
      cnfs-nas-sts-1   1/1     Running   0          40s     10.3.6.132   i-5tctf6oz8ljctgufwwx6k****   <none>           <none>

      由输出可见,两个Pod已被调度到边缘节点上,已经是Running状态。

    2. 执行以下命令,在Pod中查看NAS的挂载点。

      kubectl exec cnfs-nas-sts-0 --  mount | grep nfs

      预期输出:

      14b924b6f7-tkj18.cn-beijing.nas.aliyuncs.com:/nas-298b9f76-e952-43a5-812a-9d191c92**** on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.255.59,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=192.168.255.59)

      输出显示有挂载点,说明边缘节点使用CNFS托管的NAS在Pod内部挂载成功。