kubectl系列(五)-kubectl scale 命令最佳实践

1 概述

kubectl scale命令通过调整正在运行的容器的数量来立即缩放应用程序。这是增加部署副本数量的最快、最简单的方法,可用于应对服务高峰以及日常维护变更。

在本文中将了解如何使用kubectl scale来扩展一个简单的Kubernetes Deployment,同时还将更深入的了解该命令相关的各种参数。最终形成kubectl scale的最佳实践,以及一些用于调整 Kubernetes 副本数的替代方法

kubectl scale用例

kubectl scale用于更改Kubernetes deployment, replica set, replication controller和 statefulset 等对象的副本数码。当增加副本数时,Kubernetes将启动新的Pod来扩服务副本数。降低副本数将导致 Kubernetes 优雅地终止一些 pod,从而释放集群资源。

可以运行kubectl scale来手动调整应用程序的副本数,以响应不断变化的服务容量需求。增加的流量负载可以通过增加副本数来处理,提供更多的应用程序实例来服务用户流量。当业务突发降低的时候,可以减少副本的数量。这有助于通过避免使用不需要的资源来降低成本。

使用 kubectl

kubectl scale最基本的用法是这样的:

$ kubectl scale --replicas=3 deployment/demo-deployment

执行此命令将调整名为demo-deployment 的部署,使其拥有三个正在运行的副本。可以通过替换其名称而不是部署来定位不同类型的资源:

# ReplicaSet
$ kubectl scale --replicas=3 rs/demo-replicaset# ReplicationController
$ kubectl scale --replicas=3 rc/demo-replicationcontroller# StatefulSet
$ kubectl scale --replicas=3 sts/demo-statefulset

3.1 基础缩放

定义一个简单部署的 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
spec:
replicas: 1
selector:matchLabels:app: demo-app
template:metadata:labels:app: demo-appspec:containers:- name: nginximage: nginx:latest

将此 YAML 保存到工作目录中的demo-deployment.yaml 。接下来,使用kubectl将部署添加到集群:

$ kubectl apply -f demo-deployment.yaml
deployment.apps/demo-deployment created

现在运行kubectl get pods命令来查看已为部署创建的 pod:

$ kubectl get podsNAME   READY   STATUS   RESTARTS   AGE
demo-deployment-86897ddbb-jl6r6    1/1   Running    0   33s

只有一个 pod 正在运行。这是意料之中的,因为部署的清单在其spec.replicas字段中声明了一个副本。

单个副本不足以用于生产应用程序。如果托管 pod 的节点出于任何原因离线,都可能导致停服。使用kubectl scale增加副本数以提供更多空间:

$ kubectl scale --replicas=5 deployment/demo-deployment
deployment.apps/demo-deployment scaled

重复kubectl get pods命令以确认部署已成功扩容:

$ kubectl get pods
NAME                             READY   STATUS   RESTARTS   AGE
demo-deployment-86897ddbb-66lzc    1/1   Running    0   46s
demo-deployment-86897ddbb-66s9d    1/1   Running    0   46s
demo-deployment-86897ddbb-jl6r6    1/1   Running    0   3m33s
demo-deployment-86897ddbb-sgcjb    1/1   Running    0   46s
demo-deployment-86897ddbb-tgvnw    1/1   Running    0   46s

现在有五个 Pod 正在运行。从AGE列可以看到scale命令保留了原来的 pod 并新增了 4 个。

当应用程序不需要五个副本,只需要运行一个静态 NGINX Web 服务器时,可使用scale命令来降低副本数并避免浪费集群容量:

$ kubectl scale --replicas=3 deployment/demo-deployment
deployment.apps/demo-deployment created

重复kubectl get pods命令:

$ kubectl get podsNAME                           READY   STATUS   RESTARTS   AGE
demo-deployment-86897ddbb-66lzc    1/1   Terminating    0   3m21s
demo-deployment-86897ddbb-66s9d    1/1   Terminating    0   3m21s
demo-deployment-86897ddbb-jl6r6    1/1   Running    0   6m8s
demo-deployment-86897ddbb-sgcjb    1/1   Running    0   3m21s
demo-deployment-86897ddbb-tgvnw    1/1   Running    0   3m21s

Kubernetes 已将两个正在运行的 pod 标记为终止。这会将正在运行的副本计数减少到请求的三个 pod。选择要驱逐的 pod 会被发送一个SIGTERM信号并允许优雅地终止,停止后,它们将从 pod 列表中删除。

3.2 条件缩放

有些场景需要扩展资源,但前提是已经有特定数量的副本在运行。这可以避免意外覆盖以前的副本,例如集群中其他用户所做的更改。

在命令中包含--current-replicas标志可以达到效果:

$ kubectl scale --current-replicas=3 --replicas=5 deployment/demo-deployment
deployment.apps/demo-deployment scaled

此示例将演示deployment扩展到五个副本,但前提是当前有三个副本正在运行。--current -replicas值始终完全匹配;scale不能将条件表示为“小于”或“大于”特定计数。

