当前位置: 首页 > news >正文

Kubernetes入门 十、HPA 自动扩/缩容

目录

  • 概述
  • 安装metrics-server
  • 使用HPA

概述

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

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

通常用于 Deployment,不适用于无法扩/缩容的对象,如 DaemonSet

在这里插入图片描述

特点:

  • 控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
  • 支持三种metrics类型
    • 预定义metrics(比如Pod的CPU)以利用率的方式计算
    • 自定义的Pod metrics,以原始值(raw value)的方式计算
    • 自定义的object metrics
  • 支持两种metrics查询方式:Heapster和自定义的REST API
  • 支持多metrics

安装metrics-server

metrics-server是用来监控k8s资源指标的组件,需要额外安装。

  1. 下载 metrics-server 组件配置文件:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
  1. 修改镜像地址为国内的地址
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
  1. 修改容器的 tls 配置,不验证 tls

在 containers 的 args 参数中增加 --kubelet-insecure-tls 参数

  1. 安装组件
kubectl apply -f metrics-server-components.yaml

查看下安装是否成功:

kubectl get po --all-namespaces | grep metrics
# 结果如下
kube-system   metrics-server-7c6df44c98-fmm62          1/1     Running   0              65s

成功安装到了kube-system 下。

使用HPA

实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpuresources.requests.memory 才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容。

新建nginx-hpa.yaml,添加资源配置,文件如下:

apiVersion: apps/v1  # deployment api 版本
kind: Deployment  # 资源类型为deployment
metadata:  # 元信息labels:  # 标签app: nginx-hpaname: nginx-hpa # deployment的名字namespace: default  # 所在命名空间
spec:replicas: 3  # 期望副本数revisionHistoryLimit: 10  # 进行滚动更新后,保留的历史版本数selector:  # 选择器,用于找到匹配的RS,管理指定标签的RsmatchLabels:  # 按照标签匹配app: nginx-hpa  # 匹配的标签strategy:  # 更新策略rollingUpdate:  # 滚动更新配置maxSurge: 25%  # 进行滚动更新时,更新的个数超过期望副本数的比例maxUnavailable: 25%  # 进行滚动更新时,最大不可用更新比例,也就是更新不成功最多能有多少个type: RollingUpdate  # 更新策略采用滚动更新template:  # pod模板metadata:  # pod的元信息labels:  # pod的标签app: nginx-hpaspec:  # pod的描述信息containers: # pod的描述信息- image: nginx:1.7.9   # pod使用镜像imagePullPolicy: IfNotPresent   # 镜像拉取策略name: nginx  # 容器名称resources:limits:cpu: 200mmemory: 128Mirequests:cpu: 100mmemory: 128MirestartPolicy: Always  # 重启策略terminationGracePeriodSeconds: 30  # 容器删除等待时间

部署一下:

kubectl apply -f nginx-hpa.yaml
# deployment.apps/nginx-hpa created

查看下po:

kubectl get po
# 3个pod如下
NAME                         READY   STATUS    RESTARTS   AGE
nginx-hpa-5465c4859b-85jtv   1/1     Running   0          41s
nginx-hpa-5465c4859b-crlr7   1/1     Running   0          41s
nginx-hpa-5465c4859b-k7h64   1/1     Running   0          41s

接着可以使用top命令查看资源使用情况:

kubectl top po
# 3个pod的cpu和MEMORY使用情况如下
NAME                         CPU(cores)   MEMORY(bytes)
nginx-hpa-5465c4859b-85jtv   0m           7Mi
nginx-hpa-5465c4859b-crlr7   0m           8Mi
nginx-hpa-5465c4859b-k7h64   0m           14Mi

然后需要创建出一个HPA才能实现自动扩容缩容。

使用如下命令创建一个HPA:

kubectl autoscale deploy nginx-hpa --cpu-percent=20 --min=2 --max=5
# --cpu-percent=20即cpu使用率超过20%进行扩容
# 最少有2个副本,最多扩容到5个
# 注意:如果初始副本数少于2个,那么一旦HPA部署完成,就会把pod扩容到2个

查看HPA:

kubectl get hpa
# 结果如下
NAME        REFERENCE              TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx-hpa   <unknown>/20%   2         5         0          19s

可以看下TARGETS,前面unknown表示还没有占用,后面的20% 标识目标是20%就扩容。

可以通过一定手段,是cpu使用率达到20% ,这样就会自动扩容,这里不在演示。

http://www.lryc.cn/news/147290.html

相关文章:

  • Django报错:SystemCheckError: System check identified some issues解决办法
  • JavaScript设计模式(一)——构造器模式、原型模式、类模式
  • python 读文件,跳过有问题的那行
  • Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421
  • Leetcode 最后一个单词的长度
  • css ,less和sass的区别[简洁易懂
  • 有了ChatGPT的帮助,开发者的生产力会提高10-100倍
  • win10+QT5.15+cryptopp562 完整配置开发
  • 多线程学习之多线程的案例
  • iTOP-RK3588开发板Android12 设置系统默认不休眠
  • java系统问题定位思路
  • redis jedis 单元测试 报错集锦 汇总 junit
  • AMEYA360:兆易创新获得ISO 26262 ASIL D流程认证, 汽车功能安全管理体系再上新台阶
  • MySQL binlog的几种日志录入格式以及区别
  • C# 案例题
  • 拒绝摆烂!C语言练习打卡第七天
  • 【动态规划】状态压缩dp
  • Java eight 解读流(Stream)、文件(File)、IO和异常处理的使用方法
  • 胜券汇:行业持续轮动 缺乏主线下关注反转预期的方向
  • java+ssm+mysql农场信息管理系统
  • 【App出海成功案例】 | NetMarvel 帮助广告主ARPU增长45%,ECPM增长50%,付费率涨幅30%
  • CSDN每日一练 |『鬼画符门莲台争夺战』『等差数列』『 路灯亮度』2023-08-31
  • 自编码器AE全方位探析:构建、训练、推理与多平台部署
  • SpringBoot - Google EventBus、AsyncEventBus
  • Tauri打包windows应用配置中文界面
  • 深度丨Serverless + AIGC,一场围绕加速创新的升维布局
  • flask日志
  • 新能源汽车动力总成系统及技术
  • 在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速
  • 模拟实现应用层协议