在ACK 1.16版本中实现云盘在线扩容

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

在 K8S 1.16中,云盘数据卷在线扩容已经进入Beta阶段,功能会默认开启;本文描述了在CSI/Flexvolume环境中如何进行云盘的动态扩容步骤:

使用说明:

1. 数据备份:

切记:做数据卷扩容前,先对云盘打快照备份,以防扩容过程异常导致数据出现问题;

2. 适用范围:

只有动态存储卷才可以进行数据卷动态扩容,即:配置了StorageClassName的PV才可以;

不支持InlineVolume类型(非PV、PVC方式)云盘数据卷扩容;

普通云盘类型不支持动态扩容,请参考使用手动扩容云盘方案;

StorageClass需要配置为:AllowVolumeExpansion: True,ACK集群默认为 True;

3. 集群添加扩容权限:

给云盘扩容需要为集群的”RAM 角色“添加ResizeDisk权限:

专有集群(CSI插件):

在集群 --> 管理 --> 集群资源 点击”Master RAM 角色“;编辑Ram权限,添加ResizeDisk如下图:

专有集群(Flexvolume插件)、托管集群:

在集群 --> 管理 --> 集群资源 点击”Worker RAM 角色“;编辑Ram权限,添加ResizeDisk如下图:

image

4. 插件升级到最新版本:

升级您使用Flexvolume或者CSI Plugin到最新版本;

云盘数据卷卷扩容:

云盘数据卷扩容包括 ”云盘扩容“ 和 ”文件系统扩容“ 两部分,云盘和文件系统都支持应用在线扩容(设备mount到目录状态下扩容),但是从文件系统扩容最佳实践角度,最稳定的扩容方案是:先停止应用层服务,umount挂载目录,再进行数据卷扩容。

基于稳定性需求,提供以下两种扩容的方式:

pod不重启实现数据卷扩容:在负载高IO情况下,有小概率造成文件系统问题;

Pod重启时实现数据卷扩容:应用停止后,扩容更安全;

K8S 从1.16 开始默认实现了为Pod不重启即可以实现数据卷扩容。

1.容器不重启:

假设应用当前状态如下:

# kubectl get pod
web-0         1/1     Running   0          42s

# kubectl exec web-0 df /data
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/vdb        20511312 45080  20449848   1% /data

# kubectl get pvc
NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   20Gi       RWO            alicloud-disk-available   57s

# kubectl get pv
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                    STORAGECLASS              REASON   AGE
d-wz9hpoifm43yn9zie6gl   20Gi       RWO            Delete           Bound      default/disk-ssd-web-0   alicloud-disk-available            65s

在符合 ”使用说明“ 的各个条件下,可以通过下面命令进行数据卷扩容(也可以在控制台编辑pvc的size):

# kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'

等待一定时间(一般一分钟以内)后扩容完成,检查状态如下:

# kubectl get pv d-wz9hpoifm43yn9zie6gl
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS              REASON   AGE
d-wz9hpoifm43yn9zie6gl   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            5m23s

# kubectl get pvc
NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   30Gi       RWO            alicloud-disk-available   5m10s

# kubectl exec web-0 df /data
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/vdb        30832548 45036  30771128   1% /data

综上:只需要执行一条命令既可以完成所有扩容操作。

2.容器重启时扩容:

假设应用当前状态如下:

# kubectl get pod
web-0         1/1     Running   0          42s

# kubectl exec web-0 df /data
/dev/vdb        20511312 45080  20449848   1% /data

# kubectl get pvc
disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   20Gi       RWO            alicloud-disk-available   7m4s

# kubectl get pv d-wz9g2j5qbo37r2lamkg4
d-wz9g2j5qbo37r2lamkg4   20Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            7m18s

1)对于Flexvolume插件挂载的云盘:

查看pv的调度信息:

# kubectl get pv d-wz9g2j5qbo37r2lamkg4  -oyaml | grep failure-domain.beta.kubernetes.io/zone
    failure-domain.beta.kubernetes.io/zone: cn-shenzhen-e

