挂载云盘
云盘是阿里云提供的数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点,您可以通过FlexVolume在自建的Kubernetes集群使用阿里云云盘作为Volume。挂载云盘时,支持静态数据卷和动态数据卷,本文为您介绍如何使用PVC方式,挂载云盘到ECI Pod上。
前提条件
自建Kubernetes集群中已部署VNode。
如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。
注意事项
挂载云盘时,请注意以下事项:
云盘为非共享存储,一个云盘只能挂载到一个Pod。
云盘只能挂载到相同可用区的VNode节点下的ECI Pod,不支持跨可用区挂载。
静态挂载云盘
创建云盘。
创建PV。
参考参数说明表修改以下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保持一致。执行以下命令创建PV。
kubectl create -f static-pv-disk.yaml
创建PVC。
将以下内容保存为static-pvc-disk.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: static-pvc-disk spec: accessModes: - ReadWriteOnce storageClassName: disk resources: requests: storage: 20Gi
执行以下命令创建PVC。
kubectl create -f static-pvc-disk.yaml
将云盘挂载到ECI Pod。
将以下内容保存为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
执行以下命令创建Pod。
kubectl create -f static-test-disk.yaml
查看结果。
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
。
动态挂载云盘
部署Disk-Controller组件
采用动态挂载的方式挂载云盘时,需要先部署阿里云Disk-Controller组件,该组件用于自动创建云盘以及对应的PV。
创建用于部署Disk-Controller的YAML文件。
将以下内容保存为disk-controller.yaml。
special.keyid
和special.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: {}
部署组件。
kubectl create -f disk-controller.yaml
查看部署结果。
kubectl -n kube-system get pods
预期返回如下:
NAME READY STATUS RESTARTS AGE alicloud-disk-controller-677b59c5cd-r5dqc 1/1 Running 0 29m
挂载云盘
创建StorageClass。
参考参数说明表修改以下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方式以免误删数据。
创建StorageClass。
kubectl create -f sc-disk.yaml
创建PVC。
将以下内容保存为pvc-disk.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-disk spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: alicloud-disk-essd-beijing-k
执行以下命令创建PVC。
kubectl create -f pvc-disk.yaml
此时,系统将根据StorageClass的配置自动创建云盘,以及对应的PV。
将云盘挂载到ECI Pod。
将以下内容保存为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
执行以下命令创建Statueful。
kubectl create -f test-disk.yaml
查看结果。
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
。