22,Horizontal Pod Autoscaler(HPA),自动扩缩容
在前面的课程中,我们已经可以实现通过手工执行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),自动扩缩容相关推荐
- 8.HPA自动扩缩容
1 什么是HPA? HPA(Horizontal Pod Autoscaler,水平Pod自动伸缩器)可根据观察到的CPU.内存使用率或自定义度量标准来自动扩展或缩容Pod的数量.HPA不适用于无法缩 ...
- 测试Hpa自动扩缩容
一.Hpa设置 最大pod副本数为5,最小pod副本数为3 平均cpu为10% 二.查看当前pod资源消耗 `kubectl top pod -n test` 三.创建一个service服务,type ...
- k8s自定义指标HPA实践(微服务基于自定义指标自动扩缩容的实践)附demo
先上demo代码仓库 https://github.com/wentjiang/prometheus-HPA-test 自动扩缩容的使用场景 在开发微服务时,我们会有一些请求量突增的场景,举个例子,快 ...
- Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默认情况下,提供了开箱即用的快速.基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA).下面带你体验如何在 Knative 中玩转 Au ...
- Kubernetes:HPA 详解-基于 CPU、内存和自定义指标自动扩缩容
目录 HPA 基本原理 Metrics Server 聚合 API 安装Metrics Server HPA 基于 CPU自动扩缩容 查看 HPA 资源的对象了解工作过程: HPA 基于 内存自动扩缩 ...
- K8S集群Pod资源自动扩缩容方案
K8S集群Pod资源自动扩缩容方案 1.为什么要是有自动扩缩容 在K8S集群中部署的应用程序都是以Pod的形式部署的,我们在部署Pod资源时都会指定Pod资源的副本数,但是这个数量是写死的,平时可能启 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- k8s自动扩缩容、健康检查、Qos、资源管理、亲和度、污点与宽容
环境为centos7.9 安装k8s 1.23.1 一.自动扩缩容 1.安装Metrics Server wget https://github.com/kubernetes-sigs/metrics ...
- Knative 驾驭篇:带你 '纵横驰骋' Knative 自动扩缩容实现
Knative 中提供了自动扩缩容灵活的实现机制,本文从 三横两纵 的维度带你深入了解 KPA 自动扩缩容的实现机制.让你轻松驾驭 Knative 自动扩缩容. 注:本文基于最新 Knative v0 ...
最新文章
- 【Sql Server】Database-存储过程
- DeepFake疑遭审查
- 二叉树的建立和递归遍历
- 【NC30】缺失的第一个正整数
- minimum在java中的意思_Java Calendar getMinimum()用法及代码示例
- 荣耀双十一开门红:斩获多品类销量及销售额冠军
- python oct_Python oct()
- 大学课程为什么不绕过51单片机直接搞STM32来做比赛
- 修改服务器监听端口命令,如何更改prometheus监控系统启动的默认端口号
- Java学习(1)——用显式转换显式字符在Unicode表中的位置
- 高数————思维导图(上岸必备)(向量代数与几何部分)
- 遗传算法(Genetic Algorithm)原理详解和matlab代码解析实现及对应gaot工具箱实现代码
- dhcp服务器怎样自动,dhcp服务器设置教程【图文教程】
- 安卓手机传感器采集数据并保存数据
- 多场景业务实战 --用户评论文本挖掘(写的有点细有点多)
- Android Protect-0.重新打包和签名
- 课程设计+毕业设计(合集)
- 微信小程序实现横向滚动文字
- 使用python selenium爬取淘宝商品信息 自动登录淘宝和爬取某一宝贝的主图,属性图和详情图等等
- LwIP协议栈之ICMP(Internet Message Protocal)协议