前言
最近在学习k8s,并且使用了阿里云ACK的K8S集群,学到存储卷时,发现阿里云有三种解决方案:1、云盘,2、NAS,3、OSS,下面就来讲解下云盘和NAS在K8S中使用方法,后面有时间再出个OSS教程。
准备
- 阿里云ACK k8s集群
k8s存储卷概述
存储卷相关技术,官方文档
存储卷PVC:PersistentVolumeClaim
存储卷声明PV:PersistentVolume
存储卷类SC:StorageClass
这里有篇博客写得非常好,大家有时间可以看看它们之间的区别,本文不是讲解这些概念而是使用它们
使用方式
什么是静态创建存储卷?
所谓静态就是通过yaml文件先创建PV,然后创建PVC,再通过创建的Deployment或者StatefulSet去指定PVC。
什么是动态创建存储卷?
所谓动态就是通过创建SC,然后创建PVC并且指定了SC,系统就会自动创建PV,因此实际生产中更多的使用动态创建。
下面我们也是着重讲解如何动态创建存储卷。
阿里云支持的存储卷
1、云盘
如果想要创建动态存储卷必须先要创建StorageClass,下面是阿里云盘提供的以下几种StorageClass:
alicloud-disk-efficiency:高效云盘。
alicloud-disk-ssd:SSD云盘。
alicloud-disk-essd:ESSD云盘。
alicloud-disk-available:提供高可用选项,优先创建SSD云盘;如果SSD云盘售尽,则创建高效云盘
alicloud-disk-topology: 使用延迟绑定的方式创建云盘
存储大小限制:
最低20Gi
2、NAS
因为NAS跟云盘还不一样,要到阿里云控制台手动开通服务,开通之后才能使用,还有NAS没有自带SC,要自己通过yaml文件创建。
支持协议:
通用型:NFSv3(Linux)/NFSv4(Linux)/SMB2.1+(Windows)
极速型:NFSv3(Linux)
文件存储 CPFS:POSIX/MPI-IO(Linux)
阿里云Kubernetes CSI支持2种类型的NAS动态存储卷挂载:subpath方式和filesystem方式
subpath类型的NAS动态存储卷
当您的多个Kubernetes应用或者Pod需要挂载相同的NAS存储卷共享数据时,或不同的Pod挂载相同NAS文件系统的不同子目录时, 可以使用subpath类型的NAS动态存储卷方式。
filesystem类型的NAS动态存储卷
当您的Kubernetes应用需要动态创建和删除NAS文件系统和挂载点时, 可以使用filesystem类型。
下面就来讲解使用filesystem类型创建NAS存储卷。
存储大小限制:
- 无限制
3、OSS
略
创建NAS StorageClass
上面讲到NAS没有自带的SC需要手动通过yaml文件来创建,所以现在我们来创建一下,根据官方文档来创建
1、创建subpath类型的StorageClass
alicloud-nas-subpath.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-nas-subpath
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: subpath
server: "xxxxxxx.cn-hangzhou.nas.aliyuncs.com:/k8s/"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
执行以下命令创建StorageClass。
kubectl create -f alicloud-nas-subpath.yaml
2、创建filesystem类型的StorageClass
alicloud-nas-fs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-nas-fs
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: filesystem
zoneId: "cn-hangzhou-g"
vpcId: "vpc-xxxxxxxxxxxx"
vSwitchId: "vsw-xxxxxxxxx"
deleteVolume: "false"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
执行以下命令创建StorageClass。
kubectl create -f alicloud-nas-fs.yaml
注意:如果不填写zoneId区域id,会报错
创建云盘存储卷
创建NAS存储卷
问题
1、Zone not exist 或者 InvaildZone.NotExist
通过命令查看pod报错
kubectl logs -n kube-system csi-provisioner-56f5c9d65d-2b82t -c external-nas-provisioner
kubectl logs deployment.apps/csi-provisioner -n kube-system
错误信息:
RequestId: E83FFC19-9A19-45E4-BC49-BC96810F4C3D
Message: Zone not exist
Warning ProvisioningFailed 10m nasplugin.csi.alibabacloud.com_awbeci-nexus_b88f4540-2802-409e-b178-9f7a37e99191 failed to provision volume with StorageClass "alicloud-nas-fs": rpc error: code = Internal desc = SDK.ServerError
ErrorCode: InvaildZone.NotExist
Recommend: https://error-center.aliyun.com/status/search?Keyword=InvaildZone.NotExist&source=PopGw
原因:创建NAS StorageClass的时候没有指定zoneId
解决:查看你的NAS所在区域对应的ZoneId
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-nas-fs
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: filesystem
# 指定zoneId
zoneId: "cn-hangzhou-g"
vpcId: "vpc-xxx"
vSwitchId: "vsw-xxx"
deleteVolume: "false"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
总结
1、k8s可以使用云盘和NAS存储卷,但是云盘最低要20Gi,所以平时开发或者测试可以使用NAS存储卷
2、使用NAS要开通阿里云服务
3、动态创建存储卷更符合日常工作
引用
持久卷
Kubernetes对象中的PersistentVolume、PersistentVolumeClaim和StorageClass的概念关系
阿里云查询可用的地域
阿里云盘存储卷概述
阿里云NAS存储卷概述