Kubernetes Pod水平自动伸缩(HPA)

智数踏浪鹤
• 阅读 146

HPA简介

HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

<span class="colour" style="color:rgb(51, 51, 51)">Pod HAP工作机制示意图Kubernetes Pod水平自动伸缩(HPA)</span>

实际生产中,广泛使用这四类指标:
1、Resource metrics - CPU核内存利用率指标
2、Pod metrics - 例如网络利用率和流量
3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

<span class="colour" style="color:rgb(51, 51, 51)">好了,概念就说这些,想了解更多,请参看官网,现在开始实战。</span>

示例

<span class="colour" style="color:rgb(51, 51, 51)">1、首先我们部署一个nginx,副本数为2,请求cpu资源为200m。同时为了便宜测试,使用NodePort暴露服务。命名空间:hpa</span>

apiVersion: apps/v1 kind: Deployment metadata:   labels:     app: nginx   name: nginx   namespace: hpa spec:   replicas: 2   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - image: nginx         name: nginx         resources:           requests:             cpu: 200m             memory: 100Mi --- apiVersion: v1 kind: Service metadata:   name: nginx   namespace: hpa spec:   type: NodePort   ports:   - port: 80     targetPort: 80   selector:     app: nginx

<span class="colour" style="color:rgb(51, 51, 51)">2、查看部署结果</span>

[root@k8s-node001 HPA]# kubectl  get po -n hpa NAME                     READY   STATUS    RESTARTS   AGE nginx-5c87768685-48b4v   1/1     Running   0          8m38s nginx-5c87768685-kfpkq   1/1     Running   0          8m38s

3、创建HPA
简单说下:这里创建一个HPA,用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。
HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以内。
算法参见

apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata:   name: nginx   namespace: hpa spec:   scaleTargetRef:     apiVersion: apps/v1     kind: Deployment     name: nginx   minReplicas: 1   maxReplicas: 10   metrics:   - type: Resource     resource:       name: cpu       target:         type: Utilization         averageUtilization: 50

<span class="colour" style="color:rgb(51, 51, 51)">4、查看部署结果</span>

[root@k8s-node001 HPA]# kubectl  get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   0%/50%      1                10                 2          50s

5、压测,观察Pod数和HPA变化
执行压测命令

