一、自动伸缩

1、启动

  1. [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu-percent=80
  2. deployment "nginx-deployment" autoscaled

2、查看创建

  1. [root@k8s-master ~]# kubectl get all
  2. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  3. deploy/nginx-deployment 2 2 2 2 13h
  4.  
  5. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  6. hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 17s
  7.  
  8. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
  10. svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
  11.  
  12. NAME DESIRED CURRENT READY AGE
  13. rs/nginx-deployment-2950479891 0 0 0 13h
  14. rs/nginx-deployment-3113009173 2 2 2 13h
  15.  
  16. NAME READY STATUS RESTARTS AGE
  17. po/nginx-deployment-3113009173-h5plc 1/1 Running 0 17s
  18. po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h

3、修改副本数为1

  1. [root@k8s-master ~]# kubectl edit deployment nginx-deployment
  2. 修改为1
  3. replicas: 1
  4. deployment "nginx-deployment" edited
  5. [root@k8s-master ~]# kubectl get all
  6. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  7. deploy/nginx-deployment 1 1 1 1 13h
  8.  
  9. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  10. svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
  11. svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
  12.  
  13. NAME DESIRED CURRENT READY AGE
  14. rs/nginx-deployment-2950479891 0 0 0 13h
  15. rs/nginx-deployment-3113009173 1 1 1 13h
  16.  
  17. NAME READY STATUS RESTARTS AGE
  18. po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h

二、hpa伸缩

1、编辑horizontalpodautoscaler 文件

  1. [root@k8s-master ~]# kubectl get horizontalpodautoscaler
  2. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  3. nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 1m
  4.  
  5. # Please edit the object below. Lines beginning with a '#' will be ignored,
  6. # and an empty file will abort the edit. If an error occurs while saving this file will be
  7. # reopened with the relevant failures.
  8. #
  9. apiVersion: autoscaling/v1
  10. kind: HorizontalPodAutoscaler
  11. metadata:
  12. creationTimestamp: 2019-01-22T01:00:02Z
  13. name: nginx-deployment
  14. namespace: default
  15. resourceVersion: "41194"
  16. selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx-deployment
  17. uid: 0c897472-1de1-11e9-9773-000c292bd9e1
  18. spec:
  19. maxReplicas: 8
  20. minReplicas: 2
  21. scaleTargetRef:
  22. apiVersion: extensions/v1beta1
  23. kind: Deployment
  24. name: nginx-deployment
  25. targetCPUUtilizationPercentage: 80
  26. status:
  27. currentCPUUtilizationPercentage: 0
  28. currentReplicas: 2
  29. desiredReplicas: 2
  30. lastScaleTime: 2019-01-22T01:00:02Z

2、修改副本为1

  1. [root@k8s-master ~]# kubectl edit deployment nginx-deployment
  2. replicas: 1
  3. deployment "nginx-deployment" edited
  4. [root@k8s-master ~]# kubectl get all
  5. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  6. deploy/nginx-deployment 2 2 2 2 13h
  7.  
  8. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  9. hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 2 8 6m
  10.  
  11. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  12. svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
  13. svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
  14.  
  15. NAME DESIRED CURRENT READY AGE
  16. rs/nginx-deployment-2950479891 0 0 0 13h
  17. rs/nginx-deployment-3113009173 2 2 2 13h
  18.  
  19. NAME READY STATUS RESTARTS AGE
  20. po/nginx-deployment-3113009173-9hlq1 1/1 Running 0 2s
  21. po/nginx-deployment-3113009173-vckhg 1/1 Running 1 13h

明明修改为1,怎么还有2个?是因为hpa如下配置

  1. spec:
  2. maxReplicas: 8
  3. minReplicas: 2

3、修改副本数为5

  1. [root@k8s-master ~]# kubectl edit hpa nginx-deployment
  2. 修改:
  3. spec:
  4. maxReplicas: 8
  5. minReplicas: 5
  6. horizontalpodautoscaler "nginx-deployment" edited
  7. [root@k8s-master ~]# kubectl get all
  8. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  9. deploy/nginx-deployment 5 5 5 2 13h
  10.  
  11. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  12. hpa/nginx-deployment Deployment/nginx-deployment 80% 0% 5 8 8m
  13.  
  14. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  15. svc/kubernetes 10.254.0.1 <none> 443/TCP 2d
  16. svc/nginx 10.254.145.15 <nodes> 80:32000/TCP 1d
  17.  
  18. NAME DESIRED CURRENT READY AGE
  19. rs/nginx-deployment-2950479891 0 0 0 13h
  20. rs/nginx-deployment-3113009173 5 5 2 13h
  21.  
  22. NAME READY STATUS RESTARTS AGE
  23. po/nginx-deployment-3113009173-97l9c 0/1 ContainerCreating 0 2s
  24. po/nginx-deployment-3113009173-9hlq1 1/1 Running 0 2m
  25. po/nginx-deployment-3113009173-qq4h8 0/1 ContainerCreating 0 2s
  26. po/nginx-deployment-3113009173-sfp8z 0/1 ContainerCreating 0 2s
  27. 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、示例

  1. # 创建pod和service
  2. $ kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
  3. service "php-apache" created
  4. deployment "php-apache" created
  5.  
  6. # 创建autoscaler
  7. $ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
  8. deployment "php-apache" autoscaled
  9. $ kubectl get hpa
  10. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  11. php-apache Deployment/php-apache/scale 50% 0% 1 10 18s
  12.  
  13. # 增加负载
  14. $ kubectl run -i --tty load-generator --image=busybox /bin/sh
  15. Hit enter for command prompt
  16. $ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
  17.  
  18. # 过一会就可以看到负载升高了
  19. $ kubectl get hpa
  20. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  21. php-apache Deployment/php-apache/scale 50% 305% 1 10 3m
  22.  
  23. # autoscaler将这个deployment扩展为7个pod
  24. $ kubectl get deployment php-apache
  25. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  26. php-apache 7 7 7 7 19m
  27.  
  28. # 删除刚才创建的负载增加pod后会发现负载降低,并且pod数量也自动降回1个
  29. $ kubectl get hpa
  30. NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
  31. php-apache Deployment/php-apache/scale 50% 0% 1 10 11m
  32.  
  33. $ kubectl get deployment php-apache
  34. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  35. 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水平自动伸缩(十一)的更多相关文章

  1. kubernetes云平台管理实战: 自动加载到负载均衡(七)

    一.如何实现外界能访问 外界访问不了 1.启动svc [root@k8s-master ~]# cat myweb-svc.yaml apiVersion: v1 kind: Service meta ...

  2. kubernetes云平台管理实战:deployment通过标签管理pod(十)

    一.kubectl run命令拓展 1.RC创建 [root@k8s-master ~]# kubectl run web --generator=run/v1 --image=10.0.128.0: ...

  3. kubernetes云平台管理实战: 故障自愈实战(四)

    一.创建实验文件 [root@k8s-master ~]# cat myweb-rc.yml apiVersion: v1 kind: ReplicationController metadata: ...

  4. kubernetes云平台管理实战: 集群部署(一)

    一.环境规划 1.架构拓扑图 2.主机规划 3.软件版本 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.4.1 ...

  5. kubernetes云平台管理实战:如何创建deployment更好(九)

    一.文件创建带--record 1.文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions/v1beta1 kind: ...

  6. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  7. kubernetes云平台管理实战: 高级资源deployment-滚动升级(八)

    一.通过文件创建deployment 1.创建deployment文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions ...

  8. kubernetes云平台管理实战: 最小的资源pod(二)

    一.pod初体验 1.编辑k8s_pod.yml文件 [root@k8s-master ~]# cat k8s_pod.yml apiVersion: v1 kind: Pod metadata: n ...

  9. kubernetes云平台管理实战: 服务发现和负载均衡(五)

    一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT ...

随机推荐

  1. Zabbix常见触发器表达式

    Zabbix trigger是zabbix 进行告警通知的设定条件 ,当监控获取的值触发了设定的条件时,会按照触发器的设定,执行相应的action 操作 .在zabbix中为了比较方便的设定各种条件, ...

  2. MySQL服务器的安装和配置,MySQL Workbench 8.0.12安装,MySQL的基本使用

    一 MySQL服务器的安装和配置 二 MySQL Workbench 8.0.12安装 三 MySQL的基本使用 一MySQL服务器的安装和配置 MySQL是目前最为流行的开放源码的数据库,是完全网络 ...

  3. Tomcat与Nginx服务器的配合使用及各自的区别

    Nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器.适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat ,django什么的),Tomcat更多用来做做一个应用容器,让 ...

  4. ES6 快速入门

    ES6 初识 ES6 是 ECMAScript 6.0 的简写,即 JavaScript 语言的下一代标准,已经在 2015年6月正式发布了,它的目标是让JS能够方便的开发企业级大型应用程序,因此,E ...

  5. Python总结(一)

    从大学开始,就对python有了兴趣,毕业设计就是用python做的一个新闻爬取和关键字提取的程序.然而,毕业之后由于一直没有从事python相关的开发,所以就一直没有再使用,一直停留在偶尔看一些资料 ...

  6. android 实现点击edittext的“小眼睛”切换明密文

    android 实现点击edittext的“小眼睛”切换明密文    版权声明:本文为博主原创文章,未经博主允许不得转载.   很多时候,我们为了用户的隐私安全,需要在密码输入的时候,显示密文.为了更 ...

  7. 【Topcoder 1879】Scheduling

    题意:给一个\(dag\),每一个点有一个访问时间. 现在可以同时访问两个点,但当连向这个点的所有点都被访问完成后才可以访问这个点. 问最短访问时间. 思路:一眼贪心.可惜是错的. 第二眼暴搜.就这么 ...

  8. Lightoj 1128 - Greatest Parent

    Gate 倍增模板,在一个严格小根堆中,给定$x,y$,求$x$的祖先中$≥y$的最高点. 注意清零 #include<cstdio> #include<iostream> # ...

  9. 拜托!面试请不要再问我Spring Cloud底层原理

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

  10. Python--day04(流程控制)

    day03主要内容回顾 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的 ...