修改调度信息label,在zone后面添加字段,促使这个pv关联的pod不可调度(例如:把原来的cn-shenzhen-e 改为 cn-shenzhen-e-nozone):

# kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e-nozone --overwrite
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled

重启Pod,由于修改了调度信息,pod会暂时pending:

# kubectl delete pod web-0

# kubectl get pod
web-0   0/1     Pending   0          27s

执行数据卷扩容命令:

# kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'

将pv的调度信息label改回去,促使pod启动完成(把 cn-shenzhen-e-nozone 改为起初的 cn-shenzhen-e):

# kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e --overwrite
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled

这时整个扩容步骤结束,可以等待一定时间(一般1分钟内)后检查扩容是否符合预期;

# kubectl get pod
web-0   1/1     Running   0          3m23s

# kubectl get pvc
disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            alicloud-disk-available   17m

# kubectl get pv d-wz9g2j5qbo37r2lamkg4
d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            17m

# kubectl exec web-0 df /data
/dev/vdb        30832548 45036  30771128   1% /data

2)CSI插件挂载的云盘:

向pv中添加调度labels,其value值为一个不存在对应zone的随意字符串,命令如下:

# kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-nozone
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled

重启Pod,由于修改了调度信息,pod会暂时pending:

# kubectl delete pod web-0
# kubectl get pod
web-0   0/1     Pending   0          27s

执行数据卷扩容命令:

# kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'

将pv的调度信息label删除,促织pod启动完成:

# kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone-
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled

这时整个扩容步骤结束,可以等待一定时间(一般1分钟内)后检查扩容是否符合预期;

# kubectl get pod
web-0   1/1     Running   0          3m23s

# kubectl get pvc
disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            alicloud-disk-available   17m

# kubectl get pv d-wz9g2j5qbo37r2lamkg4
d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            17m

# kubectl exec web-0 df /data
/dev/vdb        30832548 45036  30771128   1% /data
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
消息中间件 存储 Kubernetes
k8s1.20版本部署RabbitMQ集群(持久化)——2023.05
k8s1.20版本部署RabbitMQ集群(持久化)——2023.05
254 1
|
21天前
|
Kubernetes Ubuntu 应用服务中间件
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
91 0
|
5月前
|
Kubernetes 容器
k8s与kubesphere版本对应关系
k8s与kubesphere版本对应关系
112 0
|
6月前
|
存储 Kubernetes 安全
kubernetes集群降级|k8s1.24+版本降级到1.23
kubernetes集群降级|k8s1.24+版本降级到1.23
|
3月前
|
Kubernetes Shell Docker
K8s集群v1.26.1版本的简单部署实践
K8s集群v1.26.1版本的简单部署实践
117 0
|
8月前
|
Kubernetes 安全 Linux
k8s--使用 kubeadm 搭建 k8s 1.25.2 版本
k8s--使用 kubeadm 搭建 k8s 1.25.2 版本
|
4月前
|
Kubernetes 安全 Ubuntu
Kubernetes学习笔记-Part.02 Docker版本
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
56 0
|
4月前
|
Kubernetes Cloud Native 网络协议
云原生|kubernetes|kubernetes-1.18 二进制安装教程单master(其它的版本也基本一样)(下)
云原生|kubernetes|kubernetes-1.18 二进制安装教程单master(其它的版本也基本一样)
35 0
|
4月前
|
Kubernetes Cloud Native Linux
云原生|kubernetes|kubernetes-1.18 二进制安装教程单master(其它的版本也基本一样)(上)
云原生|kubernetes|kubernetes-1.18 二进制安装教程单master(其它的版本也基本一样)
37 0
|
4月前
|
存储 Kubernetes 对象存储
Kubernetes版本对接对象存储几种方案
Kubernetes版本对接对象存储几种方案
174 0

相关产品

  • 容器服务Kubernetes版