[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/ This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.100.185 (be patient)

<span class="colour" style="color:rgb(51, 51, 51)">观察变化</span>

[root@k8s-node001 HPA]#  kubectl  get hpa -n hpa NAME    REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   303%/50%   1         10        7          12m  [root@k8s-node001 HPA]# kubectl  get po -n hpa NAME                         READY   STATUS    RESTARTS   AGE pod/nginx-5c87768685-6b4sl   1/1     Running   0          85s pod/nginx-5c87768685-99mjb   1/1     Running   0          69s pod/nginx-5c87768685-cls7r   1/1     Running   0          85s pod/nginx-5c87768685-hhdr7   1/1     Running   0          69s pod/nginx-5c87768685-jj744   1/1     Running   0          85s pod/nginx-5c87768685-kfpkq   1/1     Running   0          27m pod/nginx-5c87768685-xb94x   1/1     Running   0          69s

从以上输出可以看出,hpa TARGETS达到了303%,需要扩容。pod数自动扩展到了7个。
继续等待压测结束或者直接打断压测

[root@k8s-node001 ~]# kubectl get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   20%/50%   1         10        7          16m  。。。N分钟后。。。  [root@k8s-node001 ~]# kubectl get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   0%/50%    1         10        7          18m  。。。再过N分钟后。。。  [root@k8s-node001 ~]# kubectl  get po -n hpa NAME                     READY   STATUS    RESTARTS   AGE nginx-5c87768685-jj744   1/1     Running   0          11m

这时,CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1。
这里需要注意下:为什么会将副本数降为1,而不是我们部署时指定的replicas: 2呢?
因为在创建HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。所以HPA在缩减副本数时减到了1。
Tips: 自动扩缩完成副本数量的改变可能需要几分钟的时间。

总结

<span class="colour" style="color:rgb(51, 51, 51)">Kubernetes Pod水平自动伸缩(HPA)</span>

点赞
收藏
评论区
推荐文章
Prodan Labs Prodan Labs
4年前
Kubernetes Ingress — NGINX
在Kubernetes中,Service是一种抽象的概念,它定义了每一组Pod的逻辑集合和访问方式,并提供一个统一的入口,将请求进行负载分发到后端的各个Pod上。Service默认类型是ClusterIP,集群内部的应用服务可以相互访问,但集群外部的应用服务无法访问。为此Kubernetes提供了NodePorts,LoadBalan
Prodan Labs Prodan Labs
4年前
Kubernetes自定义调度器 — 初窥门径
通过上一篇文章对schedulerframework调度框架已经有了大致了解,根据我们的实际生产的一些问题(如计算服务没有被调度到实际CPU最优的节点)和需求,来实现一个简单的基于CPU指标的自定义调度器。自定义调度器通过kubernetes资源指标服务metricsserver来获取各节点的当前的资源情况,并进行打分,然后把Pod调度到分数最高的节
DevOpSec DevOpSec
2年前
kubernetes之pod重调度-descheduler
kubernetes之pod重调度descheduler1\.kubernetessigs/descheduler简介
Prodan Labs Prodan Labs
4年前
Kubernetes Pod 自动扩容 — HPA
Kubernetes增强了应用服务的横向扩容能力,在应对线上应用服务的资源使用率在高峰和低谷的时候,我们需要能够自动去感知应用的负载变化去调整Pod的副本数量,削峰填谷,提高集群的整体资源利用率和应用的服务质量。为此,Kubernetes1.2版本中引入HorizontalPodAutoscaling(HPA),它与kubectlsc
Stella981 Stella981
3年前
K8s创建pod yaml文件详解
kubernetes创建pod的yaml文件,参数说明apiVersion:v1指定api版本,此值必须在kubectlapiversion中kind:Pod指定创建资源的角色/类型metadata:资源的元数据/属性name:web04pod资源的名字,在同一个namespace中必须唯一lab
Stella981 Stella981
3年前
Kubernetes 部署 PHP
实验前提需要你有macOS开发环境,本文以此为例,其他类型的开发环境请自行搭建。需要你对YAML这一专门用来写配置文件的语言有所了解。需要你对Docker有一些基本的了解。需要你对Kubernetes中的Node、Pod、ReplicaSet、Deployment、Service、Ingress、ConfigMap
Wesley13 Wesley13
3年前
K8S基础概念
一、核心概念1、NodeNode作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kubeproxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。Node包含
Stella981 Stella981
3年前
Kubernetes Pod 故障归类与排查方法
Pod概念Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度。Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合。Pod中可以共享网络和存储(可以简单理解为一个逻辑上的虚拟机,但并不是虚拟机)。Pod被创建后用一个UID来唯一标
Stella981 Stella981
3年前
Service Account和RBAC授权
一、介绍ServiceAccount概念的引入是基于这样的使用场景:运行在pod里的进程需要调用KubernetesAPI以及非KubernetesAPI的其它服务。ServiceAccount它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。二、创建ServiceAcco
Stella981 Stella981
3年前
Kubernetes 调度器实现初探
Kubernetes调度器Kubernetes是一个基于容器的分布式调度器,实现了自己的调度模块。在Kubernetes集群中,调度器作为一个独立模块通过pod运行。从几个方面介绍Kubernetes调度器。调度器工作方式Kubernetes中的调度器,是作为单独组件运行,一般运行在Master中,和Master数量保持
Stella981 Stella981
3年前
K8s无状态控制器原理介绍
Pod控制器:  ReplicationController:早期K8s只有这一个控制器,但后来发现让这一个来完成所有任务,太复杂.因此被废弃.  ReplicaSet:它用于帮助用户创建指定数量的Pod副本,并确保Pod副本数量一直满足用户期望的副本数量。        副本数量"多退少补"等机制。【它可认为就是Repli
智数踏浪鹤
智数踏浪鹤
Lv1
酒沽双屐雨,人坐一庭烟。
文章
2
粉丝
0
获赞
0
热门文章