Kubernetes:应用自动扩容、收缩与稳定更新

简介: Kubernetes:应用自动扩容、收缩与稳定更新

缩放 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 个副本数量。如果在机器管够的情况下,可以去掉 minmax 参数。

算法细节请查看: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,此时可以指定 maxUnavailablemaxSurge 来控制滚动更新 过程。这个我们之前提到过,就是 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 设置小一些。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
存储 运维 Kubernetes
批处理及有状态等应用类型在 K8S 上应该如何配置?
批处理及有状态等应用类型在 K8S 上应该如何配置?
|
3月前
|
Kubernetes 应用服务中间件 nginx
百度搜索:蓝易云【使用Kubernetes部署Nginx应用教程】
现在,你已经成功在Kubernetes集群上部署了Nginx应用。通过访问Service的外部IP地址,你可以访问Nginx服务。
42 4
|
20天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
19 4
|
21天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
28 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
1月前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
20 0
|
2月前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
2月前
|
人工智能 自然语言处理 Kubernetes
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
87 0
|
3月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
118 0
|
3月前
|
消息中间件 Kubernetes NoSQL
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践
|
3月前
|
运维 JavaScript 开发者
深入浅出:使用Docker容器化部署Node.js应用
在当今快速发展的软件开发领域,构建一套高效、可靠且易于扩展的开发环境成为了许多开发者和企业的首要任务。本文将探讨如何利用Docker这一强大的容器化技术,实现对Node.js应用的快速部署和管理。不同于传统的摘要方式,我们将通过一个实际操作的视角,逐步引导读者理解Docker的基本概念、容器与镜像的区别、以及如何构建自己的Node.js应用Docker镜像,最终实现应用的容器化部署。此外,文章还将简要介绍Docker Compose的使用,帮助读者管理包含多个服务的复杂应用。无论是刚接触Docker的新手,还是希望深化理解容器化技术的资深开发者,本文都将提供有价值的见解。
41 0