阿里云Kubernetes-CSI实践NAS动态存储卷使用

4次阅读

共计 4598 个字符,预计需要花费 12 分钟才能阅读完成。

1. 前言

NAS 存储盘能将 nfs(网络文件系统)挂载到你的 Pod 中,阿里云 Kubernetes CSI 支持 静态存储卷挂载 动态存储卷挂载 2 种方式,在 静态存储卷挂载 的方式中,通常需要手动编辑和创建一个 pv/pvc 进行挂载,当需要的 pv/pvc 数量很大的时候,手动创建就显得非常繁琐了,这时 动态存储卷挂载 的功能可以满足您的需求。本文演示如何使用 NAS 动态存储卷。

2. 部署 csi-nas-plugin

如何你的 Kubernetes 集群中还没有部署,请参考以下步骤进行部署:

2.1 部署csi-provisioner

$ kubectl create -f https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/nas/nas-provisioner.yaml

2.2 部署csi-nasplugin

$ kubectl create -f https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/nas/nas-plugin.yaml

2.3 检查运行状态

$ kubectl -nkube-system get po -o wide |grep csi
csi-nasplugin-7mbmx                                2/2     Running   0
csi-nasplugin-89t9v                                2/2     Running   0
csi-nasplugin-8fw5p                                2/2     Running   0
csi-nasplugin-grbqn                                2/2     Running   0
csi-nasplugin-ks8mw                                2/2     Running   0
csi-nasplugin-pp5g7                                2/2     Running   0
csi-provisioner-0                                  2/2     Running   0

3. 使用 NAS 动态存储卷

目前阿里云 Kubernetes CSI 支持 2 种类型的 NAS 动态存储卷挂载:subpath方式和 filesystem 方式。

3.1 subpath类型的 NAS 动态存储卷使用

3.1.1 使用场景

当你的多个 Kubernetes 应用或者 Pod 需要挂载相同的 NAS 存储卷共享数据时,或不同的 Pod 挂载相同 NAS 文件系统的不同子目录时,可以使用 subpath 类型的 NAS 动态存储卷方式。

3.1.2 创建 NAS 文件系统和挂载点

subpath的方式要求用户首先使用 NAS 控制台 或 SDK/API 创建好 NAS 文件系统和挂载点。
文件系统:

挂载点:

3.1.3 创建 StoragClass

编辑 storageclass.yaml 文件, 详细参数说明见:https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/nas-dynamic.md

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 alicloud-nas-subpath

$ kubectl create -f storageclass.yaml

3.1.4 创建 PV/PVC 和 Pod 挂载 NAS 存储卷

创建 Pod nginx-1 nginx-2共享 NAS 存储卷的同一个子目录,pvc.yaml nginx-1.yamlnginx-2.yaml 文件内容如下:
pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nas-csi-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: alicloud-nas-subpath
  resources:
    requests:
      storage: 20Gi

nginx-1.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nas-1
  labels:
    app: nginx-1
spec:
  selector:
    matchLabels:
      app: nginx-1
  template:
    metadata:
      labels:
        app: nginx-1
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nas-pvc
            mountPath: "/data"
      volumes:
        - name: nas-pvc
          persistentVolumeClaim:
            claimName: nas-csi-pvc

nginx-2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nas-2
  labels:
    app: nginx-2
spec:
  selector:
    matchLabels:
      app: nginx-2
  template:
    metadata:
      labels:
        app: nginx-2
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nas-pvc
            mountPath: "/data"
      volumes:
        - name: nas-pvc
          persistentVolumeClaim:
            claimName: nas-csi-pvc

创建 pvc 和 deployment:

$ kubectl create -f pvc.yaml -f nginx-1.yaml -f nginx-2.yaml

$ kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
deployment-nas-1-5b5cdb85f6-nhklx   1/1     Running   0          32s
deployment-nas-2-c5bb4746c-4jw5l    1/1     Running   0          32s

在这种情况下,NAS 存储卷的 xxxxxxx.cn-hangzhou.nas.aliyuncs.com:/share/nas-79438493-f3e0-11e9-bbe5-00163e09c2be 会同时挂载到deployment-nas-1-5b5cdb85f6-nhklx 和 deployment-nas-2-c5bb4746c-4jw5l 的 /data 目录下。注意: "/share" 为 StorageClass 中指定的 subpath,"nas-79438493-f3e0-11e9-bbe5-00163e09c2be" 为 pv 的 name

如果你需要为不同的 Pod 挂载同一个 NAS 文件系统的不同子目录,则需要分别创建 pvc- 1 和 nginx- 1 以及 pvc- 2 和 nginx-2。

3.2 filesystem类型的 NAS 动态存储卷使用

注意: filesystem 类型的 NAS 动态卷在删除时默认保留文件系统和挂载点,若需要在释放 pv 资源的同时释放 NAS 文件系统和挂载点,则需要同时设置 StorageClass 中的 reclaimPolicy 为 Delete 且 deleteVolume 的值为 "true"

3.2.1 使用场景

3.1 中的 subpath 方式中,你需要首先手动创建 NAS 文件系统和挂载点。当你的 Kubernetes 应用需要动态创建和删除 NAS 文件系统和挂载点时,可以使用filesystem 类型。注意:使用 filesystem 类型 NAS 存储卷的 Pod 只能创建一个文件系统和一个挂载点,多个 Pod 之间无法共享一个存储卷

3.2.2 创建 StorageClass

编辑 storageclass.yaml 文件, 详细参数说明见:https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/nas-dynamic.md

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas-fs
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
  volumeAs: filesystem
  vpcId: "vpc-xxxxxxxxxxxx"
  vSwitchId: "vsw-xxxxxxxxx"
  deleteVolume: "false"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain

运行以下命令创建 StorageClass alicloud-nas-subpath

$ kubectl create -f storageclass.yaml

3.2.3 创建 PV/PVC 和 Pod 挂载 NAS 存储卷

pvc.yaml nginx.yaml文件内容如下:
pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nas-csi-pvc-fs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: alicloud-nas-fs
  resources:
    requests:
      storage: 20Gi

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nas-fs
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nas-pvc
            mountPath: "/data"
      volumes:
        - name: nas-pvc
          persistentVolumeClaim:
            claimName: nas-csi-pvc-fs

创建 pvc 和 deployment:

$ kubectl create -f pvc.yaml -f nginx.yaml

在这种场景下,csi 会在 pvc 创建时动态新建 NAS 文件系统和挂载点,pvc 删除时动态删除挂载点和文件系统。

4. 其他

更多示例请参考:kubernetes-sigs/alibaba-cloud-csi-driver/examples/nas/dynamic


本文作者:流生

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

正文完
 0