在 Kubernetes 中,自动扩容和缩容是常见的操作,它们能够使我们更好地适应流量的变化,提高系统的稳定性和弹性,同时也大大降低了服务运维的成本。
本文将介绍 Kubernetes 中如何进行服务的自动扩容和缩容操作,并提供相关的代码示例。
水平扩展和缩小
在 Kubernetes 中,服务的水平扩展和缩小通常是通过修改 Deployment、ReplicaSet 或 StatefulSet 的 replicas 字段来实现的。
Deployment 扩容和缩小
假设我们有一个 Deployment,名称为 my-app,通过以下命令可以将它的 replicas 数目扩大到 3:
kubectl scale deployment my-app --replicas=3
类似地,如果我们想把它的 replicas 数目降至 1,可以使用以下命令:
kubectl scale deployment my-app --replicas=1
ReplicaSet 扩容和缩小
如果我们没有使用 Deployment 而直接使用 ReplicaSet,也可以使用类似的命令进行扩展和缩小。假设我们有一个 ReplicaSet,名称为 my-rs,通过以下命令可以将它的 replicas 数目扩大到 3:
kubectl scale rs my-rs --replicas=3
同样,如果我们想把它的 replicas 数目降至 1,可以使用以下命令:
kubectl scale rs my-rs --replicas=1
StatefulSet 扩容和缩小
在使用 StatefulSet 时,我们需要分别对每个 Pod 进行扩展和缩小操作。假设我们有一个 StatefulSet,名称为 my-statefulset,它有三个 Pod,分别为 my-statefulset-0、my-statefulset-1 和 my-statefulset-2,通过以下命令可以将它的 replicas 数目扩大到 5:
kubectl scale statefulset my-statefulset --replicas=5
如果我们想把它的 replicas 数目降至 2,需要依次执行以下三个命令:
kubectl delete pod my-statefulset-2 kubectl delete pod my-statefulset-1 kubectl scale statefulset my-statefulset --replicas=2
根据 CPU 利用率自动扩缩容
除了手动进行扩容和缩容操作外,Kubernetes 还提供了自动扩缩容的功能。其中一个比较常见的使用场景是根据 Pod 的 CPU 利用率进行自动扩缩容。
以下是一个简单的 Pod 配置文件,它定义了一个名为 my-app 的 Pod,运行一个 nginx 容器。这个 Pod 的资源限制为 0.1 CPU 和 64MB 内存。
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ------ ----- ----------- - ----- ----- ------ ----- ---------- ------- ---- ---- ------- ----
我们可以使用 HorizontalPodAutoscaler 对象来自动扩缩容这个 Pod。以下是一个简单的 HorizontalPodAutoscaler 配置文件,它定义了名为 my-app 的 Pod 的自动扩缩容规则。当 CPU 利用率超过 50% 时,自动将副本数量扩大到 3;当 CPU 利用率低于 30% 时,自动将副本数量缩小到 1。
-- -------------------- ---- ------- ----------- ------------------- ----- ----------------------- --------- ----- ---------- ----- --------------- ----------- ------- ----- ---------- ----- ------ ------------ - ------------ - -------- - ----- -------- --------- ----- --- ------- ----- ----------- ------------------- --
运行以下命令来创建这个 HorizontalPodAutoscaler:
kubectl apply -f my-app-hpa.yaml
当 Pod 的 CPU 利用率超过 50% 时,HorizontalPodAutoscaler 将会自动将副本数量扩大到 3;当 CPU 利用率低于 30% 时,它将会自动将副本数量缩小到 1。
根据自定义指标自动扩缩容
除了 CPU 利用率,我们还可以根据自定义指标来进行自动扩缩容。这通常需要安装一个指标采集器,例如 Prometheus,来采集和存储自定义指标数据。然后,我们可以使用 CustomMetricsAdapter 和 MetricServer 来从指标采集器中获取指标数据,以便实现自动扩缩容。
以下是一个简单的 Deployment 配置文件,它定义了一个名为 my-app 的 Deployment,运行一个 nginx 容器。这个 Deployment 的资源限制为 0.1 CPU 和 64MB 内存。
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------ ----- --------- - --------- ------------ ---- ------ --------- --------- ------- ---- ------ ----- ----------- - ----- ----- ------ ----- ---------- ------- ---- ---- ------- ----
我们可以使用 CustomMetricsAdapter 和 MetricServer 对象来自动扩缩容这个 Deployment。以下是一个简单的 CustomMetricsAdapter 配置文件,它定义了名为 my-custom-metrics-adapter 的 CustomMetricsAdapter 对象和一个 CustomMetric 对象,它将通过访问 Prometheus 中的 promhttp_metric_handler_requests_total 指标来获取 custom_metric 指标。CustomMetricsAdapter 将定期获取 custom_metric 的值,根据自定义的扩缩容规则来自动扩缩容 Deployment。
-- -------------------- ---- ------- ----------- ---------------------------- ----- ------------------------ --------- ----- ----------------------------------- ----- ------ --------------------- ------ ----- ------------ ------- ------------- --------- ------------ ------ ---------- --------- - ----- -------- ------- ---- -------- ---- ------------- ------ ----------------- ---------------- ------------------- ------------------ ------------------ ---------------- --- ----------- ------- ----- ---------- --------- ----- ------------------------- ----- --------- - --------- ------------ ---- ------------------------- --------- --------- ------- ---- ------------------------- ----- ----------- - ----- ------- ----- - --------------- - ------- - --------------------------------- - ---------------------------------------------------------------- - -------------------------------- - -------- --- -------- --- --- -- ---------- - --------------------------- - ---------- - ------------------------------------ - ------------------------------------------------- ------ ----------------------------------------------------- ---------------- ------ ------ - -------------- ---- ----- ------- ------------- - ----- ------ ---------- -------------------------- ---- - ----- -------- ---------- --------- ---------- ------------- - ----- ------------- ---------- --------- ---------- ------------------ -------- - ----- ------ ---------- ----- --------------------- ------------------- ------------------------- --- ----------- -- ----- --------- --------- ----- --------------------- ----- ------------ - ------ - ------------ ----------------------------------------------------------- ---------- ---------- ---------- --------- --------- --------- --------- --- ----- -------- -------------- --- ------ ------------- ------------------------------------------------------- --- ----------- ------------------- ----- ----------------------- --------- ----- ---------- ----- --------------- ----------- ------- ----- ---------- ----- ------ ------------ - ------------ - -------- - ----- ---- ----- ----------- ------------- ------------------- -
运行以下命令来创建 CustomMetricsAdapter、HorizontalPodAutoscaler 和相关的 ServiceAccount 和 ConfigMap。
kubectl apply -f custom-metrics-adapter.yaml
在这个例子中,我们通过 CustomMetricsAdapter 和 MetricServer 来自动扩缩容 Deployment,其实现过程是通过访问 Prometheus 中的 promhttp_metric_handler_requests_total 指标来获取 custom_metric 指标,并根据自定义的扩缩容规则来自动扩缩容 Deployment。
总结
在 Kubernetes 中,服务的自动扩容和缩容是非常重要的功能,它能够帮助我们更好地适应流量的变化,提高系统的稳定性和弹性,同时也大大降低了服务运维的成本。
本文详细介绍了 Kubernetes 中如何进行服务的自动扩容和缩容操作,以及根据 CPU 利用率和自定义指标自动扩缩容的实现方法。通过本文的学习和实践,读者可以更好地应用 Kubernetes 进行服务运维和开发。
示例代码
该文档的相关示例代码可以在以下 GitHub 仓库中找到:
https://github.com/kubecowboy/kubernetes-autoscaler-tutorial
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ad323d48841e989495ad47