
不过很多人可能会好奇:K8S本身就支持NFS或SMB的NAS模式,可以直接提供持久化卷的共享,为什么还要支持共享磁盘?原因在于,共享磁盘和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

随后需要安装支持CSI的CLI命令扩展:
az extension add --name aks-previewaz extension update --name aks-preview

并通过下列命令创建资源组,然后创建启用CSI的集群:
az group create -n aks-csi-rg -l westus2 -o tableaz 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/v1kind: StorageClassmetadata:name: shared-diskprovisioner: disk.csi.azure.comparameters:skuname: Premium_LRSmaxShares: "2"cachingMode: NonereclaimPolicy: Delete
这个文件指定了如下内容:
StorageClass的名称:shared-disk,创建此类型数据卷时要指明此名称;
对应的Azure磁盘类型:Premium_LRS,目前共享磁盘只支持Premium disk和Ultra disk;
最大可以共享主机数量:2;
不使用缓存,共享磁盘不允许使用读缓存;
回收模式为删除。
通过如下命令应用此配置:
kubectl apply -f shared-disk-class.yaml

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

接下来创建一个名为shared-disk-pvc.yaml的文件,内容如下:
kind: PersistentVolumeClaimapiVersion: v1metadata:name: shared-disk-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 256GivolumeMode: BlockstorageClassName: shared-disk
这个文件指定了如下内容:
PVC的名称:shared-disk-pvc;
套用的StorageClass:shared-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/v1kind: Deploymentmetadata:labels:app: nginxname: deployment-azurediskspec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxname: deployment-azurediskspec:containers:- name: deployment-azurediskimage: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpinevolumeDevices:- name: azurediskdevicePath: /dev/sdxvolumes:- name: azurediskpersistentVolumeClaim:claimName: shared-disk-pvc
这个文件指定了如下内容:
声明卷名称:azure-shared-disk,来源是名为shared-disk-pvc的PVC;
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 云资讯





