全部产品
Search
文档中心

弹性容器实例:挂载云盘(PVC)

更新时间:May 19, 2022

云盘是阿里云提供的数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点,您可以通过FlexVolume在自建的Kubernetes集群使用阿里云云盘作为Volume。挂载云盘时,支持静态数据卷和动态数据卷,本文为您介绍如何使用PVC方式,挂载云盘到ECI Pod上。

前提条件

  • 自建Kubernetes集群中已部署VNode。

  • 如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。

注意事项

挂载云盘时,请注意以下事项:

  • 云盘为非共享存储,一个云盘只能挂载到一个Pod。

  • 云盘只能挂载到相同可用区的VNode节点下的ECI Pod,不支持跨可用区挂载。

静态挂载云盘

  1. 创建云盘。

    1. 登录ECS管理控制台

    2. 在VNode对应的地域和可用区下,创建一个按量付费的云盘。

      关于如何创建云盘,请参见创建云盘。创建完成后,请记录云盘ID。

      说明

      如果您使用之前已有的云盘,请确保该云盘所属的地域和可用区与VNode一致,且该云盘未进行分区格式化。

  2. 创建PV。

    1. 参考参数说明表修改以下YAML内容,并保存为static-pv-disk.yaml。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: d-2zehdahrwoa7srga****
        labels:
          failure-domain.beta.kubernetes.io/zone: cn-beijing-k
          failure-domain.beta.kubernetes.io/region: cn-beijing
      spec:
        capacity:
          storage: 20Gi
        storageClassName: disk
        accessModes:
          - ReadWriteOnce
        flexVolume:
          driver: "alicloud/disk"
          fsType: "ext4"
          options:
            volumeId: "d-2zehdahrwoa7srga****"

      相关参数说明如下表所示:

      参数

      描述

      driver

      驱动类型。此处配置为alicloud/disk,表示使用阿里云云盘FlexVolume插件。

      fstype

      云盘的文件系统类型。

      volumeId

      云盘ID。

      说明

      PV的名称(name)必须和云盘ID保持一致。

    2. 执行以下命令创建PV。

      kubectl create -f static-pv-disk.yaml
  3. 创建PVC。

    1. 将以下内容保存为static-pvc-disk.yaml。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: static-pvc-disk
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: disk
        resources:
          requests:
            storage: 20Gi
    2. 执行以下命令创建PVC。

      kubectl create -f static-pvc-disk.yaml
  4. 将云盘挂载到ECI Pod。

    1. 将以下内容保存为static-test-disk.yaml。

      apiVersion: v1
      kind: Pod
      metadata:
        name: static-test-disk
        labels:
          alibabacloud.com/eci: "true"
      spec:
        nodeSelector:
          k8s.aliyun.com/vnode: "true"
        tolerations:
        - key: k8s.aliyun.com/vnode
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
        containers:
        - name: nginx
          image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
          ports:
          - containerPort: 80
            name: web
          volumeMounts:
          - name: pvc-disk
            mountPath: /data
        volumes:
          - name: pvc-disk
            persistentVolumeClaim:
              claimName: static-pvc-disk
    2. 执行以下命令创建Pod。

      kubectl create -f static-test-disk.yaml
    3. 查看结果。

      kubectl get pods -o wide

      预期返回:

      NAME                 READY   STATUS    RESTARTS   AGE    IP             NODE                                  NOMINATED NODE   READINESS GATES
      static-test-disk     1/1     Running   0          116s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成云盘对应的挂载目录/data

      静态云盘flex

动态挂载云盘

部署Disk-Controller组件

