【k8s资源调度-HPA(自动扩缩容)】

2024-02-25 17:12

本文主要是介绍【k8s资源调度-HPA(自动扩缩容)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、HPA可以做什么?

  • 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。
  • 通常用于Deployment,不适用于无法扩/缩容的对象,如DaemonSet。
  • 控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改)查询metrics的资源使用情况

2、cpu、内存指标监控

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

2.1 创建一个deployment的配置文件

apiVersion: apps/v1  # deployment api版本
kind: Deployment    # 资源类型为 Deployment
metadata:  # 原信息labels:  # 标签app: nginx-deploy  # 具体的标签信息:app=nginx-deploy   key: value 配置形式name: nginx-deploy   # deployment的名字namespace: default   # 所在的命名空间
spec:replicas: 1   # 期望副本数revisionHistoryLimit: 10   # 进行滚动更新后,保留的历史版本数量selector:  # 选择器,用于找到匹配的RSmatchLabels:  # 按照标签匹配app: nginx-deploy   # 匹配的标签strategy:   #更新策略rollingUpdate:  # 滚动更新配置maxSurge: 25%  # 滚动更新时,更新的个数最多超过多少个期望副本数,或者比例maxUnavailable: 25%  # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate  # 更新类型,采用滚动更新template:   # pod 模板metadata:  # pod模板的元信息labels:   # pod模板的标签app: nginx-deploy   # pod模板的标签信息spec:      # pod 期望信息containers:    # pod 的容器信息- image: nginx:1.20    # 镜像信息imagePullPolicy: IfNotPresent   # 镜像拉取策略name: nginx        # 容器名字restartPolicy: Always   # pod的重启策略terminationGracePeriodSeconds: 30   # pod的过期时间

2.2 创建这个deployment资源

[root@k8s-master ~]# kubectl create -f nginx-deploy.yaml
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get deployments.apps  nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           15s
[root@k8s-master ~]# kubectl get po nginx-deploy-86b7d8c46d-7xwkw
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-86b7d8c46d-7xwkw   1/1     Running   0          29s

2.3 更新配置文件

刚才的配置文件中不包含resources.requests.cpu和resouces.limits.cpu

在这里插入图片描述

2.4 替换deployment

[root@k8s-master ~]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx-deploy replaced

2.5 执行hpa命令

kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5

[root@k8s-master ~]# kubectl autoscale deploy nginx-deploy  --cpu-percent=20  --min=2  --max=5
horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled# 本来我们的replace副本是1个的,现在又帮我们创建了一个
[root@k8s-master ~]# kubectl get deployments.apps  nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           15m

2.6 开启指标服务

2.6.1 下载开启指标的yaml配置文件

[root@k8s-master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

2.6.2 修改镜像地址为国内的地址

[root@k8s-master ~]# sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g'  metrics-server-components.yaml[root@k8s-master ~]# grep image metrics-server-components.yamlimage: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.0imagePullPolicy: IfNotPresent

2.6.3 修改metrics-server-components.yaml配置

修改容器的ts配置,不验证ts,在containers的args参数中增加 --kubelet-insecure-tls 参数

2.6.4 安装这个指标插件

[root@k8s-master ~]# kubectl apply  -f metrics-server-components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

2.6.5 查看这个pod的资源

[root@k8s-master ~]# kubectl get po --all-namespaces  | grep metrics
kube-system    metrics-server-7bb86dcf48-hfpb5      1/1     Running   0              99s

2.7 通过kubectl top pod 监控 融资所占用的资源

[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  3m           57Mi
nginx-deploy-fdd948cf4-fgxjv   0m           1Mi
nginx-deploy-fdd948cf4-r8ktj   0m           1Mi

2.8 测试自动扩缩容

由于刚才创建的deploy资源还未包含service,所以需要创建一个service

2.8.1 创建一个service

# service配置文件如下
apiVersion: v1
kind: Service
metadata:name: nginx-svclabels:app: nginx
spec:selector:app: nginx-deployports:- port: 80targetPort: 80name: webtype: NodePort
[root@k8s-master ~]# kubectl create -f nginx-svc.yml
service/nginx-svc created
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        5d
nginx-svc    NodePort        <none>        80:31231/TCP   6s
[root@k8s-master ~]# curl 10.10.10.100:31231
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

2.8.1 进行压测

  • 方法:通过给service发送http请求,实现压测,看我们的hpa是否可以自动扩容
2.8.1.1 在node1上执行请求

在这里插入图片描述

2.8.1.2 在node2上执行请求

在这里插入图片描述

2.8.1.3 在master上查看hpa的状态
[root@k8s-master ~]# kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   52%/20%   2         5         3          120m
2.8.1.4 在master上查看pod的状态

我们的hpa设置的副本数量是5个,这时可以看到副本由2个变为了5个副本。可以自动扩容

[root@k8s-master ~]# kubectl  top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  5m           57Mi
fluentd-hhtls                  7m           57Mi
nginx-deploy-fdd948cf4-fgxjv   39m          2Mi
nginx-deploy-fdd948cf4-r8ktj   38m          2Mi
nginx-deploy-fdd948cf4-td2vn   41m          2Mi
nginx-deploy-fdd948cf4-xckj5   37m          2Mi
nginx-deploy-fdd948cf4-zpvhc   37m          2Mi
2.8.1.5 取消掉两台node节点上的http请求,查看hpa状态

两台node节点的负载取消后,hpa的targets也下降下来,但是replicas的副本数量是5,不是立马就缩减为2的。这个需要一段时间后可以减少为2。

[root@k8s-master ~]#  kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   0%/20%    2         5         5          127m
2.8.1.6 查看pod的状态

两台node节点的负载取消后,pod的负载也降下来了。

[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  2m           57Mi
nginx-deploy-fdd948cf4-fgxjv   0m           2Mi
nginx-deploy-fdd948cf4-r8ktj   0m           2Mi
nginx-deploy-fdd948cf4-td2vn   0m           2Mi
nginx-deploy-fdd948cf4-xckj5   0m           2Mi
nginx-deploy-fdd948cf4-zpvhc   0m           2Mi

过一段时间后,发现pod的数量减少为了2

[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  2m           57Mi
nginx-deploy-fdd948cf4-r8ktj   0m           2Mi
nginx-deploy-fdd948cf4-td2vn   0m           2Mi
2.8.1.7 查看hpa的描述信息

在这里插入图片描述

3、自定义指标(metrics)

  • 控制管理器开启 -horiztal-pod-autoscaler-use-rest-clients
  • 控制管理器的-apiserver指向API Server Aggregator
  • 在API Server Aggregatore中注册自定义的metrics API

这篇关于【k8s资源调度-HPA(自动扩缩容)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746145

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略