使用阿里云CSI插件实现云盘数据卷动态扩容

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

使用云盘存储卷,往往在服务初始化的时候申请了一个适当容量的云盘,但是随着数据的增长,数据盘的容量不能满足需求,需要扩容。

传统应用的扩容场景中,往往是先手动停掉应用,再对数据盘进行备份,然后执行扩容操作,最后重新启动应用。

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如下图:

image

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环境下云盘扩容的步骤:

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
15天前
|
虚拟化 iOS开发 开发者
Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)
本教程介绍在Mac上安装VMware 11.1.0的完整步骤,适用于OS X 10.8-10.10系统。包括版本兼容性确认、安装包下载、拖拽安装方法及首次运行时的“无法验证开发者”问题解决。若系统为macOS 11及以上,建议使用更新版本的VMware Fusion。安装后可正常创建和运行虚拟机。
|
机器学习/深度学习 虚拟化 数据中心
NVIDIA T4和A10:不同应用场景下的GPU加速器选择
在数据中心和云计算领域,GPU加速器扮演着至关重要的角色。NVIDIA T4和A10是两款适用于不同应用场景的GPU加速器。本文将比较它们的性能和适用场景,帮助读者更好地选择适合自己需求的GPU实例。
6682 0
|
项目管理
技术方案怎样写
该文档介绍了编写技术方案的要点和方法。首先强调了技术方案需明确相关方、关键指标、目标受众及预期收益。接着,提到撰写方案时应避免逻辑不清晰、表达复杂和阅读难度高等问题,追求合作共赢、系统规划和显著收益。方案写作框架包括问题、方案、优势和收益。还需深入分析需求,设定SMART目标,关注度量指标如北极星指标,确保方案设计的专业性,合理规划执行路径并做好项目管理,以实现目标并确保团队协作。
449 0
|
4月前
|
人工智能 弹性计算 JSON
再不玩通义VACE模型你就过时了!一个模型搞定所有视频任务
阿里巴巴开源通义万相Wan2.1-VACE,业界功能最全的视频生成与编辑模型,支持文生视频、图像参考生成、视频重绘、局部编辑、背景延展等,统一模型实现多任务自由组合,轻量版本消费级显卡即可运行。
|
6月前
|
canal 关系型数据库 MySQL
MySQL 自动同步开源工具
本文介绍了几种开源工具用于实现 MySQL 数据库的自动同步。
|
7月前
|
缓存 监控 Java
java动态代理
本文介绍了Java中的动态代理及其优势,通过增强原有方法或拦截调用实现无侵入式代码扩展,如添加日志、缓存等。文章先讲解了静态代理的基本概念和实现方式,随后引出动态代理解决静态代理在多方法、多类场景下的局限性。通过JDK提供的InvocationHandler接口和Proxy类,展示了如何动态生成代理对象。最后,文章还探讨了代理Hook技术,包括寻找Hook点、选择代理方式以及替换原始对象的具体步骤。
218 0
|
缓存 网络协议 安全
QoS
QoS
628 5
|
Kubernetes 负载均衡 应用服务中间件
部署Kubernetes(k8s)多主的高可用集群
在CentOS7上安装Kubernetes多主节点的集群,并且安装calico网络插件和metallb。使用keepalived和haproxy进行负载均衡。最后部署应用
4692 0
|
存储 小程序 前端开发
如何设计小程序的站内信功能
如何设计小程序的站内信功能
724 0
|
人工智能 开发工具 Swift
ModelScope联手OpenDataLab:直接调用7000+开源数据集,赋能AI模型加速研发
魔搭社区和OpenDatalab浦数合作,共同开启一场模型与数据的深度融合,旨在为中国开发者打造更加高效、开放的AI体验。