kubectlscale是帮助我们管理Kubernetes部署的众多工具之一。在本文中,我们将学习如何使用此工具及其使用的最佳实践。概述kubectlscale命令通过调整正在运行的容器的数量来即时扩展应用程序。这是增加部署的副本数量以处理服务高峰和日常维护更改的最快和最简单的方法。在这篇文章中,我们将学习如何使用kubectlscale对一个简单的KubernetesDeployment进行伸缩,同时我们也会对这个命令相关的各种参数有更深入的了解。这最终形成了kubectl扩展的最佳实践,以及调整Kubernetes副本数量的一些替代方案。kubectlscale用例kubectlscale用于改变Kubernetesdeployment、replicaset、replicationcontroller和statefulset等对象的副本数。当我们增加副本数量时,Kubernetes将启动新的Pod来扩展我们的服务。降低副本数将导致Kubernetes优雅地终止一些pod,释放集群资源。我们可以运行kubectlscale来手动调整应用程序的副本数量,以响应不断变化的服务容量需求。可以通过增加副本数量来处理增加的流量负载,提供更多的应用程序实例来服务用户流量。当业务突发减少时,可以减少副本数。这有助于通过避免使用不需要的资源来降低成本。kubectlkubectlscale最基本的用法是这样的:$kubectlscale--replicas=3deployment/demo-deployment执行这个命令将调整名为demo-deployment的部署,使其具有三个正在运行的副本。我们可以通过替换它们的名称而不是部署来定位不同类型的资源:#ReplicaSet$kubectlscale--replicas=3rs/demo-replicaset#ReplicationController$kubectlscale--replicas=3rc/demo-replicationcontroller#StatefulSet$kubectlscale--replicas=3sts/demo-statefulsetbasescaling现在我们将看一个使用kubectlscale扩展部署的完整示例。这是一个定义简单部署的YAML文件:apiVersion:apps/v1kind:Deploymentmetadata:name:demo-deploymentspec:replicas:1selector:matchLabels:app:demo-apptemplate:metadata:labels:app:demo-appspec:containers:-name:nginximage:nginx:latest将此YAML保存到工作目录中的demo-deployment.yaml。接下来,使用kubectl将部署添加到我们的集群:$kubectlapply-fdemo-deployment.yamldeployment.apps/demo-deploymentcreated现在运行kubectlgetpods命令以查看为部署创建的pod:$kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEdemo-deployment-86897ddbb-jl6r61/1Running033s只有一个pod在运行。这是预期的,因为部署的清单在其spec.replicas字段中声明了一个副本。单个副本不足以用于生产应用程序。如果托管pod的节点出于任何原因离线,我们可能会遇到停机。使用kubectlscale增加副本数量以提供更多空间:$kubectlscale--replicas=5deployment/demo-deploymentdeployment.apps/demo-deploymentscaled重复kubectlgetpods命令以确认部署已成功缩放:$kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEdemo-deployment-86897ddbb-66lzc1/1Running046sdemo-deployment-86897ddbb-66s9d1/1Running046sdemo-deployment-86897ddbb-jl6r61/1Running03dbbbsdemo-81dbb-deployment186897ddbb-tgvnw1/1Running046s现在有五个Pod正在运行。从AGE列中,我们可以看到scale命令保留了原来的pod,并增加了4个新的pod。经过进一步考虑,我们可能会决定此应用程序不需要五份副本。它只运行静态NGINXWeb服务器,因此每个用户请求的资源消耗应该很低。再次使用scale命令减少副本数量,避免浪费集群容量:$kubectlscale--replicas=3deployment/demo-deploymentdeployment.apps/demo-deploymentcreated重复kubectlgetpods命令:$kubectlgetpodsNAMEREADYSTATUSRESTARTSAGE演示部署-86897ddbb-66lzc1/1正在终止03m21sdemo-deployment-86897ddbb-66s9d1/1正在终止03m21sdemo-deployment-86897ddbb-jl6r61/1正在运行06m8sdemo-deployment-86897ddbb-66s9d1/1正在运行06m8sdemo-deployment-86897cjdbb-03m21sdemo-deployment-86897ddbb-tgvnw1/1Running03m21sKubernetes已将两个正在运行的pod标记为已终止。这会将正在运行的副本数量减少到请求的三个pod。选择驱逐的Pod会收到一个SIGTERM(https://www.containiq.com/post/sigterm-signal-15-linux-graceful-termination-exit-code-143)信号并允许正常终止(https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace)。停止后,它们将从pod列表中删除。条件扩展有时我们可能想要扩展资源,但前提是一定数量的副本已经在运行。这样可以避免意外覆盖以前的副本,例如集群中其他用户所做的更改。在命令中包含--current-replicas标志可以达到目的:$kubectlscale--current-replicas=3--replicas=5deployment/demo-deploymentdeployment.apps/demo-deploymentscaled这个例子将演示部署扩展到五个副本,但前提是三个副本当前正在运行。--current-replicas值总是完全匹配;我们不能将条件表达为“小于”或“大于”特定计数。扩展多个资源当我们提供多个名称作为参数时,kubectlscale命令可以一次扩展多个资源。每个资源将扩展到由--replicas标志设置的相同副本数。$kubectlscale--replicas=5deployment/appdeployment/databasedeployment.apps/appscaleddeployment.apps/databasescaled此命令将应用程序和数据库部署分别扩展到五个副本。我们可以通过提供--all标志来扩展特定类型的每个资源,就像这个例子来扩展默认命名空间中的所有部署:$kubectlscale--all--replicas=5--namespace=defaultdeploymentdeployment.apps/appscaleddeployment.apps/databasescaled这会选择当前活动命名空间中的每个匹配资源。缩放的对象显示在命令的输出中。我们可以使用--selector标志对缩放的对象进行细粒度控制。这使我们能够使用标准选择语法根据对象的标签(https://www.containiq.com/post/using-kubernetes-labels-selectors-annotations)过滤对象。下面是一个使用app-name=demo-app标签扩展所有部署的示例:$kubectlscale--replicas=5--selector=app-name=demo-appdeploymentdeployment.apps/appscaleddeployment.apps/databasescaledchangetimeout--timeout标志设置Kubectl在放弃扩展操作之前等待的时间。默认情况下,没有等待期。这个标志接受一个人类可读的时间值,例如5m或1h:$kubectlscale--replicas=5--timeout=1mdeployment/demo-deployment如果缩放更改不能立即完成,这允许我们避免长时间的终端挂起。尽管kubectlscale是命令式命令,但在将新pod调度到节点时,缩放更改有时可能需要几分钟才能完成。最佳实践使用kubectlscale通常是扩展工作负载的最快、最可靠的方法。但是,为了安全操作,需要牢记一些最佳实践。如下:避免过于频繁地缩放:对副本计数的更改应该响应特定事件,例如导致请求运行缓慢或丢包的拥塞。最好分析当前的服务性能,预估当前需要满足性能的资源需求,同时预估未来的增长能力。避免过于频繁地扩展应用程序,因为每个操作都会在创建和终止pod时造成延迟。将副本缩减为零将导致服务停止。您可以运行kubectlscale--replicas=0,这将删除所选对象中的所有容器。通过该命令调整副本的参数,实现向上扩容。确保我们选择了正确的对象。没有确认提示,因此请务必注意您的选择。按名称手动选择对象是最安全的方法,可以防止您意外扩展应用程序的其他部分,从而导致停机或浪费资源。使用--current-replicas来避免意外。使用--currentreplications标志通过确保缩放仅在当前计数符合您的预期时才更改来提高安全性。否则,您可能会无意中覆盖其他用户或Kubernetes自动缩放器应用的缩放更改。kubectlScale的替代方案运行kubectlscale是对集群有直接影响的基本操作。您正在指示Kubernetes尽快提供特定数量的副本。如果对象是使用命令式kubectlcreate命令创建的,这是合乎逻辑的,但如果kubectlapply最初是使用声明性YAML文件运行的,则不合适,如上所示。运行scale命令后,集群中的副本数将与YAML的spec.replications字段中定义的副本数不同。更好的做法是修改YAML文件,然后将其重新应用到集群。首先将spec.replicas字段更改为我们新的所需副本数:apiVersion:apps/v1kind:Deploymentmetadata:name:demo-deploymentspec:replicas:5selector:matchLabels:app:demo-apptemplate:metadata:labels:app:demo-appspec:containers:-name:nginximage:nginx:latest现在在修改后的文件上重复kubectlapply命令:$kubectlapply-fdemo-deployment.yamlkubectl将自动区分更改并采取行动来发展集群的状态到文件中声明的状态。这将导致Pod自动创建或终止,因此运行实例的数量再次与spec.replicas字段匹配。kubectlscale的另一个替代方案是Kubernetes对自动缩放的支持。配置此机制允许Kubernetes根据CPU使用率和网络活动等指标自动调整配置的最小值和最大值之间的副本计数。最终总结kubectlscale命令是扩展Kubernetes部署、副本集、复制控制器和有状态集的通用方法。它每次调用都以一个或多个对象为目标,并缩放它们以运行指定数量的pod。我们可以选择设置条件,以便只有在存在一定数量的现有副本时才会更改比例,从而避免在错误的方向上意外调整大小。同时,我们也希望遵循本文提到的一些最佳实践,从而顺利可靠地实现资源的扩容和缩容。*原文:https://www.containiq.com/post/kubectl-scale