3.3 扩展多个资源

当提供多个名称作为参数时, kubectl scale命令可以一次缩放多个资源。每个资源都将缩放到由--replicas标志设置的相同副本计数:

$ kubectl scale --replicas=5 deployment/app deployment/database
deployment.apps/app scaled
deployment.apps/database scaled

此命令将应用程序和数据库deployment扩展到每个五个副本。 

还可以通过提供--all标志来扩展特定类型的每个资源,例如此示例以扩展默认命名空间中的所有部署:

$ kubectl scale --all --replicas=5 --namespace=default deployment
deployment.apps/app scaled
deployment.apps/database scaled

这会选择当前活动命名空间(default)内的每个匹配资源。缩放的对象显示在命令的输出中。

可以对使用--selector标志缩放的对象进行精细控制,可以使用标准选择语法根据对象的标签过滤对象。这是一个使用app-name=demo-app标签扩展所有部署的示例:

$ kubectl scale --replicas=5 --selector=app-name=demo-app deployment
deployment.apps/app scaled
deployment.apps/database scaled

3.3 更改超时 

--timeout标志设置 Kubectl 在放弃缩放操作之前将等待的时间。默认情况下,没有等待期。该标志接受可读的时间值,例如5m或1h:

$ kubectl scale --replicas=5 --timeout=1m deployment/demo-deployment

如果无法立即完成缩放更改,这可以避免长时间的终端挂起。尽管kubectl scale是一个命令式命令,但在将新 pod 调度到节点时,对缩放的更改有时可能需要几分钟才能完成。 

3.4 最佳实践

使用kubectl scale通常是扩展工作负载的最快、最可靠的方法。但是为了安全操作,需要记住一些最佳实践。如下所示:

  • 避免过于频繁地缩放:对副本计数的更改应响应特定事件,例如导致请求运行缓慢或丢包的拥塞。最好分析当前的服务性能,估算一下当前需要满足性能的资源需求,同时也预估一下未来的增长容量。避免过于频繁地扩展应用程序,因为在创建和终止POD时,每个操作都可能导致延迟。

  • 副本缩小到零将会导致服务停止。可以运行kubectl scale--replicas=0,这将删除选定对象中的所有容器。通过使用该命令,调整replicas的参数,从而实现向上的扩容。

  • 请务必注意正在选择的对象。按名称手动选择对象是最安全的方法,可以防止意外地扩展应用程序的其他部分,从而导致停机或资源浪费。

  • 使用 --current-replicas来避免意外。使用--current replications标志可以确保仅当当前计数符合您的期望时,缩放才会更改,从而提高安全性。否则可能会无意中覆盖其他用户或Kubernetes autoscaler应用的缩放更改。

3.5 kubectl Scale的替代方式

运行kubectl scale是一项必不可少的操作,它对集群有着直接的影响。正在指示Kubernetes尽快提供特定数量的副本。如果使用命令式的kubectl create命令创建对象,这是合乎逻辑的,但是如果最初使用声明性的YAML文件运行kubectl apply,则这是不合适的,如上所示。运行scale命令后,集群中的副本数量将不同于YAMLspec.replications字段中定义的副本数量。更好的做法是修改YAML文件,然后将其重新应用于集群。

首先将spec.replicas字段更改为所需的新副本数:

apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
spec:
replicas: 5
selector:matchLabels:app: demo-app
template:metadata:labels:app: demo-appspec:containers:- name: nginximage: nginx:latest

现在对修改后的文件重复kubectl apply命令:

$ kubectl apply -f demo-deployment.yaml

kubectl 将自动区分更改并采取措施将集群的状态演变为文件中声明的状态。这将导致 Pod 被自动创建或终止,因此运行实例的数量再次与spec.replicas字段匹配。

kubectl scale的另一个替代方案是 Kubernetes 对自动缩放的支持。配置此机制允许 Kubernetes 根据 CPU 使用率和网络活动等指标在配置的最小值和最大值之间自动调整副本计数。

总结

kubectl scale命令是扩展 Kubernetes deployments, replica sets, replication controllers以及stateful sets的通用方式。它在每次调用时以一个或多个对象为目标,并对其进行缩放,以便运行指定数量的 pod。

可以选择设置条件,因此只有在存在特定数量的现有副本时才会更改比例,从而避免在错误方向上意外调整大小。

同时也希望能够遵循一些本文所提到的最佳时实践,从而平稳,可靠的实现资源的扩缩容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kobs-ng 烧写nand中的uboot

如何获取kobs-ng 我是使用buildroot自动编译的imx-kobs,生成了kobs-ng可执行文件。 使用 kobs-ng 烧写 u-boot 1. flash_erase /dev/mtd0 0 0 //擦除uboot所在分区 2. 挂载 debugfs mount -t debugfs debugfs /sys/kernel/debug 如果不挂载为报以下错误&#x…

Java中的synchronized关键字

