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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
1月前
|
关系型数据库 MySQL 数据挖掘
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
DTS 作为阿里云核心的数据交互引擎,以其高效的实时数据流处理能力和广泛的数据源兼容性,为用户构建了一个安全可靠、可扩展、高可用的数据架构桥梁。阿里云数据库 SelectDB 通过与 DTS 联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL / RDS MySQL / PolarDB for MySQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
|
1月前
|
API
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
|
1月前
|
SQL 人工智能 数据挖掘
阿里云DMS,身边的智能化数据分析助手
生成式AI颠覆了人机交互的传统范式,赋予每个人利用AI进行低门槛数据分析的能力。Data Fabric与生成式AI的强强联合,不仅能够实现敏捷数据交付,还有效降低了数据分析门槛,让人人都能数据分析成为可能!阿里云DMS作为阿里云统一的用数平台,在2021年初就开始探索使用Data Fabric理念构建逻辑数仓来加速企业数据价值的交付,2023年推出基于大模型构建的Data Copilot,降低用数门槛,近期我们将Notebook(分析窗口)、逻辑数仓(Data Fabric)、Data Copilot(生成式AI)进行有机组合,端到端的解决用数难题,给用户带来全新的分析体验。
110132 118
阿里云DMS,身边的智能化数据分析助手
|
1月前
|
存储 弹性计算 关系型数据库
阿里云服务器ESSD云盘性能等级PL0、PL1、PL2、PL3区别,云盘性能级别PL知识点参考
在我们选择阿里云服务器系统盘和数据盘时,如果是选择ESSD云盘,还需要选择云盘的云盘性能级别PL,PL性能级别有PL3、PL2、PL1、PL0四个性能级别的云盘规格,如果是通过阿里云的活动来购买云服务器的话,由于系统盘默认一般为20G或40G容量,可选的PL性能级别通常只有PL0(单盘IOPS性能上限1万)和PL1(单盘IOPS性能上限5万)可选择,有的用户肯能并不清楚ESSD云盘的性能等级之间有何区别,单盘IOPS性能指的是什么,本文为大家介绍一下ESSD云盘的云盘性能级别PL3、PL2、PL1、PL0相关知识点。
阿里云服务器ESSD云盘性能等级PL0、PL1、PL2、PL3区别,云盘性能级别PL知识点参考
|
9天前
|
API
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
|
1月前
|
存储 弹性计算 安全
阿里云活动内云服务器没有数据盘怎么办?购买后如何购买并挂载云盘?
在我们通过阿里云的活动来购买云服务器的时候,一般默认情况下只有系统盘,是没有数据盘的,但是很多用户处于实际使用需求和安全等方面的需求,通常都需要在购买之后单独再购买一块云盘作为数据盘挂载到云服务器上,本文以图文形式为大家展示阿里云活动内云服务器购买流程以及购买后如何购买并挂载云盘,适合新手用户参考。
阿里云活动内云服务器没有数据盘怎么办?购买后如何购买并挂载云盘?
|
1月前
|
人工智能 IDE API
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务
|
1月前
|
弹性计算 安全 容灾
【产品动态】阿里云弹性计算产品月刊-2024年2月
阿里云产品官网价格全线下调,ECS最多下降36%;容器服务 Kubernetes 版 v1.28开放升级;安全访问与管理ECS资源的最佳实践;超高性能第八代AMD实例低至68.66元/月、老用户限时续费优惠,续费享1年5折……更多前沿云产品动态,尽在弹性计算产品月刊。
|
1月前
|
SQL 监控 测试技术
阿里云可观测 2024 年 2 月产品动态
阿里云可观测 2024 年 2 月产品动态