上一篇简单说了一下使用 kubeadm 安装 k8s。今天说一下 k8s 的一个神奇的功能:HPA (Horizontal Pod Autoscaler)。

HPA 依赖 metrics-server 获取 pod 的指标。所以我们要先安装 metrics-server 插件。

1. metrics-server 安装

1.1 下载 yaml 文件和 image

  1. # 在 k8s master 节点执行
  2. mkdir metrics-server
  3. cd metrics-server
  4. wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
  5.  
  6. docker pull ninejy/metrics-server:v0.3.7
  7. docker tag ninejy/metrics-server:v0.3.7 k8s.gcr.io/metrics-server/metrics-server:v0.3.7

1.2 安装

  1. # 修改 components.yaml 文件,在 args 下面添加以下两行内容,不校验证书,不然会报 x509 错误
  2. - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
  3. - --kubelet-insecure-tls
  4.  
  5. kubectl apply -f components.yaml
  6. kubectl get pod -n kube-system
  7. # 列出的 pod 中有 metrics-server-xxxxxxx,并且是 Running状态,就说明 metrics-server 安装好了

1.3 问题

  此时执行命令 `kubectl top nodes` 应该不会有结果。查看metrics-server pod 的日志,会有找不到主机 k8s-master01,k8s-node01的错误。这是因为主机名、IP的映射关系是我们在 hosts 文件里写的。需要在 coredns 的配置中加上这两个主机名、IP的对应关系记录。

  1. kubectl edit configmap coredns -n kube-system
  2. # 添加以下内容,然后 按键盘 Esc 输入 :wq 保存退出
  3. hosts {
  4. 192.168.0.3 k8s-master01
  5. 192.168.0.6 k8s-node01
  6. fallthrough
  7. }

之后再执行 `kubectl top nodes` 就应该会有类似下图内容了

这样 metrics-server 就算安装好了。

2. 测试 HPA

2.1 deploymet/service/hpa yaml 文件

  1. # cat hpa-cpu.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: deployment-hpa-cpu
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: myapp
  11. template:
  12. metadata:
  13. labels:
  14. app: myapp
  15. spec:
  16. containers:
  17. - name: myapp
  18. image: ninejy/hpacpu:latest
  19. ports:
  20. - containerPort: 8080
  21. resources:
  22. limits:
  23. cpu: 50m
  24. memory: 10Mi
  25. requests:
  26. cpu: 50m
  27. memory: 10Mi
  28. ---
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. name: myapp
  33. namespace: default
  34. spec:
  35. type: ClusterIP
  36. selector:
  37. app: myapp
  38. ports:
  39. - name: http
  40. port: 80
  41. targetPort: 8080
  42. ---
  43. apiVersion: autoscaling/v1
  44. kind: HorizontalPodAutoscaler
  45. metadata:
  46. name: deployment-hpa-cpu
  47. namespace: default
  48. spec:
  49. maxReplicas: 5
  50. minReplicas: 1
  51. scaleTargetRef:
  52. apiVersion: apps/v1
  53. kind: Deployment
  54. name: deployment-hpa-cpu
  55. targetCPUUtilizationPercentage: 80

这里我们限制每个 pod 最多使用一核 cpu 的 50/1000,当 pod 使用 cpu 的百分比大于最大限制的 80% 就会触发 pod 扩容,最多扩展到 5 个 pod.

2.2 创建 deploymet/service/hpa

  1. kubectl apply -f hpa-cpu.yaml

2.3 测试 HPA

  1. # 开三个 k8s-master01 窗口,分别执行下面三条命令
  2.  
  3. watch kubectl get pods
  4.  
  5. watch kubectl top pods
  6.  
  7. ip=$(kubectl get svc | grep myapp | awk '{print $3}')
  8. for i in `seq 1 100000`; do curl $ip?a=$i; done

切换窗口查看,过一会就会有 pod 数量增加,说明 HPA 生效了。停掉 curl 的那条命令,过一会,pod 数量又会恢复到 1 个了。

以上就是 k8s HPA 的基本使用。HPA 也可以使用内存和其他自定义的指标,也可以组合使用。根据这些指标的值和设定的阈值进行 pod 的数量的增减。

