前言

最近在学习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,因此实际生产中更多的使用动态创建。

image.png
下面我们也是着重讲解如何动态创建存储卷。

阿里云支持的存储卷

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,会报错

创建云盘存储卷

  1. 创建静态存储卷

    • 步骤一:创建PV
    • 步骤二:创建PVC
    • 步骤三:创建应用。
  2. 创建动态存储卷

    • 步骤一:创建StorageClass
    • 步骤二:创建PVC
    • 步骤三:创建应用

创建NAS存储卷

  1. 创建静态存储卷

    • 步骤一:创建PV
    • 步骤二:创建PVC
    • 步骤三:创建应用。
  2. 创建动态存储卷

    • 步骤一:创建StorageClass
    • 步骤二:创建PVC
    • 步骤三:创建应用

问题

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

image.png
原因:创建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存储卷概述


Awbeci
3.1k 声望213 粉丝

Awbeci