`
m635674608
  • 浏览: 5048001 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Kubernetes自动伸缩功能剖析

 
阅读更多

使用Kubernetes的客户能够迅速响应终端用户的请求,交付软件也比以往更快。但是,当你的服务增长速度比预期更快时,计算资源不够时,该怎么处理呢?

此时可以很自豪地说:Kubernetes 1.3提供了一个解决方案:自动伸缩(auto-scaling)。搭建在Google计算引擎(GCE)和Google容器引擎(GKE)(以及即将用于AWS)上,Kubernetes会在必要时自动扩容你的集群,并在不需要时缩容,以便为你省下一笔费用。

Part 1:自动伸缩的优势

这里我们用一个例子说明自动伸缩的应用场景。

想象一下你有一个7*24(全天候)的服务,它的负载随着时间变化。在美国地区,白天服务非常繁忙,夜间负载相对较低。

理想情况下,我们希望集群中节点和运行中Pod的数量能够动态调整负载,以适应终端用户的需求。新的 自动伸缩 功能与 Horizontal Pod Autoscaler配合在一起可以自动解决这个问题。

Part 2:在GCE设置Autoscaling

以下操作指南适用于GCE。对于GKE请在集群操作手册(查看“相关链接”)查看 autoscaling这个章节。

开始之前,我们需要一个活跃的GCE项目,并且启用Google Cloud Monitoring、Google Cloud Logging和Stackdriver。

如果你想了解如何创建一个GCE项目,请阅读入门指南(查看“相关链接”)。我们还需要下载一个Kubernetes项目的最新版本(版本v1.3.0+)。

第一步:创建一个集群,并启用Autoscaler。

集群中的节点数量将从2开始,并自动调整到最大5。要实现这一点,我们需要设置以下环境变量:

自动1

通过kube-up.sh启动集群:

自动2

kube-up.sh 脚本创建一个集群,并默认启用了Autoscaler插件。如果集群中存在pending pod,autoscaler将尝试向集群中添加新的节点,然后pending的pod会被调度到新节点上。

我们观察一下集群,它应该有两个节点:

自动3

第二步:运行并暴露PHP-Apache 服务

为了演示自动伸缩功能,我们基于php-apache镜像制作了一个自己的镜像。镜像可以在这里(见“参考链接”)找到。它定义一个index.php页面,这个页面会执行CPU密集的计算。

首先,我们创建一个deployment,并将其端口暴露出来:

自动4

现在,我们将等待一段时间,验证部署和服务是否被正确创建和运行:

自动5

使用wget命令检查 Php-apache服务是否运行正常:

自动6

第三步:启动Horizontal Pod Autoscaler

depleoyment正常运行后,我们将为它创建一个Horizontal Pod Autoscaler对象。使用kubectl autoscale 命令就可以:

自动7

这里我们定义了一个Horizontal Pod Autoscaler,它保证deployment对象php-apache控制的Pod数量在1~10之间。

换句话说,horizontal autoscaler通过deployment对象增加或减少Pod副本数量,以保证所有Pod的CPU平均使用率在50%左右。

kubectl run创建deployment时,为每个Pod申请了0.5核CPU,也就是说,每个Pod实际平均使用0.25核CPU)。

关于该算法的详细信息查看文章末尾(“相关链接”)。

我们可以通过”kubectl get hpa”检查autoscaler 的状态:

自动8

注意,当前的CPU 使用率是0%,因为我们没有向服务器发送任何请求(当前列显示的是与hpa对应的rc下所有pods 的CPU使用率的均值。

第四步:提高负载

现在,我们将看到 Autoscalers(Cluster Autoscaler 和 Horizontal Pod Autoscaler)如何响应不断增加的负载。我们将启动两个实例(请运行在不同的终端),每个实例启动一个访问php-apache服务的死循环:

自动9

我们需要稍微等待一段时间(1min左右),然后检查Horizontal Pod Autoscaler的状态:

自动10

Horizontal Pod Autoscaler 已经把 Pod 数量增加到7。我们检查下是不是所有的Pod都在运行:

自动11

我们可以发现:一些 pod处于pending状态。我们使用 ”kubectl describe” 命令查看其中一个pending pod,以获取 pending 的原因:

自动12

该pod正在pending 是由于在系统中没有足够的 CPU资源。我们还可以看到有一个 TriggeredScaleUp事件。这意味着 pod触发了Cluster Autoscaler 的响应,一个新节点将被添加到集群中。

现在我们再等待一段时间(3min左右),并列出所有节点:

自动13

我们可以发现:一个新节点 kubernetes-minion-group-6z5i 被Cluster Autoscaler 添加到集群中。我们确认下所有的pods都已经运行正常:

自动14

添加节点以后,所有的php-apache pods都在正常运行!

第五步:降低负载

现在,我们停止向服务器打压力。我们把两个向server发请求的死循环都结束掉,然后观察php-apache 服务的状态:

自动15

我们可以看到,Pod的CPU平均使用率已经降到0%,Pod个数也降到1。

把多余的Pod删除以后,大部分的集群资源都都被空出来。短时间内,集群不会被缩容,因为Cluster Autoscaler必须确保php-apache服务对资源的需求确实降低了,而不是短期或临时原因(比如Pod升级)。

更多细节参考 Cluster Autoscaler的文档(“相关链接”)。

集群缩容可能比扩容花费更多时间。大约10-12分钟后,您可以验证集群节点数量的下降:

自动16

集群中节点的个数重新恢复到2, 节点kubernetes-minion-group-6z5i已经被Autoscaler删除。

Part 3:其他使用场景

看完上面的例子,我们可以发现,结合Horizontal Pod Autoscaler 和 Cluster Autoscaler动态调整pods数量是很简单的。

在有些场景下,Cluster Autoscaler 自己也能发挥不少作用,尤其是应对某些不规则的负载变化。

举个例子,与集群相关的开发或者集成测试一般不会在周末和晚上进行。

对于批处理集群,当所有Job都结束,而新的Job也只能在几个小时后才开始。

让机器闲着绝对是暴殄天物。

在这些场景下,Cluster Autoscaler 能够减少空闲结点的数量,并显示减少支出,因为你只需要为实际运行的服务付费,同时也能够保证你总是有足够的资源运行你的任务。

相关链接

GKE Autoscalinghttps://cloud.google.com/container-engine/docs/clusters/operations#create_a_cluster_with_autoscaling

创建一个gce项目https://github.com/kubernetes/kubernetes/blob/master/docs/getting-started-guides/gce.md#prerequisites

php-apache镜像https://github.com/kubernetes/kubernetes/tree/8caeec429ee1d2a9df7b7a41b21c626346b456fb/docs/user-guide/horizontal-pod-autoscaling/image

AutoScaling算法https://github.com/kubernetes/kubernetes/blob/8caeec429ee1d2a9df7b7a41b21c626346b456fb/docs/design/horizontal-pod-autoscaler.md#autoscaling-algorithm

Cluster Autoscaler文档https://github.com/kubernetes/kubernetes.github.io/blob/release-1.3/docs/admin/cluster-management.md#cluster-autoscaling

本文由时速云翻译,如若转载,需注明转载自“时速云

原文链接:http://blog.kubernetes.io/2016/07/autoscaling-in-kubernetes.html

https://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/

 

https://www.oschina.net/question/2657833_2189615

https://kubernetes.io/docs/user-guide/kubectl/kubectl_autoscale/

分享到:
评论

相关推荐

    一种改进的Kubernetes弹性伸缩策略.pdf

    Kubernetes采用Master-Slave架构,为容器化应用提供了丰富的功能,如资源调度、自动化部署、服务发现、弹性伸缩和资源监控。其中,弹性伸缩是Kubernetes的关键特性之一,它能够动态调整应用实例的数量以应对变化的...

    k8s自动伸缩那些事资料下载.pdf

    ### Kubernetes自动伸缩技术深入解析 #### 一、引言 随着云计算的发展,Kubernetes (简称K8s)作为容器编排领域的佼佼者,在自动伸缩方面展现出了强大的功能和灵活性。本文将深入探讨K8s自动伸缩的相关概念、原理及...

    Kubernetes日志采集与分析的最佳实践

    Kubernetes日志采集与分析是当前容器化部署与运维中非常关键的一个环节,由于Kubernetes自身的分布式特性,使得日志管理变得更加复杂。本文分享了关于Kubernetes日志管理的最佳实践,由阿里云日志服务技术专家元乙...

    弹性容器的自动伸缩策略.pptx

    ### 弹性容器的自动伸缩策略 #### 自动伸缩机制概述 **触发机制** - **水平自动伸缩的触发条件**:自动伸缩机制能够根据多种触发条件自动调整容器的数量,这些条件包括但不限于CPU利用率、内存使用率等指标,以及...

    Kubernetes1.4.0源代码

    Kubernetes 1.4 进一步强化了与持续集成/持续部署工具(如Jenkins、Spinnaker等)的集成,以及与监控和日志分析工具(如Prometheus、ELK Stack等)的对接,使得整个容器生命周期管理更为顺畅。 9. **API性能优化**...

    Kubernetes容器集群管理 完整清晰版 书籍

    Kubernetes的灵活性和功能使得它成为了云原生计算的基石,企业可以利用它来构建可伸缩的应用,提高应用的可用性和可靠性。随着云计算和容器技术的不断发展,Kubernetes在企业应用中的地位将越来越重要。

    Kubernetes工作坊_kubernetes实践_Kubernetes_

    此外,Kubernetes提供服务发现和负载均衡,自动伸缩,以及持续集成/持续交付(CI/CD)等能力。 **二、Kubernetes架构** Kubernetes架构由Master节点和Worker节点组成。Master节点负责整个集群的管理和控制,包括...

    Serverless Kubernetes技术发展趋势分析.pdf

    2. **快速部署与弹性伸缩**:借助Serverless Kubernetes,应用部署和更新速度显著提升,可以实现秒级弹性伸缩,这意味着系统能迅速应对业务流量的增减,尤其适用于需要处理非预期突发流量的场景,如电商大促、在线...

    TiDB在Kubernetes平台自动化部署运维实践v1.pptx

    Cloud Native 应用程序 Cloud Native 应用程序是一种设计和构建应用程序的方法,旨在充分...通过利用 Kubernetes 的强大功能,TiDB 能够在多云环境中实现自动化部署、运维和扩展,为企业数字化转型提供了坚实的基础。

    Kubernetes指南-倪朋飞

    6. **Horizontal Pod Autoscaler (HPA)**:HPA允许自动调整Pod的数量以应对资源需求的变化,这是Kubernetes实现弹性伸缩的关键功能。 7. **Ingress与网络策略**:Ingress提供了对外部访问Kubernetes服务的路由规则...

    kubernetes中文文档

    - **Autoscaling**: 自动伸缩机制,如 Horizontal Pod Autoscaler。 - **ConfigMap**: 用于存储非机密性的配置数据。 - **CronJob**: 定期执行任务。 - **CustomResourceDefinition**: 扩展 Kubernetes API 的方法。...

    Serverless Kubernetes技术发展趋势分析.pptx

    Serverless Kubernetes结合了Kubernetes的灵活管理和Serverless的资源优化,为云原生应用提供了更加智能化、自动化的运行环境,推动了IT行业的创新和发展。随着技术的不断成熟,Serverless Kubernetes有望成为未来云...

    kubernetes基础入门

    - **自动伸缩**: 介绍如何根据CPU利用率、内存使用情况等指标自动调整Pod的数量。 - **水平伸缩**: 根据预定义的指标自动增加或减少Pod的数量。 - **垂直伸缩**: 在不改变Pod数量的情况下,增加或减少每个Pod的资源...

    携程Kubernetes混合云架构最佳实践.pdf

    Kubernetes的核心功能包括服务发现、自动伸缩、负载均衡和容器生命周期管理等,这些功能在携程的混合云环境中发挥了关键作用。通过Kubernetes,携程可以轻松地将应用程序部署到不同云环境,实现跨云的数据同步和业务...

    kubernetes-dashboard

    Kubernetes(通常简称为 K8s)是Google 开源的一个容器编排系统,用于自动化容器化应用的部署、扩展和管理。Kubernetes 基于 Docker 容器技术,提供了一套强大的工具来管理分布式系统的生命周期,确保服务的高可用性...

    【2021年12月升级版】Kubernetes全栈架构师:基于世界500强的k8s实战课程.rar

    5. **自动化运维**:探索自动伸缩(Horizontal Pod Autoscaler, HPA)和垂直伸缩(Vertical Pod Autoscaler, VPA),以及如何利用Kubernetes的自愈机制确保应用高可用性。 6. **监控与日志**:了解如何集成...

    如何将一个大规模并行的Postgres数据库移植到Kubernetes上- 译稿1

    Kubernetes的自动伸缩功能(Horizontal Pod Autoscaler)可以根据CPU和内存利用率,动态调整Pod的数量,以适应不断变化的工作负载。\n\n最后,Greenplum的SQL查询和用户定义的函数(UDF)可以通过容器化的PL/...

Global site tag (gtag.js) - Google Analytics