在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
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
存储 Kubernetes 应用服务中间件
k8s 1.24.3版本使用nfs-provisioner4.0.0动态创建PV
k8s 1.24.3版本使用nfs-provisioner4.0.0动态创建PV
1391 0
|
7月前
|
消息中间件 Kubernetes NoSQL
有状态软件如何在 k8s 上快速扩容甚至自动扩容
有状态软件如何在 k8s 上快速扩容甚至自动扩容
|
2月前
|
Kubernetes Linux 测试技术
|
2月前
|
Kubernetes Linux 开发工具
centos7通过kubeadm安装k8s 1.27.1版本
centos7通过kubeadm安装k8s 1.27.1版本
|
3月前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
110 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
3月前
|
存储 Kubernetes Ubuntu
Ubuntu 22.04LTS版本二进制部署K8S 1.30+版本
这篇文章详细介绍了在Ubuntu 22.04 LTS系统上使用VMware Fusion虚拟化软件部署Kubernetes 1.30+版本的完整过程,包括环境准备、安装containerd、配置etcd、生成证书、部署高可用组件、启动Kubernetes核心组件以及网络插件的部署和故障排查。
161 4
|
4月前
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
4月前
|
存储 Kubernetes API
在K8S中,如何扩容和缩容K8s集群?
在K8S中,如何扩容和缩容K8s集群?
|
4月前
|
Kubernetes 监控 Perl
在k8S中,自动扩容机制是什么?
在k8S中,自动扩容机制是什么?
|
4月前
|
Kubernetes Java 开发工具
Kubernetes部署项目流程(新手上线新版本服务整个流程)
【8月更文挑战第1天】Kubernetes(k8s)新手上线新版本服务整个流程

相关产品

  • 容器服务Kubernetes版