k8s中实现pod自动扩缩容

一、k8s应用自动扩缩容概述
1)背景:
在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试对服务压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作)。

2)扩缩容分类
对象分类
• node扩缩容
• 在使用 kubernetes 集群经常问到的一个问题是,我应该保持多大的节点规模来满足应用需求呢?cluster-autoscaler 的出现解决了这个问题, 可以通过 cluster-autoscaler 实现节点级别的动态添加与删除,动态调整容器资源池,应对峰值流量。

• pod层面
• 我们一般会使用 Deployment 中的 replicas 参数,设置多个副本集来保证服务的高可用,但是这是一个固定的值,比如我们设置 10 个副本,就会启 10 个 pod 同时 running 来提供服务。如果这个服务平时流量很少的时候,也是 10 个 pod 同时在 running,而流量突然暴增时,有可能出现 10 个 pod 不够用的情况。针对这种情况怎么办?就需要自动扩缩容。

按方式分类
• 手动模式
通过 kubectl scale 命令,这样需要每次去手工操作一次,而且不确定什么时候业务请求量就很大了,所以如果不能做到自动化的去扩缩容的话,这也是一个很麻烦的事情。

• 自动模式
kubernetes HPA(Horizontal Pod Autoscaling):根据监控指标(cpu 使用率、磁盘、自定义的等)自动扩容或缩容服务中的pod数量,当业务需求增加时,系统将无缝地自动增加适量 pod 容器,提高系统稳定性。

kubernetes KPA(Knative Pod Autoscaler):基于请求数对 Pod 自动扩缩容,KPA 的主要限制在于它不支持基于 CPU 的自动扩缩容。

kubernetes VPA(Vertical Pod Autoscaler):基于 Pod 的资源使用情况自动设置 pod 的 CPU 和内存的 requests,从而让集群将 Pod 调度到有足够资源的最佳节点上。

二、如何实现自动扩缩容
HPA运作方式
• 整体逻辑:K8s 的 HPA controller 已经实现了一套简单的自动扩缩容逻辑,默认情况下,每 15s 检测一次指标,只要检测到了配置 HPA 的目标值,则会计算出预期的工作负载的副本数,再进行扩缩容操作。同时,为了避免过于频繁的扩缩容,默认在 5min 内没有重新扩缩容的情况下,才会触发扩缩容。

• 缺陷:HPA 本身的算法相对比较保守,可能并不适用于很多场景。例如,一个快速的流量突发场景,如果正处在 5min 内的 HPA 稳定期,这个时候根据 HPA 的策略,会导致无法扩容。

• pod数量计算方式:通过现有 pods 的 CPU 使用率的平均值(计算方式是最近的 pod 使用量(最近一分钟的平均值,从 metrics-server 中获得)除以设定的每个 Pod 的 CPU 使用率限额)跟目标使用率进行比较,并且在扩容时,还要遵循预先设定的副本数限制:MinReplicas <= Replicas <= MaxReplicas。计算扩容后 Pod 的个数:sum(最近一分钟内某个 Pod 的 CPU 使用率的平均值)/CPU 使用上限的整数+1

三、安装 Metrics Server

# 官方仓库地址:https://github.com/kubernetes-sigs/metrics-server
$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.0/components.yaml
在部署之前,修改 components.yaml 的镜像地址为:
hostNetwork: true  # 使用hostNetwork模式
containers:
- name: metrics-serverimage: cnych/metrics-server:v0.4.0kubectl apply -f components.yaml
kubectl get pods -n kube-system -l k8s-app=metrics-server

问题处理:
如果出现pod的状态一直在重启,要看下日志报错
在这里插入图片描述在这里插入图片描述
E0102 12:55:08.341168 1 server.go:132] unable to fully scrape metrics: [unable to fully scrape metrics from node master1: unable to fetch metrics from node master1: Get “https://192.168.100.15:10250/stats/summary?only_cpu_and_memory=true”: x509: cannot validate certificate for 192.168.100.15 because it doesn’t contain any IP SANs, unable to fully scrape metrics from node node-1: unable to fetch metrics from node node-1: Get “https://192.168.100.16:10250/stats/summary?only_cpu_and_memory=true”: x509: cannot validate certificate for 192.168.100.16 because it doesn’t contain any IP SANs, unable to fully scrape metrics from node node-2: unable to fetch metrics from node node-2: Get “https://192.168.100.17:10250/stats/summary?only_cpu_and_memory=true”: x509: cannot validate certificate for 192.168.100.17 because it doesn’t contain any IP SANs]

修复方式:
在如下位置添加:- --kubelet-insecure-tls
在这里插入图片描述
检查:
在这里插入图片描述指标获取
K8S 从 1.8 版本开始,各节点CPU、内存等资源的 metrics 信息可以通过 Metrics API 来获取,用户可以直接获取这些 metrics 信息(例如通过执行 kubect top 命令),HPA 使用这些 metics 信息来实现动态伸缩。

[root@master1 ha]# kubectl top nodes
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master1   419m         20%    1465Mi          39%
node-1    251m         12%    811Mi           22%
node-2    235m         11%    813Mi           22%

四、实践
1)使用 Deployment 来创建一个 Nginx Pod,然后利用 HPA 来进行自动扩缩容。资源清单如下所示:(hpa-demo.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:name: hpa-demo
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80resources:requests:memory: 50Micpu: 50m
#执行yaml启动
kubectl apply -f hpa-demo.yaml
#查看pod
kubectl get pods -l app=nginx

2)创建一个 HPA 资源对象