更多内容可以参考 k8s 官网:

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

k8s 自动伸缩 pod(HPA)的更多相关文章

  1. Kubernetes Pod水平自动伸缩(HPA)

    HPA简介 HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController.Deployment 和 ReplicaS ...

  2. k8s Pod的自动水平伸缩(HPA)

    我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...

  3. 基于Kubernetes的hpa实现pod实例数量的自动伸缩

    Pod 是在 Kubernetes 体系中,承载用户业务负载的一种资源.Pod 们运行的好坏,是用户们最为关心的事情.在业务流量高峰时,手动快速扩展 Pod 的实例数量,算是玩转 Kubernetes ...

  4. kubernetes之Pod水平自动伸缩(HPA)

    https://k8smeetup.github.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ Horizon ...

  5. K8S(17)二进制的1.15版本部署hpa自动伸缩

    K8S(17)二进制部署的K8S(1.15)部署hpa功能 目录 K8S(17)二进制部署的K8S(1.15)部署hpa功能 零.参考文件: 一.生成metrics-proxy证书 二.修改apise ...

  6. Horizontal Pod Autoscaler(Pod水平自动伸缩)

    Horizontal Pod Autoscaler 根据观察到的CPU利用率(或在支持自定义指标的情况下,根据其他一些应用程序提供的指标)自动伸缩 replication controller, de ...

  7. kubernetes云平台管理实战:HPA水平自动伸缩(十一)

    一.自动伸缩 1.启动 [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu ...

  8. 基于Prometheus,Alermanager实现Kubernetes自动伸缩

    到目前为止Kubernetes对基于cpu使用率的水平pod自动伸缩支持比较良好,但根据自定义metrics的HPA支持并不完善,并且使用起来也不方便. 下面介绍一个基于Prometheus和Aler ...

  9. k8s弹性伸缩概念以及测试用例

    k8s弹性伸缩概念以及测试用例 本文原文出处:https://juejin.im/post/5c82367ff265da2d85330d4f 弹性伸缩式k8s中的一大亮点功能,当负载大的时候,你可以对 ...

随机推荐

  1. hive drop和恢复partition external table

    在hdfs目录:/user/xx/table/test_external 保存 test_external 表数据 先建表,使用列式存储格式 CREATE external TABLE `test_e ...

  2. 【Javac编译异常】javac编译提示jdk中的包找不到的问题error: package jdk.internal.org.objectweb.asm does not exist 和 error: cannot find symbol

    一.复现步骤 1)编写待编译的java类 package f_asm_and_javassist; import jdk.internal.org.objectweb.asm.*; import ja ...

  3. 从原生web组件到框架组件源码(三)

    快乐的时光都是这么短暂,转眼间,web原生组件的知识点已经学完了,这个虽然暂时不一定有用,但是随着时间的积累,一步一个脚印的积累,你会有相应的收获,希望能变得更强,比如两年前我也会想有现成的东西不用, ...

  4. python框架Django简介与安装

    Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...

  5. Django之MTV实战(2)

    目录 1. 回顾知识 1.1 新增工程 1.2 创建新的APP 1.3 注册APP 1.4 编写URL和VIEW 1.5 验证结果如下: 2. 基本概念 2.1 专业术语 2.2 MTV之视图 2.2 ...

  6. .net 实现签名验签

    本人被要求实现.net的签名验签,还是个.net菜鸡,来分享下采坑过程 依然,签名验签使用的证书格式依然是pem,有关使用openssl将.p12和der转pem的命令请转到php实现签名验签 .ne ...

  7. redis的rdb与aof持久化机制

    Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式,一个是类似日志追加的方式 RDB快照持久化 RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘 ...

  8. ERP的权限管理的操作与设计--开源软件诞生24

    赤龙ERP用户与权限管理讲解--第24篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/re ...

  9. php之cms后台文章管理及显示

    public function index(){ C('TOKEN_ON',false);//关闭表单令牌 读取配置 //查询指定id的栏目信息 $id=I('get.id');//类别ID $top ...

  10. 【老孟Flutter】6种极大提升Flutter开发效率的工具包

    老孟导读:本文介绍6种极大提升Flutter开发效率的工具包. [1] 强大的日志软件包 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面 ...