在前面我们已经学习到了 Pod 的扩容、滚动更新等知识,我们可以手动为 Deployment 等设置 Pod 副本的数量,而这里会继续学习 关于 Pod 扩容、收缩 的规则,让 Pod 根据节点服务器的资源自动增加或减少 Pod 数量。

本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:

https://k8s.whuanle.cn【适合国内访问】

https://ek8s.whuanle.cn 【gitbook】

缩放 Deployment

设置副本数量

很简单,使用 kubectl scale 命令直接设置:

kubectl scale deployment nginx --replicas=10

其它方式前面的章节已经提到过了,还有通过修改 YAML 文件的方式。

水平自动缩放

K8S 有个 Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。

除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。

参考资料:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/

命令:

kubectl autoscale deployment nginx --min=10 --max=15 --cpu-percent=80

表示目标 CPU 使用率为 80%(期望指标),副本数量配置应该为 10 到 15 之间,CPU 是动态缩放 pod 的指标,会根据具体的 CPU 使用率计算副本数量,其计算公式如下。

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

因为笔者这里只有一个 Worker 节点,不能控制 CPU 使用率模拟场景,所以不方便演示,读者只需要了解这个命令即可。

按照算法计算,加入当前副本数量为 12,且 CPU 使用率达到 90%,则期望副本数为 12*(90%/80%) = 13.5,那么理论上会部署 14 个 Pod,但是 CPU 再继续增加的话,最多 15 个副本数量。如果在机器管够的情况下,可以去掉 min 和 max 参数。

算法细节请查看:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details

比例缩放

比例缩放指的是在上线 Deployment 时,临时运行着应用程序的多个版本(共存),比例缩放是控制上线时多个 Pod 服务可用数量的方式。

水平缩放只关心最终的期望 Pod 数量,直接修改副本数和水平缩放,决定最终 Pod 数量有多少个。

而比例缩放是控制对象上线过程中,新的 Pod 创建速度和 旧的 Pod 销毁速度、 Pod 的可用程度,跟上线过程中新旧版本的 Pod 替换数量有关。

查看上一章中创建的 Deployment 的部分 YAML 如下:

spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate

strategy 可以配置 Pod 是怎么更新的。

当我们设置.spec.strategy.type==RollingUpdate时,便会采取滚动更新的方式更新 Pods,此时可以指定 maxUnavailable 和 maxSurge 来控制滚动更新 过程。这个我们之前提到过,就是 Deployment 默认会保证一直有 75% 的 pod处于可用状态,在完成更新前可能有多个版本的 pod 共存。

  • maxUnavailable

    最大不可用数量或比例,旧的 Pod 会以这个数量或比例逐渐减少。

  • maxSurge

    最大峰值,新的 Pod 会按照这个数量或比例逐渐创建。

3.5 章已经使用到了这两者,这里就不细说了,读者请参考:https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/#max-unavailable

我们查看之前的 Deployment,执行命令 kubectl get deployment nginx -o yaml

... ...
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
... ...

配置表示,每次只有 1/4 的 Pod 被更新、替换。

这个是所有 Deployment 的默认配置,在更新镜像版本时,旧的 Pod 会被新的 Pod 替换,但是不是一下子完成的,每次处理 25% 的 Pod,在更新过程中,我们必须保证我们的服务依然可用,即还有旧版本的 Pod 在运行。这个配置设定了更新过程中至少保证 75% 的 Pod 还可以使用,这个就是比例缩放。

下面我们来进行实验。

首先创建新的 Deployment ,设置副本数量为 10:

kubectl create deployment nginx --image=nginx:1.19.0 --replicas=10
# kubectl scale deployment nginx --replicas=10

我们执行 kubectl edit deployment nginx 修改缩放个数:

  strategy:
rollingUpdate:
maxSurge: 3
maxUnavailable: 2
type: RollingUpdate

除了可用百分比表示,也可以使用个数表示。

旧的 Pod 按照最大 2 个的速度不断减少;新的 Pod 按照最大 3 个的速度不断增加;

比例缩放的配置处理好了,它会在我们上线新版本的时候生效,我们可以观察到这个过程,但是需要快一点执行命令查看状态。

快速执行以下命令:

kubectl set image deployment nginx nginx=nginx:1.20.0
kubectl get replicaset
root@instance-1:~# kubectl set image deployment nginx nginx=nginx:1.20.0
deployment.apps/nginx image updated
root@instance-1:~# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-7b87485749 5 5 0 93m
nginx-85b45874d9 0 0 0 93m
nginx-bb957bbb5 8 8 8 35m

因为允许新的 Pod 创建较快(3个),所以最终可能新的 Pod 数量达到 10 个了,旧的 Pod 还有很多,总数量大于 10。

最终:

NAME               DESIRED   CURRENT   READY   AGE
nginx-7b87485749 10 10 10 99m
nginx-85b45874d9 0 0 0 99m
nginx-bb957bbb5 0 0 0 41m

