在前面的课程中,我们已经可以实现通过手工执行kubectl scale命令实现Pod扩容或缩容,但是这显然不符合Kubernetes的定位目标–自动化、智能化。 Kubernetes期望可以实现通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了Horizontal Pod Autoscaler(HPA)这种控制器。

HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。
接下来,我们来做一个实验

1,安装metrics-server

metrics-server可以用来收集集群中的资源使用情况

安装git
yum install git -y获取metrics-server, 注意使用的版本
git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server修改deployment, 注意修改的是镜像和初始化参数
cd /root/metrics-server/deploy/1.8+/
vim metrics-server-deployment.yaml添加/修改下面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
'''添加后文件部分内容如下spec:hostNetwork: trueserviceAccountName: metrics-servervolumes:# mount in tmp so we can safely use from-scratch images and/or read-only containers- name: tmp-diremptyDir: {}containers:- name: metrics-serverimage: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6imagePullPolicy: Alwaysargs:- --kubelet-insecure-tls- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIPvolumeMounts:- name: tmp-dirmountPath: /tmp
'''安装metrics-server,这里apply /root/metrics-server/deploy/1.8+/ 里所有的配置文件
kubectl apply -f ./# 查看metrics-server 的pod的运行情况
kubectl get pod -n kube-system
metrics-server-6b976979db-2xwbj   1/1     Running   0          90s# 使用kubectl top 资源名   查看资源使用情况,采集信息需要一定时间
kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   83m          4%     1027Mi          59%
node1    25m          1%     671Mi           38%
node2    28m          1%     648Mi           37%   kubectl top pod -n kube-system
NAME                              CPU(cores)   MEMORY(bytes)
coredns-6955765f44-7ptsb          3m           9Mi
coredns-6955765f44-vcwr5          3m           8Mi
etcd-master                       14m          145Mi
metrics-server-6b976979db-dpwrm   1m           11Mi  至此,metrics-server安装完成

2,部署deployment,servie,HPA

deploy的template的spec里,必须设置resources的limits和requests(貌似设置一个就行),
否则 kubectl get hpa -n dev查看当前cpu使用状况时,TARGETS显示unknown/3%

cat >pod-test.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploynamespace: dev
spec:strategy: # 策略type: RollingUpdate  # 滚动更新策略replicas: 1selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1resources: # 资源配额limits:  # 限制资源(上限)cpu: "1" # CPU限制,单位是core数requests: # 请求资源(下限)cpu: "100m"  # CPU限制,单位是core数#如果不设置, kubectl get hpa -n dev的TARGETS显示unknown/3%---apiVersion: v1
kind: Service
metadata:name: nginx-svcnamespace: dev
spec:type: NodePortports:- port: 80             targetPort: 80nodePort: 30000selector:app: nginx-pod    #根据此标签选择器,选择pod进行expose---apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: pc-hpanamespace: dev
spec:minReplicas: 1  #最小pod数量maxReplicas: 10 #最大pod数量targetCPUUtilizationPercentage: 3 # CPU使用率指标scaleTargetRef:   # 指定要控制的nginx信息apiVersion:  apps/v1kind: Deploymentname: nginx-deploy
EOF写入配置文件后apply即可

3,测试

