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
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
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動态存儲卷使用
subpath
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.mdapiVersion: 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
注意: 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種方式授權:
- 編輯ACK叢集的Master RAM角色中的自定義政策内容,添加以上nas相關的權限設定
阿裡雲Kubernetes CSI實踐—NAS動态存儲卷使用 - 建立子賬号授權以上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