天天看點

阿裡雲Kubernetes CSI實踐—NAS動态存儲卷使用

1. 前言

NAS存儲盤能将nfs(網絡檔案系統)挂載到你的Pod中,阿裡雲Kubernetes CSI支援

靜态存儲卷挂載

動态存儲卷挂載

2種方式, 在

靜态存儲卷挂載

的方式中,通常需要手動編輯和建立一個pv/pvc進行挂載,當需要的pv/pvc數量很大的時候,手動建立就顯得非常繁瑣了,這時

動态存儲卷挂載

的功能可以滿足您的需求。本文示範如何使用NAS動态存儲卷。

2. 部署csi-nas-plugin

檢視ACK叢集中是否已部署

csi-nasprovisioner

:

$ kubectl -nkube-system get sts csi-provisioner -oyaml|grep csi-nasprovisioner
        name: csi-nasprovisioner           

如何你的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檔案系統和挂載點。

檔案系統:

阿裡雲Kubernetes CSI實踐—NAS動态存儲卷使用

挂載點:

阿裡雲Kubernetes CSI實踐—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.yaml

nginx-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

注意: 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 RAM Policy設定和授予

filesystem

類型的NAS存儲卷設計NAS檔案系統和挂載點的動态建立與删除, 需要授予

csi-nasprovisioner

相應的權限,RAM Policy的最小集合如下:

{
    "Action": [
        "nas:DescribeMountTargets",
        "nas:CreateMountTarget",
        "nas:DeleteFileSystem",
        "nas:DeleteMountTarget",
        "nas:CreateFileSystem"
    ],
    "Resource": [
        "*"
    ],
        "Effect": "Allow"
}           

2種方式授權:

  1. 編輯ACK叢集的Master RAM角色中的自定義政策内容,添加以上nas相關的權限設定
    阿裡雲Kubernetes CSI實踐—NAS動态存儲卷使用
  2. 建立子賬号授權以上RAM Policy并生成AK,配置到StatefulSet csi-provisioner中csi-nasprovisioner的env變量中:
env:
    - name: CSI_ENDPOINT
        value: unix://socketDir/csi.sock
    - name: ACCESS_KEY_ID
        value: ""
    - name: ACCESS_KEY_SECRET
        value: ""           

3.2.3 建立StorageClass

storageclass.yaml

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           

alicloud-nas-subpath

$ kubectl create -f storageclass.yaml           

3.2.4 建立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           
$ kubectl create -f pvc.yaml -f nginx.yaml           

在這種場景下, csi會在pvc建立時動态建立NAS檔案系統和挂載點, pvc删除時動态删除挂載點和檔案系統。

4. 其他

更多示例請參考:

kubernetes-sigs/alibaba-cloud-csi-driver/examples/nas/dynamic

繼續閱讀