您可以在Container Service Kubernetes 叢集中使用阿里雲 NAS 資料卷。

目前阿里雲 NAS 提供兩種 Kubernetes 掛載方式:

  • 靜態儲存卷
    其中,靜態儲存卷又支援下面兩種使用方式:
    • 通過 flexvolume 外掛程式使用
      • 通過 volume 方式使用
      • 使用 PV/PV
    • 通過 Kubernetes 的 NFS 驅動使用
  • 動態儲存裝置卷

前提條件

使用 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 資料卷
    1. 登入Container Service管理主控台
    2. 在 Kubernetes 菜單下,單擊左側導覽列中的叢集 > 儲存,進入資料卷列表頁面。
    3. 選擇所需的叢集,單擊頁面右上方的建立


    4. 在建立資料卷對話方塊中,配置資料卷的相關參數。
      • 資料卷類型:本樣本中為NAS。
      • 資料卷名:建立的資料卷的名稱。資料卷名在叢集內必須唯一。本例為 pv-nas。
      • 資料卷總量:所建立資料卷的容量。注意不能超過磁碟容量。
      • 訪問模式:預設為 ReadWriteMany。
      • 掛載點網域名稱:叢集在 NAS 檔案系統中掛載點的掛載地址。
      • 子目錄:NAS 路徑下的子目錄,以 / 開頭,設定後資料卷將掛載到指定的子目錄。
        • 如果 NAS 根目錄下沒有此子目錄,會預設建立後再掛載。
        • 您可以不填此項,預設掛載到 NAS 根目錄。
      • 許可權:設定掛載目錄的存取權限,例如:755、644、777 等。
        • 只有掛載到 NAS 子目錄時才能設定許可權,掛載到根目錄時不能設定。
        • 您可以不填此項,預設許可權為 NAS 檔案原來的許可權。
      • 標籤:為該資料卷添加標籤。


    5. 完成配置後,單擊建立

步驟 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
通過 Kubernetes 的 NFS 驅動使用

步驟 1 建立 NAS 檔案系統

登入 檔案儲存體管理主控台,建立一個 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