kubernetes云平台管理实战:HPA水平自动伸缩(十一)
一、自动伸缩
1、启动
- [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu-percent=80
- deployment "nginx-deployment" autoscaled
2、查看创建
- [root@k8s-master ~]# kubectl get all
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- deploy/nginx-deployment 2 2 2 2 13h
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 17s
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
- svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
- NAME DESIRED CURRENT READY AGE
- rs/nginx-deployment-2950479891 0 0 0 13h
- rs/nginx-deployment-3113009173 2 2 2 13h
- NAME READY STATUS RESTARTS AGE
- po/nginx-deployment-3113009173-h5plc 1/1 Running 0 17s
- po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h
3、修改副本数为1
- [root@k8s-master ~]# kubectl edit deployment nginx-deployment
- 修改为1
- replicas: 1
- deployment "nginx-deployment" edited
- [root@k8s-master ~]# kubectl get all
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- deploy/nginx-deployment 1 1 1 1 13h
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
- svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
- NAME DESIRED CURRENT READY AGE
- rs/nginx-deployment-2950479891 0 0 0 13h
- rs/nginx-deployment-3113009173 1 1 1 13h
- NAME READY STATUS RESTARTS AGE
- po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h
二、hpa伸缩
1、编辑horizontalpodautoscaler 文件
- [root@k8s-master ~]# kubectl get horizontalpodautoscaler
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 1m
- # Please edit the object below. Lines beginning with a '#' will be ignored,
- # and an empty file will abort the edit. If an error occurs while saving this file will be
- # reopened with the relevant failures.
- #
- apiVersion: autoscaling/v1
- kind: HorizontalPodAutoscaler
- metadata:
- creationTimestamp: 2019-01-22T01:00:02Z
- name: nginx-deployment
- namespace: default
- resourceVersion: "41194"
- selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx-deployment
- uid: 0c897472-1de1-11e9-9773-000c292bd9e1
- spec:
- maxReplicas: 8
- minReplicas: 2
- scaleTargetRef:
- apiVersion: extensions/v1beta1
- kind: Deployment
- name: nginx-deployment
- targetCPUUtilizationPercentage: 80
- status:
- currentCPUUtilizationPercentage: 0
- currentReplicas: 2
- desiredReplicas: 2
- lastScaleTime: 2019-01-22T01:00:02Z
2、修改副本为1
- [root@k8s-master ~]# kubectl edit deployment nginx-deployment
- replicas: 1
- deployment "nginx-deployment" edited
- [root@k8s-master ~]# kubectl get all
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- deploy/nginx-deployment 2 2 2 2 13h
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 6m
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
- svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
- NAME DESIRED CURRENT READY AGE
- rs/nginx-deployment-2950479891 0 0 0 13h
- rs/nginx-deployment-3113009173 2 2 2 13h
- NAME READY STATUS RESTARTS AGE
- po/nginx-deployment-3113009173-9hlq1 1/1 Running 0 2s
- po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h
明明修改为1,怎么还有2个?是因为hpa如下配置
- spec:
- maxReplicas: 8
- minReplicas: 2
3、修改副本数为5
- [root@k8s-master ~]# kubectl edit hpa nginx-deployment
- 修改:
- spec:
- maxReplicas: 8
- minReplicas: 5
- horizontalpodautoscaler "nginx-deployment" edited
- [root@k8s-master ~]# kubectl get all
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- deploy/nginx-deployment 5 5 5 2 13h
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 5 8 8m
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
- svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
- NAME DESIRED CURRENT READY AGE
- rs/nginx-deployment-2950479891 0 0 0 13h
- rs/nginx-deployment-3113009173 5 5 2 13h
- NAME READY STATUS RESTARTS AGE
- po/nginx-deployment-3113009173-97l9c 0/1 ContainerCreating 0 2s
- po/nginx-deployment-3113009173-9hlq1 1/1 Running 0 2m
- po/nginx-deployment-3113009173-qq4h8 0/1 ContainerCreating 0 2s
- po/nginx-deployment-3113009173-sfp8z 0/1 ContainerCreating 0 2s
- po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h
看到自动伸缩的过程了吧!
三、HAP-deployment-rs-rc-pod调用原理
1、什么是hpa
Horizontal Pod Autoscaling可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持replication controller、deployment和replica set)。
- 控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
- 支持三种metrics类型
- 预定义metrics(比如Pod的CPU)以利用率的方式计算
- 自定义的Pod metrics,以原始值(raw value)的方式计算
- 自定义的object metrics
- 支持两种metrics查询方式:Heapster和自定义的REST API
- 支持多metrics
客户端;
通过kubectl创建一个horizontalPodAutoscaler对象,并存储到etcd中
服务端:
api server:负责接受创建hpa对象,然后存入etcd
hpa controler和其他的controler类似,每30s同步一次,将已经创建的hpa进行一次管理(从heapster获取监控数据,查看是否需要scale, controler的store中就保存着从始至终创建出来的hpa,当做一个缓存),watch hpa有变化也会运行。从heapster中获取scale数据,和hpa对比,计算cup利用率等信息,然后重新调整scale。根据hpa.Spec.ScaleTargetRef.Kind(例如Deployment,然后deployment控制器在调整pod数量),调整其值,发送到apiserver存储到etcd,然后更新hpa到etcd.
2、示例
- # 创建pod和service
- $ kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
- service "php-apache" created
- deployment "php-apache" created
- # 创建autoscaler
- $ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
- deployment "php-apache" autoscaled
- $ kubectl get hpa
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- php-apache Deployment/php-apache/scale 50% 0% 1 10 18s
- # 增加负载
- $ kubectl run -i --tty load-generator --image=busybox /bin/sh
- Hit enter for command prompt
- $ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
- # 过一会就可以看到负载升高了
- $ kubectl get hpa
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- php-apache Deployment/php-apache/scale 50% 305% 1 10 3m
- # autoscaler将这个deployment扩展为7个pod
- $ kubectl get deployment php-apache
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- php-apache 7 7 7 7 19m
- # 删除刚才创建的负载增加pod后会发现负载降低,并且pod数量也自动降回1个
- $ kubectl get hpa
- NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
- php-apache Deployment/php-apache/scale 50% 0% 1 10 11m
- $ kubectl get deployment php-apache
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- php-apache 1 1 1 1 27m
3、关系原理图
4、小结
1、首先最底层的资源永远都是pod
2、比pod高级一点的资源叫rc副本控制器
3、在pod上面有一个高级的rs
4、那谁来管理rs呢?是deployment
5、HPA自动管理deployment,deployment设置为1,HPA最低设置为3,deployment这就会被自动设计为3个
kubernetes云平台管理实战:HPA水平自动伸缩(十一)的更多相关文章
- kubernetes云平台管理实战: 自动加载到负载均衡(七)
一.如何实现外界能访问 外界访问不了 1.启动svc [root@k8s-master ~]# cat myweb-svc.yaml apiVersion: v1 kind: Service meta ...
- kubernetes云平台管理实战:deployment通过标签管理pod(十)
一.kubectl run命令拓展 1.RC创建 [root@k8s-master ~]# kubectl run web --generator=run/v1 --image=10.0.128.0: ...
- kubernetes云平台管理实战: 故障自愈实战(四)
一.创建实验文件 [root@k8s-master ~]# cat myweb-rc.yml apiVersion: v1 kind: ReplicationController metadata: ...
- kubernetes云平台管理实战: 集群部署(一)
一.环境规划 1.架构拓扑图 2.主机规划 3.软件版本 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.4.1 ...
- kubernetes云平台管理实战:如何创建deployment更好(九)
一.文件创建带--record 1.文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions/v1beta1 kind: ...
- kubernetes云平台管理实战: 滚动升级秒级回滚(六)
一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...
- kubernetes云平台管理实战: 高级资源deployment-滚动升级(八)
一.通过文件创建deployment 1.创建deployment文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions ...
- kubernetes云平台管理实战: 最小的资源pod(二)
一.pod初体验 1.编辑k8s_pod.yml文件 [root@k8s-master ~]# cat k8s_pod.yml apiVersion: v1 kind: Pod metadata: n ...
- kubernetes云平台管理实战: 服务发现和负载均衡(五)
一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT ...
随机推荐
- Zabbix常见触发器表达式
Zabbix trigger是zabbix 进行告警通知的设定条件 ,当监控获取的值触发了设定的条件时,会按照触发器的设定,执行相应的action 操作 .在zabbix中为了比较方便的设定各种条件, ...
- MySQL服务器的安装和配置,MySQL Workbench 8.0.12安装,MySQL的基本使用
一 MySQL服务器的安装和配置 二 MySQL Workbench 8.0.12安装 三 MySQL的基本使用 一MySQL服务器的安装和配置 MySQL是目前最为流行的开放源码的数据库,是完全网络 ...
- Tomcat与Nginx服务器的配合使用及各自的区别
Nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器.适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat ,django什么的),Tomcat更多用来做做一个应用容器,让 ...
- ES6 快速入门
ES6 初识 ES6 是 ECMAScript 6.0 的简写,即 JavaScript 语言的下一代标准,已经在 2015年6月正式发布了,它的目标是让JS能够方便的开发企业级大型应用程序,因此,E ...
- Python总结(一)
从大学开始,就对python有了兴趣,毕业设计就是用python做的一个新闻爬取和关键字提取的程序.然而,毕业之后由于一直没有从事python相关的开发,所以就一直没有再使用,一直停留在偶尔看一些资料 ...
- android 实现点击edittext的“小眼睛”切换明密文
android 实现点击edittext的“小眼睛”切换明密文 版权声明:本文为博主原创文章,未经博主允许不得转载. 很多时候,我们为了用户的隐私安全,需要在密码输入的时候,显示密文.为了更 ...
- 【Topcoder 1879】Scheduling
题意:给一个\(dag\),每一个点有一个访问时间. 现在可以同时访问两个点,但当连向这个点的所有点都被访问完成后才可以访问这个点. 问最短访问时间. 思路:一眼贪心.可惜是错的. 第二眼暴搜.就这么 ...
- Lightoj 1128 - Greatest Parent
Gate 倍增模板,在一个严格小根堆中,给定$x,y$,求$x$的祖先中$≥y$的最高点. 注意清零 #include<cstdio> #include<iostream> # ...
- 拜托!面试请不要再问我Spring Cloud底层原理
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- Python--day04(流程控制)
day03主要内容回顾 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的 ...