#此命令创建了一个关联资源 hpa-demo 的 HPA,最小的 Pod 副本数为1,最大为10。HPA 会根据设定的 cpu 使用率(10%)动态的增加或者减少 Pod 数量。 
kubectl autoscale deployment hpa-demo --cpu-percent=10 --min=1 --max=10
#查看hpa状态
[root@master1 ha]# kubectl get hpa
NAME       REFERENCE             TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   <unknown>/10%   1         10        0          10s
[root@master1 ha]#
[root@master1 ha]# kubectl get hpa
NAME       REFERENCE             TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   0%/10%    1         10        1          20s

五、测试验证

#使用busybox进行压测
[root@master1 ha]# kubectl run -it --image busybox test-hpa --restart=Never --rm /bin/sh
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://10.244.137.87; done
#观察hpa值变化:
kubectl get hpa --watch

在这里插入图片描述

#观察pod的变化
kubectl get pods -l app=nginx --watch

在这里插入图片描述

流量太大时候就会出现不能及时扩容的场景,这也就是缺点的地方

在这里插入图片描述

当cpu恢复后pod的数量也自动缩容,实现了自动扩缩容
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LiveGBS流媒体平台GB/T28181功能-国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选

LiveGBS功能国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选 1、国标级联2、只看已选3、只看未选4、搭建GB28181视频直播平台 1、国标级联 LiveGBS可以作为下级平台&#xff0c;级联到第三方国标平台&#xff0c;详见&#xff1a; LiveGBS国标GB/T28181流…

SpringBoot整合Elasticsearch报错

本文来记录一下SpringBoot整合Elasticsearch报错 文章目录 报错如下报错原因es7.15.2版本下载 报错如下 报错如下 2024-01-02 15:09:10.349 ERROR 134936 --- [nio-8088-exec-6] o.a.c.c.C.[.[.[/]. [dispatcherServlet] : Servlet.service() for servlet [dispatcherServle…

小红书、抖音、视频号下载工具:随心管理个人作品集 | 开源日报 No.134

karanpratapsingh/system-design Stars: 20.6k License: NOASSERTION 这个项目是关于系统设计的。它提供了有关系统设计的课程内容&#xff0c;包括 IP、OSI 模型、TCP 和 UDP 等主题。该项目的核心优势和特点如下&#xff1a; 提供全面而高效的系统架构定义。从基础设施到数…

SM2——适用于前后端(java+vue)公用的SM2国密加解密传输

目录 一、SM2国密加解密算法1.1、pom文件引入依赖包1.2、SM2加解密工具类1.3、测试类 一、SM2国密加解密算法 1.1、pom文件引入依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>…

element的select遇到的下拉名称过长的问题修复

问题描述&#xff1a;如果下拉框的数据名称过长怎么解决 解决办法&#xff1a;在select下加类名 :popper-append-to-body“false” popper-class“my-select” 不要忽略一点&#xff1a;如果改样式的话因为用的饿了么组件&#xff0c;有的样式避免找来找去&#xff0c;可以直接…

自动驾驶TPM技术杂谈 ———— ODDODC

文章目录 介绍研究现状主流相关定义国标定义SAE定义WP29定义 ODD主流构建框架NHTSA ODD构建框架SAE AVSC ODD构建框架PEGASUS 6层模型BSI ODD构建框架 设计运行条件的原则ODC 的设计原则ODC 元素的制定原则ODC 的使用原则 设计运行条件元素ODD 元素驾乘人员状态4车辆状态 ODC 描…

基于ssm的在线点歌系统的设计与实现+vue论文

摘 要 使用旧方法对在线点歌系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在在线点歌系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的在线点歌系…

Spring高手之路-Spring Bean、Java Bean和对象的区别与联系

目录 什么是Spring Bean 什么是Java Bean 什么是对象 Spring Bean与Java Bean与对象的联系与区别 联系 区别 什么是Spring Bean 在Spring官方文档中对Bean的解释如下&#xff1a; In Spring, the objects that form the backbone of your application and that are manage…

C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课

关于二进制图片的读取和BLOB插入一共包含五步 第一步&#xff1a;初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步&#xff1a;预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步&#xff1a;绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…

【华为机试】2023年真题B卷(python)-靠谱的车

一、题目 题目描述&#xff1a; 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其…

thinkphp6入门(14)-- 多关联模型查询

背景&#xff1a; 有3个数据表&#xff0c;一个User表&#xff0c;一个Cloth表&#xff0c;一个Shoe表。 Cloth表和Shoe表分别和User表通过user_id关联。 thinkphp 6中如何通过模型查询所有用户&#xff0c;其中包括每个用户的cloth和shoe。 多关联模型查询&#xff1a; 1.…

邮件群发称呼怎么写?写群发邮件开头技巧?

如何写外贸邮件群发称呼&#xff1f;外贸群发邮件开头怎么称呼&#xff1f; 邮件群发已成为企业、个人和组织之间沟通的重要手段。而一个恰当的称呼&#xff0c;不仅能够展现出礼貌和尊重&#xff0c;还能够拉近彼此的距离。那么&#xff0c;如何写好邮件群发的称呼呢&#xf…