使用云盘存储卷, 往往在服务初始化的时候申请了一个适当容量的云盘, 但是随着数据的增长, 数据盘的容量不能满足需求, 需要扩容.
传统应用的扩容场景中, 往往是先手动停掉应用, 再对数据盘进行备份, 然后执行扩容操作, 最后重新启动应用.
Kubernetes 本身是一个自动化调度, 编排系统, 实现了对数据卷的生命周期管理. 在 K8S 1.14 中, CSI 数据卷扩容属于 Alpha 阶段, 需要开启 Feature Gates 才可以使用;
本文描述在 CSI 环境中如何进行云盘的动态扩容:
使用说明:
1. 数据备份:
切记: 做数据卷扩容前, 先对云盘打快照备份, 以防扩容过程异常导致数据出现问题;
2. 集群依赖:
对云盘扩容操作需要调用云盘扩容相应 API, 所以需要集群具有此 API 的调用权限, 可以参考集群权限文档为集群添加此权限; 参考详细步骤.
3. 数据卷限制:
只有动态存储卷才可以进行数据卷动态扩容, 即配置了 StorageClassName 的 PV;
不支持 InlineVolume 类型 (非 PV,PVC 方式) 云盘数据卷扩容;
普通云盘类型不支持动态扩容, 请参考使用手动扩容云盘方案;
3. 对 StorageClass 的要求:
PVC 配置的 StorageClass 为阿里云云盘类型, provisioner 为 diskplugin.csi.alibabacloud.com;
StorageClass 需要配置: AllowVolumeExpansion: True,ACK 集群默认为 True;
依赖准备
申请 ACK 集群 (大于等于 1.14 版本) 阿里云 Kubernetes 集群(申请集群时选择 CSI 存储插件);
1. 配置 Feature Gate(针对 K8S1.14 集群):
由于在 K8S 1.14 中, resize 还是 Alpha 的 Feature, 需要增加如下配置:
更新 kube-controller-manager 添加 Feature Gate:
/etc/kubernetes/manifests/kube-controller-manager.YAML
更新 kubelet(如果节点较多, 可以写脚本实现):
- /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- systemctl daemon-reload
- service kubelet restart
- feature gates:--feature-gates=ExpandCSIVolumes=true
2. 集群添加扩容权限:
给云盘扩容需要为集群的 "Worker RAM 角色" 添加 ResizeDisk 权限:
专有集群:
在集群 --> 管理 --> 集群资源 点击 "Master RAM 角色"; 编辑 Ram 权限, 添加 ResizeDisk 如下图:
托管集群:
在集群 --> 管理 --> 集群资源 点击 "Worker RAM 角色"; 编辑 Ram 权限, 添加 ResizeDisk 如下图:
3. resizer 插件部署(针对 K8S1.14 集群):
参考以下模板:
- kind: Service
- apiVersion: v1
- metadata:
- name: csi-resizer
- namespace: kube-system
- labels:
- App: csi-resizer
- spec:
- selector:
- App: csi-resizer
- ports:
- - name: dummy
- port: 12345
- ---
- kind: StatefulSet
- apiVersion: apps/v1
- metadata:
- name: csi-resizer
- namespace: kube-system
- spec:
- serviceName: "csi-resizer"
- selector:
- matchLabels:
- App: csi-resizer
- template:
- metadata:
- labels:
- App: csi-resizer
- spec:
- tolerations:
- - operator: "Exists"
- affinity:
- nodeAffinity:
- preferredDuringSchedulingIgnoredDuringExecution:
- - weight: 1
- preference:
- matchExpressions:
- - key: node-role.kubernetes.io/master
- operator: Exists
- priorityClassName: system-node-critical
- serviceAccount: admin
- hostNetwork: true
- containers:
- - name: csi-resizer
- image: registry.cn-hangzhou.aliyuncs.com/acs/csi-resizer:v0.3.0
- args:
- - "--v=5"
- - "--csi-address=$(ADDRESS)"
- - "--leader-election"
- env:
- - name: ADDRESS
- value: /socketDir/csi.sock
- imagePullPolicy: "Always"
- volumeMounts:
- - name: socket-dir
- mountPath: /socketDir/
- - name: csi-diskplugin
- securityContext:
- privileged: true
- capabilities:
- add: ["SYS_ADMIN"]
- allowPrivilegeEscalation: true
- image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.14.8.32-c77e277b-aliyun
- imagePullPolicy: "Always"
- args:
- - "--endpoint=$(CSI_ENDPOINT)"
- - "--v=5"
- - "--driver=diskplugin.csi.alibabacloud.com"
- env:
- - name: CSI_ENDPOINT
- value: unix://socketDir/csi.sock
- volumeMounts:
- - mountPath: /var/log/
- name: host-log
- - mountPath: /socketDir/
- name: socket-dir
- - name: etc
- mountPath: /host/etc
- volumes:
- - name: socket-dir
- emptyDir: {}
- - name: host-log
- hostPath:
- path: /var/log/
- - name: etc
- hostPath:
- path: /etc
- updateStrategy:
- type: RollingUpdate
云盘卷扩容:
1. 创建应用
创建 nginx 应用, 并给 Pod 挂载一个 20G 的云盘数据卷, PVC,Deploy 的模板如下:
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: pvc-disk
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
- storageClassName: alicloud-disk-ssd
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: dynamic-create
- 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: disk-pvc
- mountPath: "/data"
- volumes:
- - name: disk-pvc
- persistentVolumeClaim:
- claimName: pvc-disk
当前应用状态如下:
Pod 挂载的云盘大小为 20G;
- # kubectl get pod
- NAME READY STATUS RESTARTS AGE
- dynamic-create-857bd875b5-n82d4 1/1 Running 0 107s
- # kubectl exec -ti dynamic-create-857bd875b5-n82d4 df | grep data
- /dev/vdb 20511312 45080 20449848 1% /data
pvc,pv 的大小都显示为 20G;
- # kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
- pvc-disk Bound d-wz9g8sl8dl1ks8hz2m82 20Gi RWO alicloud-disk-ssd 2m17s
- # kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- d-wz9g8sl8dl1ks8hz2m82 20Gi RWO Delete Bound default/pvc-disk alicloud-disk-ssd 2m15s
2. 云盘卷扩容:
扩容云盘执行下面命令:
# kubectl patch pvc pvc-disk -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
更新 pvc 大小, 会驱动 Resizer 调用云盘 API 进行扩容, 控制台可以检查云盘已经变成了 30G, 且 pv 的 size 也更新到 30G;
- # kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
- pvc-disk Bound d-wz9g8sl8dl1ks8hz2m82 20Gi RWO alicloud-disk-ssd 13m
- # kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- d-wz9g8sl8dl1ks8hz2m82 30Gi RWO Delete Bound default/pvc-disk alicloud-disk-ssd 13m
此时只完成了云盘的扩容, 文件系统的扩容没有做, 所以容器内的存储空间依然是 20G;
- # kubectl exec -ti dynamic-create-857bd875b5-n82d4 df /data
- Filesystem 1K-blocks Used Available Use% Mounted on
- /dev/vdb 20511312 45080 20449848 1% /data
通过删除 Pod 触发文件系统扩容:
- # kubectl delete pod dynamic-create-857bd875b5-n82d4
- pod "dynamic-create-857bd875b5-n82d4" deleted
- # kubectl get pod
- NAME READY STATUS RESTARTS AGE
- dynamic-create-857bd875b5-4gng9 1/1 Running 0 38s
可见文件系统已经扩容到 30G:
- # kubectl exec -ti dynamic-create-857bd875b5-4gng9 df /data
- Filesystem 1K-blocks Used Available Use% Mounted on
- /dev/vdb 30832548 45036 30771128 1% /data
以上步骤即完成了一个 CSI 环境下云盘扩容的步骤:
来源: https://yq.aliyun.com/articles/744611