采用动态挂载的方式挂载云盘时,需要先部署阿里云Disk-Controller组件,该组件用于自动创建云盘以及对应的PV。

  1. 创建用于部署Disk-Controller的YAML文件。

    将以下内容保存为disk-controller.yaml。

    • special.keyidspecial.keysecret请替换为自身阿里云账号的AccessKey ID和AccessKey Secret,获取方式请参见获取AccessKey

    • ECS_ENDPOINT请替换为实际的接入地址,获取方式请参见接入地址

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: alicloud-disk-essd
    provisioner: alicloud/disk
    parameters:
      type: cloud_essd
    ---
    kind: StorageClass
    apiVersion: storage.k8s.io/v1beta1
    metadata:
      name: alicloud-disk-efficiency
    provisioner: alicloud/disk
    parameters:
      type: cloud_efficiency
    ---
    kind: StorageClass
    apiVersion: storage.k8s.io/v1beta1
    metadata:
      name: alicloud-disk-ssd
    provisioner: alicloud/disk
    parameters:
      type: cloud_ssd
    ---
    kind: StorageClass
    apiVersion: storage.k8s.io/v1beta1
    metadata:
      name: alicloud-disk-available
    provisioner: alicloud/disk
    parameters:
      type: available
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: alicloud-disk-controller-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["list", "watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update"]
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: alicloud-disk-controller
      namespace: kube-system
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: run-alicloud-disk-controller
    subjects:
      - kind: ServiceAccount
        name: alicloud-disk-controller
        namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: alicloud-disk-controller-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-config
      namespace: kube-system
    data:
      special.keyid: "*****************"
      special.keysecret: "***************************"
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: alicloud-disk-controller
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          app: alicloud-disk-controller
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: alicloud-disk-controller
        spec:
          serviceAccount: alicloud-disk-controller
          containers:
            - name: alicloud-disk-controller
              image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-disk-controller:v1.16.9.55-c43698d4-aliyun
              env:
              - name: ECS_ENDPOINT
                value: "https://ecs.aliyuncs.com" 
              - name: ACCESS_KEY_ID
                valueFrom:
                  configMapKeyRef:
                    name: cloud-config
                    key: special.keyid
              - name: ACCESS_KEY_SECRET
                valueFrom:
                  configMapKeyRef:
                    name: cloud-config
                    key: special.keysecret
              volumeMounts:
                - name: cloud-config
                  mountPath: /etc/kubernetes/
                - name: logdir
                  mountPath: /var/log/alicloud/
          volumes:
            - name: cloud-config
              emptyDir: {}
            - name: logdir
              emptyDir: {}
  2. 部署组件。

    kubectl create -f disk-controller,yaml
  3. 查看部署结果。

    kubectl -n kube-system get pods

    预期返回如下:

    NAME                                        READY   STATUS    RESTARTS   AGE
    alicloud-disk-controller-677b59c5cd-r5dqc   1/1     Running   0          29m

挂载云盘

  1. 创建StorageClass。

    1. 参考参数说明表修改以下YAML内容,并保存为sc-disk.yaml。

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: alicloud-disk-essd-beijing-k
      provisioner: alicloud/disk
      parameters:
        type: cloud_essd
        regionId: cn-beijing
        zoneId: cn-beijing-k
      reclaimPolicy: Delete

      相关参数说明如下表所示:

      参数

      描述

      provisioner

      驱动类型。此处配置为alicloud/disk,表示使用阿里云云盘FlexVolume插件。

      type

      云盘类型。取值:

      • cloud_essd:ESSD云盘。

      • cloud_ssd:SSD云盘。

      • cloud_efficiency:高效云盘。

      • available:优先创建SSD云盘,若可用区内SSD云盘没有资源,则创建高效云盘。

      说明

      除available外,支持任意组合其它三种参数,例如:type: cloud_efficiency, cloud_ssd, cloud_essd,此时将依次尝试创建指定类型的云盘,直到创建成功。

      regionId、zoneId

      云盘所属的地域和可用区,需与VNode相同。

      reclaimPolicy

      云盘的回收策略,默认为Delete,支持Retain。

      • Delete:删除PVC时,PV和云盘会一起删除。

      • Retain:删除PVC时,PV和云盘不会被删除,需要您手动删除。

      如果数据安全性要求高,推荐使用Retain方式以免误删数据。

    2. 创建StorageClass。

      kubectl create -f sc-disk.yaml
  2. 创建PVC。

    1. 将以下内容保存为pvc-disk.yaml。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-disk
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 20Gi
        storageClassName: alicloud-disk-essd-beijing-k
    2. 执行以下命令创建PVC。

      kubectl create -f pvc-disk.yaml

      此时,系统将根据StorageClass的配置自动创建云盘,以及对应的PV。

  3. 将云盘挂载到ECI Pod。

    1. 将以下内容保存为test-disk.yaml。

      说明

      建议使用StatefulSet来挂载云盘,不建议使用Deployment。Deployment是无状态服务,重启Pod时,无法保证新Pod启动时间和旧Pod结束时间之间的时间叠加,且Deployment多副本模式不能为每个Pod配置独立的Volume。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: test-disk
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        template:
          metadata:
            labels:
              app: nginx
          spec:
            nodeSelector:    
              k8s.aliyun.com/vnode: "true"
            tolerations:     
            - key: k8s.aliyun.com/vnode
              operator: "Equal"
              value: "true"
              effect: "NoSchedule"
            containers:
            - name: nginx
              image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
              ports:
              - containerPort: 80
                name: web
              volumeMounts:
              - name: pvc-disk
                mountPath: /data
            volumes:
              - name: pvc-disk
                persistentVolumeClaim:
                  claimName: pvc-disk
    2. 执行以下命令创建Statueful。

      kubectl create -f test-disk.yaml
    3. 查看结果。

      kubectl get pods -o wide

      预期返回:

      NAME          READY   STATUS    RESTARTS   AGE     IP              NODE                                  NOMINATED NODE   READINESS GATES
      test-disk-0   1/1     Running   0          3m29s   172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成云盘对应的挂载目录/data

      fv动态云盘