如果想新版本的 Pod 上线速度更快,则可以把 maxSurge 数量或比例设置大一些;为了保证上线过程稳定、服务可用程度高,可以把 maxUnavailable 设置小一些。

Kubernetes:应用自动扩容、收缩与稳定更新的更多相关文章

  1. Kubernetes 笔记 012 Pod 的自动扩容与缩容

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  2. Kubectl Rollout 回滚及Autoscale自动扩容

    Kubectl Rollout 回滚及Autoscale自动扩容 Kubernetes 中采用ReplicaSet(简称RS)来管理Pod.如果当前集群中的Pod实例数少于目标值,RS 会拉起新的Po ...

  3. kubectl rollout回滚和autoscale自动扩容

    系列目录 kubernetes 滚动升级 Kubernetes 中采用ReplicaSet(简称RS)来管理Pod.如果当前集群中的Pod实例数少于目标值,RS 会拉起新的Pod,反之,则根据策略删除 ...

  4. 【LVM】LVM自动扩容脚本

    概要说明: /dev/mapper/vg0-data挂载在目录/data下: 当新增物理磁盘时,需要自动对/dev/mapper/vg0-data磁盘时进行扩容(自动化脚本): 当新增物理磁盘时,自动 ...

  5. openstack 制作大于2TB根分区自动扩容的CENTOS镜像

    制作镜像的时候默认分的是30G空间 qemu-img create -f raw centos.img 30G 看官网文档安装完系统需要安装cloud-init和clout-utils包,本人安装了完 ...

  6. ArrayList源码解析(二)自动扩容机制与add操作

    本篇主要分析ArrayList的自动扩容机制,add和remove的相关方法. 作为一个list,add和remove操作自然是必须的. 前面说过,ArrayList底层是使用Object数组实现的. ...

  7. C#深入研究ArrayList动态数组自动扩容原理

    1 void Test1() { ArrayList arrayList = new ArrayList(); ; ; i < length; i++) { arrayList.Add(&quo ...

  8. Kubernetes集群中Service的滚动更新

    Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...

  9. 【数组】- ArrayList自动扩容机制

    不同的JDK版本的扩容机制可能有差异 实验环境:JDK1.8 扩容机制: 当向ArrayList中添加元素的时候,ArrayList如果要满足新元素的存储超过ArrayList存储新元素前的存储能力, ...

随机推荐

  1. 『学了就忘』Linux基础 — 7、补充:安装Linxu系统时设置硬盘挂载说明

    目录 (1)新建一个/home分区 (2)再创建一个/boot分区. (3)创建一个swap分区 (4)最后剩余的空间全部分给根目录 (5)总结 上一篇在VMwar虚拟机中安装Linux操作系统中ht ...

  2. 【代码更新】单细胞分析实录(20): 将多个样本的CNV定位到染色体臂,并画热图

    之前写过三篇和CNV相关的帖子,如果你做肿瘤单细胞转录组,大概率看过: 单细胞分析实录(11): inferCNV的基本用法 单细胞分析实录(12): 如何推断肿瘤细胞 单细胞分析实录(13): in ...

  3. Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和

    题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...

  4. cf Make It Nondeterministic (简单贪心)

    有N个人.每个人都有两个名字. 给出这N个人的一个排列.p[1]...p[N]. 现在让每个人挑自己丙个名字中的一个名字.问是否存在一种方案,使得挑出来的N个名字按字典序排完以后正好是p[1]...p ...

  5. hdu 5055 Bob and math problem (很简单贪心)

    给N个数字(0-9),让你组成一个数. 要求:1.这个数是奇数 2.这个数没有前导0 问这个数最大是多少. 思路&解法: N个数字从大到小排序,将最小的奇数与最后一位交换,把剩下前N-1位从大 ...

  6. 【java+selenium3】JavaScript的调用执行 (十)

    JavaScript的调用 在web自动化操作页面的时候,有些特殊的情况selenium的api无法完成,需要通过执行一段js来实现的DOM操作: //执行方式 JavascriptExecutor ...

  7. Typecho 反序列化漏洞 分析及复现

    0x00 漏洞简介 CVE-2018-18753 漏洞概述: typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任 ...

  8. 难顶!面试官问我G1垃圾收集器

    面试官:要不这次来聊聊G1垃圾收集器? 候选者:嗯嗯,好的呀 候选者:上次我记得说过,CMS垃圾收集器的弊端:会产生内存碎片&&空间需要预留 候选者:这俩个问题在处理的时候,很有可能会 ...

  9. HVV奇兵—网页防篡改系统在网络安全实战演习中的妙用(上)

    近年来,网络安全实战演习受到各大关基单位的高度关注.对于网络安全实战演习的防守方,防火墙.Web应用防火墙.态势感知.EDR.蜜罐等都是较为常见的防守工具,而网页防篡改系统则鲜有露脸的机会-- 很多人 ...

  10. Sql 语句中 IN 和 EXISTS 的区别及应用

    演示demo表: student表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stuid` varchar(16) NOT N ...