暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

专家详解 | 如何为AKS集群使用共享磁盘

Microsoft云科技 2021-06-25
1945

跳舞着的流水啊,在你途中的流沙。要求你的歌声,你的流动呢。你肯夹跛足的泥沙而俱下么?她的热切的脸。——《飞鸟集》

跳舞着的流水啊,在你途中的流沙。要求你的歌声,你的流动呢。你肯夹跛足的泥沙而俱下么?她的热切的脸。——《飞鸟集》



KubernetesK8S)从v1.17版本开始支持CSIContainer Storage Interface,容器存储接口)存储驱动,并且按照K8S的路线图,从v1.21版开始将全面切换至CSI
目前,Azure上的K8S服务AKSAzure Kubernetes Service)已经开始对CSI提供预览支持,并增加了若干新功能。其中一个重要功能就是支持Azure Shared Disk,借此,我们可以在多个Pod甚至Node上共享一块磁盘。当然,为了避免存储脑裂,需要从应用进行磁盘锁、仲裁、读写控制等。这个功能大幅扩展了K8S的使用场景。

不过很多人可能会好奇:K8S本身就支持NFSSMBNAS模式,可以直接提供持久化卷的共享,为什么还要支持共享磁盘?原因在于,共享磁盘和NAS从读写操作原理是不一样的。磁盘提供块级(结构化)存储,用户可以自己控制文件系统;而NAS提供的文件级(非结构化)共享。很多场景,例如Oracle RAC只支持共享磁盘,而无法用NAS存放数据文件。

下文就通过实际操作演示如何在AKS中使用共享磁盘。

1.创建AKS集群


目前AKS对CSI的支持还处于预览阶段,所以需要用CLI命令行的方式启用并创建集群。

首先我们需要执行如下命令启用CSI:

    az feature register --namespace "Microsoft.ContainerService" --name "EnableAzureDiskFileCSIDriver"

    然后执行如下命令使改动生效:

      az provider register -n Microsoft.ContainerService

      随后需要安装支持CSICLI命令扩展:

        az extension add --name aks-preview
        az extension update --name aks-preview

        并通过下列命令创建资源组,然后创建启用CSI的集群:

          az group create -n aks-csi-rg -l westus2 -o table
          az aks create -g aks-csi-rg -n aks-csi-cluster --network-plugin azure -k 1.18.14 --generate-ssh-keys --aks-custom-headers EnableAzureDiskFileCSIDriver=true -o table

          注意:参数- k 1.18.14指定了K8S的版本,该版本必须大于1.17;参数aks-custom-headers EnableAzureDiskFileCSIDriver=true指定了启用CSI驱动。

          为了方便管理,随后我们可以在VS Code里添加此集群:

          随后检查StorageClass,可以看到已经具备CSI驱动:

            kubectl get sc

            2.创建共享磁盘


            随后我们需要创建共享磁盘。首先创建共享磁盘的StorageClass,为此需要创建一个名为shared-disk-class.yaml的文件,内容如下:

              apiVersion: storage.k8s.io/v1
              kind: StorageClass
              metadata:
              name: shared-disk
              provisioner: disk.csi.azure.com
              parameters:
              skuname: Premium_LRS
              maxShares: "2"
              cachingMode: None
              reclaimPolicy: Delete

              这个文件指定了如下内容:

              • StorageClass的名称:shared-disk,创建此类型数据卷时要指明此名称;

              • 对应的Azure磁盘类型:Premium_LRS,目前共享磁盘只支持Premium diskUltra disk

              • 最大可以共享主机数量:2

              • 不使用缓存,共享磁盘不允许使用读缓存;

              • 回收模式为删除。

              通过如下命令应用此配置:

                kubectl apply -f shared-disk-class.yaml

                随后再次检查StorageClass,可以看到新建的类型:

                接下来创建一个名为shared-disk-pvc.yaml的文件,内容如下:

                  kind: PersistentVolumeClaim
                  apiVersion: v1
                  metadata:
                  name: shared-disk-pvc
                  spec:
                  accessModes:
                  - ReadWriteMany
                  resources:
                  requests:
                  storage: 256Gi
                  volumeMode: Block
                  storageClassName: shared-disk

                  这个文件指定了如下内容:

                  • PVC的名称:shared-disk-pvc

                  • 套用的StorageClassshared-disk

                  • 访问方式:ReadWriteMany,允许多个主机访问,但不能超过StorageClass里定义的maxShares

                  • 卷类型:Block,这是固定配置;

                  • 容量:256GiB,低于此容量的磁盘不允许共享(具体可查询共享磁盘的容量和主机数量关系)。

                  应用此文件:

                    kubectl apply -f shared-disk-pvc.yaml

                    随后展开集群的存储资源,可以看到新建的PVC,以及据此PVC新建的PV:

                    同时在Azure门户的磁盘界面中,也可以看到新建的磁盘:

                    不过因为目前还没有容器使用该磁盘,所以磁盘的“Owner”是空白的。

                    3.使用共享磁盘


                    我们将创建一个部署,并部署两个副本的Pod,然后将新建卷挂载到Pod,以实现负载均衡。这两个Pod会自动分配到两个Node,这样可以验证是否可以共享磁盘。

                    该部署的配置文件shared-disk-deploy.yaml内容如下:

                      apiVersion: apps/v1
                      kind: Deployment
                      metadata:
                      labels:
                      app: nginx
                      name: deployment-azuredisk
                      spec:
                      replicas: 2
                      selector:
                      matchLabels:
                      app: nginx
                      template:
                      metadata:
                      labels:
                      app: nginx
                      name: deployment-azuredisk
                      spec:
                      containers:
                      - name: deployment-azuredisk
                      image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
                      volumeDevices:
                      - name: azuredisk
                      devicePath: /dev/sdx
                      volumes:
                      - name: azuredisk
                      persistentVolumeClaim:
                      claimName: shared-disk-pvc

                      这个文件指定了如下内容:

                      • 声明卷名称:azure-shared-disk,来源是名为shared-disk-pvcPVC

                      • Pod内部,将此卷映射到/dev/sdx

                      • Pod的副本数量为2

                      • 使用的镜像:mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine,这是一个专门镜像,具备HA机制,可以共享磁盘。

                      随后执行如下命令创建部署:

                        kubectl apply -f shared-disk-deploy.yaml

                        通过Azure门户检查磁盘,发现该磁盘已经被挂载到两台主机(Node):

                        总结


                        CSI驱动为K8S的卷管理提供了更多高级功能。不过除了共享磁盘外,AKS也可以原生支持Azure Premium File提供的NFS,预知如何实现,请听下回分解。

                        1

                        点击“在看”,分享Azure 云资讯

                        文章转载自Microsoft云科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论