'''
用3个shell分别监控hpa,deploy,pod
'''
kubectl get hpa -n dev -w
kubectl get deploy -n dev -w
kubectl get pod -n dev -w
'''开始测试,用python运行,url里ip和port都是自己设置的'''
import requests
for i in range(10000):requests.get('http://192.168.10.100:30000')
kubectl get hpa -n dev -w
'''
NAME     REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
pc-hpa   Deployment/nginx-deploy   0%/3%     1         10        1          7m32s
pc-hpa   Deployment/nginx-deploy   1%/3%     1         10        1          8m20s
pc-hpa   Deployment/nginx-deploy   54%/3%    1         10        1          9m21s
pc-hpa   Deployment/nginx-deploy   54%/3%    1         10        4          9m36s
pc-hpa   Deployment/nginx-deploy   54%/3%    1         10        8          9m51s
pc-hpa   Deployment/nginx-deploy   54%/3%    1         10        10         10m
pc-hpa   Deployment/nginx-deploy   0%/3%     1         10        10         10m
pc-hpa   Deployment/nginx-deploy   0%/3%     1         10        10         15m
pc-hpa   Deployment/nginx-deploy   0%/3%     1         10        1          15m
'''
kubectl get deploy -n dev -w
'''
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           7m23s
nginx-deploy   1/4     1            1           9m21s
nginx-deploy   1/4     4            1           9m21s
nginx-deploy   2/4     4            2           9m22s
nginx-deploy   3/4     4            3           9m23s
nginx-deploy   4/4     4            4           9m23s
nginx-deploy   4/8     4            4           9m36s
nginx-deploy   4/8     8            4           9m36s
nginx-deploy   5/8     8            5           9m37s
nginx-deploy   6/8     8            6           9m38s
nginx-deploy   7/8     8            7           9m38s
nginx-deploy   8/8     8            8           9m38s
nginx-deploy   8/10    8            8           9m51s
nginx-deploy   8/10    10           8           9m51s
nginx-deploy   9/10    10           9           9m52s
nginx-deploy   10/10   10           10          9m53s
nginx-deploy   10/1    10           10          15m
nginx-deploy   1/1     1            1           15m
'''
kubectl get pod -n dev -w
'''
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-547dd76d58-j8lm5   1/1     Running   0          7m26s
nginx-deploy-547dd76d58-wf5gj   0/1     Pending   0          0s
nginx-deploy-547dd76d58-wf5gj   0/1     Pending   0          0s
nginx-deploy-547dd76d58-zd5xr   0/1     Pending   0          0s
nginx-deploy-547dd76d58-cdmqq   0/1     Pending   0          0s
nginx-deploy-547dd76d58-cdmqq   0/1     Pending   0          0s
nginx-deploy-547dd76d58-zd5xr   0/1     Pending   0          0s
nginx-deploy-547dd76d58-wf5gj   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-zd5xr   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-cdmqq   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-zd5xr   1/1     Running             0          1s
nginx-deploy-547dd76d58-wf5gj   1/1     Running             0          2s
nginx-deploy-547dd76d58-cdmqq   1/1     Running             0          2s
nginx-deploy-547dd76d58-mk5rx   0/1     Pending             0          0s
nginx-deploy-547dd76d58-mk5rx   0/1     Pending             0          0s
nginx-deploy-547dd76d58-99kx6   0/1     Pending             0          0s
nginx-deploy-547dd76d58-fl99x   0/1     Pending             0          0s
nginx-deploy-547dd76d58-99kx6   0/1     Pending             0          0s
nginx-deploy-547dd76d58-mk5rx   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-v5kvk   0/1     Pending             0          0s
nginx-deploy-547dd76d58-fl99x   0/1     Pending             0          0s
nginx-deploy-547dd76d58-v5kvk   0/1     Pending             0          0s
nginx-deploy-547dd76d58-fl99x   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-99kx6   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-v5kvk   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-99kx6   1/1     Running             0          1s
nginx-deploy-547dd76d58-fl99x   1/1     Running             0          2s
nginx-deploy-547dd76d58-mk5rx   1/1     Running             0          2s
nginx-deploy-547dd76d58-v5kvk   1/1     Running             0          2s
nginx-deploy-547dd76d58-zw2l2   0/1     Pending             0          0s
nginx-deploy-547dd76d58-zw2l2   0/1     Pending             0          0s
nginx-deploy-547dd76d58-qjhqg   0/1     Pending             0          0s
nginx-deploy-547dd76d58-qjhqg   0/1     Pending             0          0s
nginx-deploy-547dd76d58-zw2l2   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-qjhqg   0/1     ContainerCreating   0          0s
nginx-deploy-547dd76d58-zw2l2   1/1     Running             0          1s
nginx-deploy-547dd76d58-qjhqg   1/1     Running             0          2s
nginx-deploy-547dd76d58-zd5xr   1/1     Terminating         0          5m49s
******
nginx-deploy-547dd76d58-v5kvk   0/1     Terminating         0          5m45s
nginx-deploy-547dd76d58-cdmqq   0/1     Terminating         0          6m
nginx-deploy-547dd76d58-cdmqq   0/1     Terminating         0          6m
'''

可以发现发送大量请求后,pod数自动增加至最大(10),停止发送后,一定时间后减少到最小(1)