目录 1、synchronized是什么 2、synchronized的用法 synchronized可以用在方法或者代码块上,分别称为同步方法和同步代码块。 用法理解 3、synchronized的实现原理 ⭐synchronized锁的对比 4、synchronized的优缺点 ⭐扩展:synchronized 和 vola…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

IDEA之Eclipse Code Formatter插件的安装与使用

概述 Eclipse、Intellij idea格式化结果不同,之前由于没有Eclipse Code Formatter插件,所以公司统一用eclipse做开发,但是我们都知道IDEA是非常强大、也非常的方便,很多功能是eclipse不具备的,只是我们公司统一用&…

【隐私计算】VOLE (Vector Oblivious Linear Evaluation)学习笔记

近年来,VOLE(向量不经意线性评估)被用于构造各种高效安全多方计算协议,具有较低的通信复杂度。最近的CipherGPT则是基于VOLE对线性层进行计算。 1 VOLE总体设计 VOLE的功能如下,VOLE发送 Δ \Delta Δ和 b b b给send…

【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks

【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…

全网最新最全面的Jmeter接口测试:jmeter模拟http请求实战

1、get请求 http://www.hnxmxit.com/ 2、带参数的get请求 微信公众号获取token请求 3、自定义头部信息的请求 百度搜索请求 https://www.baidu.com/s?wd猫 4、post请求 微信公众号添加用户标签请求 注:post请求中如果body中的数据为json,一定要在信息头管理器中…

编译原理头歌实验:实验1《词法分析程序设计与实现》(C语言版)

任务描述 本关任务:加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 相关知识 为了完成本关任务&#xff0…

Qt应用开发--国产工业开发板全志T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用,因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处: -…

袋鼠云产品功能更新报告08期|近百项全新功能和优化,你要的都在这里!

欢迎来到袋鼠云08期产品功能更新报告!在瞬息万变的市场环境中,我们深知客户的需求与期待,因此,我们及时推出袋鼠云最新产品更新及优化,包括数据治理中心、Hive SQL 性能优化、新插件等,助力企业在数字世界中…

Golang分布式事务

引言 在分布式系统中,事务管理是一项非常重要的任务。分布式事务涉及到多个事务参与者之间的协调和一致性保证,同时还要解决网络延迟、故障恢复等问题。Golang作为一门强大的编程语言,提供了一些工具和框架来帮助开发人员实现分布式事务。本…

awk从放弃到入门(11):拾遗之”三元运算”与”打印奇偶行”

awk从放弃到入门(11):拾遗之”三元运算”与”打印奇偶行” 三元运算打印奇偶行 本博文转载自 这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。 这篇文章其实是对之前知…

英语翻译小软件 ← Python实现

【程序描述】 利用Python实现一个英语翻译小软件。 ★ 当输入一个英文单词后,输出对应的中文意思。 ★ 当输入 q 时,退出程序。 ★ 当输入一个不存在的词条时,捕获异常,提示“No finding!”。【程序代码】 dict{&quo…

IOS/安卓+charles实现抓包(主要解决证书网站无法打开问题)

安装 官网下载 https://www.charlesproxy.com/latest-release/download.do 安装charles文档 流程 上述链接解决下图问题 使用介绍 Charles介绍 上述链接看一至三即可,了解首页各个按钮的作用 charles全面使用教程及常见功能详解(较详细&#xff09…

Vim编辑器使用

替换全部 :%s/search_string/replace_string/g 撤销 u 撤销 ctrl r 取消撤销 换行 下移动一行 -上移动一行 删除 插入模式删除字符 Ctrl U

netty源码:(1)NioEventLoopGroup

EventLoopGroup bossGroup new NioEventLoopGroup(); 不加参数创建NioEventLoopGroup的话,会使用cpu核数*2作为bossGroup的线程数。

二 使用GPIO的复用功能 利用USART 实现printf()

参考这篇: STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输, USART 能够以同步或者异步的方式进行工作,在实际的运用中&…

容器技术发展史,编排与容器的技术演进之路——2

目录: 容器技术发展史 Jail时代 1979 年 贝尔实验室发明 chroot2000 年 FreeBSD 4.0 发行 FreeBSD Jail2001 年 Linux VServer 发行2004 年 Solaris Containers 发行云时代 2006 年 google 推出 Process Containers2008 年 LXC 推出2011 年 CloudFoundry 推出 Ward…

【Linux】I/O多路转接技术

I/O多路转接技术 一、I/O多路转接之select1、select函数2、fd_set的相关内容3、如何在代码中高效的使用select函数4、select服务器5、select的优缺点6、select的适用场景 二、I/O多路转接之poll1、poll函数2、struct pollfd结构2、poll服务器3、poll的优缺点 三、I/O多路转接之…

自身免疫疾病抗原应用方向——博迈伦生物

自身免疫疾病是指机体免疫系统对自身组织产生异常免疫反应的疾病,包括类风湿性关节炎、系统性红斑狼疮、多发性硬化症等。目前,针对自身免疫疾病的治疗方案主要包括药物治疗和免疫调节治疗。而自身免疫疾病抗原应用则是一种新的治疗方向,其通…