您可以在Container Service Kubernetes 叢集中使用阿里雲 NAS 資料卷。
目前阿里雲 NAS 提供兩種 Kubernetes 掛載方式:
- 靜態儲存卷
其中,靜態儲存卷又支援下面兩種使用方式:
- 通過 flexvolume 外掛程式使用
- 通過 volume 方式使用
- 使用 PV/PV
- 通過 Kubernetes 的 NFS 驅動使用
- 通過 flexvolume 外掛程式使用
- 動態儲存裝置卷
前提條件
使用 NAS 資料卷之前,您需要先在 NAS 管理主控台上建立檔案系統,並在檔案系統中添加 Kubernetes 叢集的掛載點。建立的 NAS 檔案系統需要和您的叢集位於同一 VPC。
靜態儲存卷
您可以通過阿里雲提供的 flexvolume 外掛程式使用阿里雲 NAS 檔案儲存體服務或者通過 Kubernetes 的 NFS 驅動使用阿里雲 NAS 檔案儲存體服務。
通過 flexvolume 外掛程式使用
使用 flexvolume 外掛程式,您可以通過 volume 方式使用阿里雲 NAS 資料卷或者通過 PV/PVC 方式使用阿里雲 NAS 資料卷。
- NAS 為共用儲存,可以同時為多個 Pod 提供共用儲存服務。
- server:為 NAS 資料盤的掛載點。
- path:為串連 NAS 資料卷的掛載目錄,支援掛載 NAS 子目錄,且當子目錄不存在時,會自動建立子目錄並掛載。
- vers:定義 nfs 掛載協議的版本號碼,支援3.0 和 4.0。
- mode:定義掛載目錄的存取權限,注意掛載 NAS 盤根目錄時不能配置掛載許可權。當 NAS 盤中資料量很大時,配置 mode 會導致執行掛載非常慢,甚至掛載失敗。
通過 volume 方式使用
使用 nas-deploy.yaml
檔案建立 Pod。
apiVersion: v1
kind: Pod
metadata:
name: "flexvolume-nas-example"
spec:
containers:
- name: "nginx"
image: "nginx"
volumeMounts:
- name: "nas1"
mountPath: "/data"
volumes:
- name: "nas1"
flexVolume:
driver: "alicloud/nas"
options:
server: "0cd8b4a576-grs79.cn-hangzhou.nas.aliyuncs.com"
path: "/k8s"
vers: "4.0"
使用 PV/PVC
步驟 1 建立 PV
您可以使用 yaml 檔案或者通過阿里雲Container Service控制台介面建立 NAS 資料卷。
- 使用 yaml 檔案建立 PV
使用
nas-pv.yaml
檔案建立 PV。apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas spec: capacity: storage: 5Gi storageClassName: nas accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "0cd8b4a576-uih75.cn-hangzhou.nas.aliyuncs.com" path: "/k8s" vers: "4.0"
- 通過控制台介面建立 NAS 資料卷
- 登入Container Service管理主控台。
- 在 Kubernetes 菜單下,單擊左側導覽列中的 ,進入資料卷列表頁面。
- 選擇所需的叢集,單擊頁面右上方的建立。
- 在建立資料卷對話方塊中,配置資料卷的相關參數。
- 資料卷類型:本樣本中為NAS。
- 資料卷名:建立的資料卷的名稱。資料卷名在叢集內必須唯一。本例為 pv-nas。
- 資料卷總量:所建立資料卷的容量。注意不能超過磁碟容量。
- 訪問模式:預設為 ReadWriteMany。
- 掛載點網域名稱:叢集在 NAS 檔案系統中掛載點的掛載地址。
- 子目錄:NAS 路徑下的子目錄,以 / 開頭,設定後資料卷將掛載到指定的子目錄。
- 如果 NAS 根目錄下沒有此子目錄,會預設建立後再掛載。
- 您可以不填此項,預設掛載到 NAS 根目錄。
- 許可權:設定掛載目錄的存取權限,例如:755、644、777 等。
- 只有掛載到 NAS 子目錄時才能設定許可權,掛載到根目錄時不能設定。
- 您可以不填此項,預設許可權為 NAS 檔案原來的許可權。
- 標籤:為該資料卷添加標籤。
- 完成配置後,單擊建立。
步驟 2 建立 PVC
使用 nas-pvc.yaml 檔案建立 PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nas
spec:
accessModes:
- ReadWriteMany
storageClassName: nas
resources:
requests:
storage: 5Gi
步驟 3 建立 Pod
使用nas-pod.yaml檔案建立 pod。
apiVersion: v1
kind: Pod
metadata:
name: "flexvolume-nas-example"
spec:
containers:
- name: "nginx"
image: "nginx"
volumeMounts:
- name: pvc-nas
mountPath: "/data"
volumes:
- name: pvc-nas
persistentVolumeClaim:
claimName: pvc-nas
步驟 1 建立 NAS 檔案系統
登入 檔案儲存體管理主控台,建立一個 NAS 檔案系統。
假設您的掛載點為 055f84ad83-ixxxx.cn-hangzhou.nas.aliyuncs.com
。
步驟 2 建立 PV
您可以使用編排模板或者通過阿里雲Container Service控制台介面建立 NAS 資料卷。
- 使用編排模板
使用nas-pv.yaml檔案建立 PV。
執行以下命令建立一個類型為 NAS 的 PesistentVolume。
root@master # cat << EOF |kubectl apply -f - apiVersion: v1 kind: PersistentVolume metadata: name: nas spec: capacity: storage: 8Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: / server: 055f84ad83-ixxxx.cn-hangzhou.nas.aliyuncs.com EOF
- 通過控制台介面建立 NAS 資料卷
具體操作參見 使用PV/PVC 中關於通過控制台介面建立 NAS 資料卷的內容。
步驟 2 建立 PVC
建立一個 PersistentVolumeClaim 來請求綁定該 PersistentVolume。
root@master # cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nasclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 8Gi
EOF
步驟 3 建立 Pod
建立一個應用來申明掛載使用該資料卷。
root@master # cat << EOF |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: registry.aliyuncs.com/spacexnice/netdia:latest
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: nasclaim
EOF
至此,您就將 NAS 遠程檔案系統掛載到了您的 Pod 應用當中了。
動態儲存裝置卷
使用動態 NAS 儲存卷需要您手動安裝驅動外掛程式,並配置 NAS 掛載點。
安裝外掛程式
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-nas
provisioner: alicloud/nas
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: alicloud-nas-controller
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: run-alicloud-nas-controller
subjects:
- kind: ServiceAccount
name: alicloud-nas-controller
namespace: kube-system
roleRef:
kind: ClusterRole
name: alicloud-disk-controller-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: alicloud-nas-controller
namespace: kube-system
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: alicloud-nas-controller
spec:
tolerations:
- effect: NoSchedule
operator: Exists
key: node-role.kubernetes.io/master
- effect: NoSchedule
operator: Exists
key: node.cloudprovider.kubernetes.io/uninitialized
nodeSelector:
node-role.kubernetes.io/master: ""
serviceAccount: alicloud-nas-controller
containers:
- name: alicloud-nas-controller
image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.8.4
volumeMounts:
- mountPath: /persistentvolumes
name: nfs-client-root
env:
- name: PROVISIONER_NAME
value: alicloud/nas
- name: NFS_SERVER
value: 0cd8b4a576-mmi32.cn-hangzhou.nas.aliyuncs.com
- name: NFS_PATH
value: /
volumes:
- name: nfs-client-root
nfs:
server: 0cd8b4a576-mmi32.cn-hangzhou.nas.aliyuncs.com
path: /
使用動態儲存裝置卷
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-nas
resources:
requests:
storage: 2Gi
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
volumeMounts:
- mountPath: "/usr/share/nginx/html/"
name: html