22,Horizontal Pod Autoscaler(HPA),自动扩缩容相关推荐

  1. 8.HPA自动扩缩容

    1 什么是HPA? HPA(Horizontal Pod Autoscaler,水平Pod自动伸缩器)可根据观察到的CPU.内存使用率或自定义度量标准来自动扩展或缩容Pod的数量.HPA不适用于无法缩 ...

  2. 测试Hpa自动扩缩容

    一.Hpa设置 最大pod副本数为5,最小pod副本数为3 平均cpu为10% 二.查看当前pod资源消耗 `kubectl top pod -n test` 三.创建一个service服务,type ...

  3. k8s自定义指标HPA实践(微服务基于自定义指标自动扩缩容的实践)附demo

    先上demo代码仓库 https://github.com/wentjiang/prometheus-HPA-test 自动扩缩容的使用场景 在开发微服务时,我们会有一些请求量突增的场景,举个例子,快 ...

  4. Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler

    Knative Serving 默认情况下,提供了开箱即用的快速.基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA).下面带你体验如何在 Knative 中玩转 Au ...

  5. Kubernetes:HPA 详解-基于 CPU、内存和自定义指标自动扩缩容

    目录 HPA 基本原理 Metrics Server 聚合 API 安装Metrics Server HPA 基于 CPU自动扩缩容 查看 HPA 资源的对象了解工作过程: HPA 基于 内存自动扩缩 ...

  6. K8S集群Pod资源自动扩缩容方案

    K8S集群Pod资源自动扩缩容方案 1.为什么要是有自动扩缩容 在K8S集群中部署的应用程序都是以Pod的形式部署的,我们在部署Pod资源时都会指定Pod资源的副本数,但是这个数量是写死的,平时可能启 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  8. k8s自动扩缩容、健康检查、Qos、资源管理、亲和度、污点与宽容

    环境为centos7.9 安装k8s 1.23.1 一.自动扩缩容 1.安装Metrics Server wget https://github.com/kubernetes-sigs/metrics ...

  9. Knative 驾驭篇:带你 '纵横驰骋' Knative 自动扩缩容实现

    Knative 中提供了自动扩缩容灵活的实现机制,本文从 三横两纵 的维度带你深入了解 KPA 自动扩缩容的实现机制.让你轻松驾驭 Knative 自动扩缩容. 注:本文基于最新 Knative v0 ...

最新文章

  1. 【Sql Server】Database-存储过程
  2. DeepFake疑遭审查
  3. 二叉树的建立和递归遍历
  4. 【NC30】缺失的第一个正整数
  5. minimum在java中的意思_Java Calendar getMinimum()用法及代码示例
  6. 荣耀双十一开门红:斩获多品类销量及销售额冠军
  7. python oct_Python oct()
  8. 大学课程为什么不绕过51单片机直接搞STM32来做比赛
  9. 修改服务器监听端口命令,如何更改prometheus监控系统启动的默认端口号
  10. Java学习(1)——用显式转换显式字符在Unicode表中的位置
  11. 高数————思维导图(上岸必备)(向量代数与几何部分)
  12. 遗传算法(Genetic Algorithm)原理详解和matlab代码解析实现及对应gaot工具箱实现代码
  13. dhcp服务器怎样自动,dhcp服务器设置教程【图文教程】
  14. 安卓手机传感器采集数据并保存数据
  15. 多场景业务实战 --用户评论文本挖掘(写的有点细有点多)
  16. Android Protect-0.重新打包和签名
  17. 课程设计+毕业设计(合集)
  18. 微信小程序实现横向滚动文字
  19. 使用python selenium爬取淘宝商品信息 自动登录淘宝和爬取某一宝贝的主图,属性图和详情图等等
  20. LwIP协议栈之ICMP(Internet Message Protocal)协议

热门文章

  1. java 压缩 tar_Java将文本文件压缩为tar.gz
  2. 人免疫球蛋白IgG冻干粉——Equitech-Bio分离技术纯化
  3. 二度人脉推荐(案例)
  4. Clock Jitter
  5. 如何用晶体管进行计算
  6. The Social Life of Autonomous Cars-自动驾驶汽车与日常生活
  7. GetLastError()返回值列表
  8. 1244 数列有序
  9. Excel如何快速录入数字转为大写金额公式
  10. mac idea 快捷键设置