k8s之HPA,命名空间资源限制

一、HPA 的相关知识

        HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。

(1)HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长(默认为30秒),周期性的检测 Pod 的 CPU 使用率。

(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

二、部署 HPA 及运用

2.1 部署 metrics-server

●metrics-server:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl、hpa、scheduler等。

//在所有 Node 节点上传 metrics-server.tar 镜像包到 /opt 目录
cd /opt/
docker load -i metrics-server.tar

//使用 helm install 安装 metrics-server
mkdir /opt/metrics
cd /opt/metricshelm repo remove stablehelm repo add stable https://charts.helm.sh/stable
或
helm repo add stable http://mirror.azure.cn/kubernetes/charts
我使用的第二种helm repo updatevim metrics-server.yaml
args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
image:repository: k8s.gcr.io/metrics-server-amd64tag: v0.3.2//使用 helm install 安装 metrics-server
helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yamlkubectl get pods -n kube-system | grep metrics-server

#部署完毕后,可以通过命令来监视pod的资源占用
kubectl top pods
 
kubectl top nodes

2.2 部署 HPA

//在所有节点上传 hpa-example.tar 镜像文件到 /opt 目录
hpa-example.tar 是谷歌基于 PHP 语言开发的用于测试 HPA 的镜像,其中包含了一些可以运行 CPU 
密集计算任务的代码。cd /opt
docker load -i hpa-example.tardocker images | grep hpa-example

HPA伸缩的测试演示

创建用于测试的 Pod 资源,并设置请求资源为 cpu=200m

vim hpa-pod.yamlapiVersion: apps/v1
kind: Deployment
metadata:labels:run: php-apachename: php-apache
spec:replicas: 1selector:matchLabels:run: php-apachetemplate:metadata:labels:run: php-apachespec:containers:- image: gcr.io/google_containers/hpa-examplename: php-apacheimagePullPolicy: IfNotPresentports:- containerPort: 80resources:requests:cpu: 200m
---
apiVersion: v1
kind: Service
metadata:name: php-apache
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: php-apachekubectl apply -f hpa-pod.yaml

创建HPA控制器,进行资源的限制,伸缩管理

使用 kubectl autoscale 命令创建 HPA 控制器,设置 cpu 负载阈值为请求资源的 50%,指定最少负载节点数量为 1 个,最大负载节点数量为 10 个
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

需要等一会儿,才能获取到指标信息 TARGETS

kubectl get hpa 

创建一个测试客户端容器

kubectl run -it load-generator --image=busybox /bin/sh

//增加负载
# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

打开一个新的窗口,查看负载节点数目

kubectl get hpa -w

以上可以看到经过压测,负载节点数量最大上升到 10 个,并且 cpu 负载也随之下降。

如果 cpu 性能较好导致负载节点上升不到 10 个,可再创建一个测试客户端同时测试:

kubectl run -i --tty load-generator1 --image=busybox /bin/sh
# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

        HPA 扩容的时候,负载节点数量上升速度会比较快;但回收的时候,负载节点数量下降速度会比较慢。
        原因是防止在业务高峰期时因为网络波动等原因的场景下,如果回收策略比较积极的话,K8S集群可能会认为访问流量变小而快速收缩负载节点数量,而仅剩的负载节点又承受不了高负载的压力导致崩溃,从而影响业务。

三、命名空间的资源限制

命名空间资源限制的配置字段:ResourceQuota

kubectl explain ResourceQuota

        Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup。
        默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样, 消耗足够多的 CPU 和内存。
        一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现。requests 为创建 Pod 时初始要分配的资源,limits 为 Pod 最高请求的资源值。

示例:

spec:containers:- image: xxxximagePullPolicy: IfNotPresentname: authports:- containerPort: 8080protocol: TCPresources:limits:            #定义容器可以使用的最大资源量cpu: "2"memory: 1Girequests:          #容器启动时希望保证的最小资源量cpu: 250mmemory: 250Mi

资源限制 - 命名空间

3.1 计算资源配额

apiVersion: v1
kind: ResourceQuota        #使用 ResourceQuota 资源类型
metadata:name: compute-resourcesnamespace: spark-cluster  #指定命令空间
spec:hard:pods: "20"    #设置 Pod 数量最大值requests.cpu: "2"            #允许Pod请求的CPU总量不超过2个单位requests.memory: 1Gi        #允许Pod请求的内存总量不超过1GBlimits.cpu: "4"            #允许Pod的CPU使用上限总和不超过4个单位limits.memory: 2Gi         #允许Pod的内存使用上限总和不超过2GB也就是说为已创建的命名空间sapark-cluster进行计算资源限制。首先限制在该命名空间最大的pod
数量为20个,预留cpu总量为 2 核 ,预留内存总量为 1G,最大cpu总量为 4 核,最大内存总量为 2G。

3.2  配置对象数量配额限制

apiVersion: v1
kind: ResourceQuota
metadata:name: object-countsnamespace: spark-cluster
spec:hard:configmaps: "10"   #设置了最多允许10个ConfigMap对象。ConfigMaps用于存储非机密型的数据persistentvolumeclaims: "4"		#设置 pvc 数量最大值replicationcontrollers: "20"    #设置 rc 数量最大值# RC是Kubernetes 1.6之前的控制器,用于维持指定数量的Pod副本。# 在Kubernetes 1.7版本后,推荐使用Deployment替代secrets: "10"       #设置了最多允许10个Secret对象services: "10"      #设置了最多允许10个Service对象services.loadbalancers: "2"     #设置了最多允许2个LoadBalancer类型的Service

上述为例,该配置是对namespace中所存在的资源对象进行限制。

        如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。
K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM。

这里就需要创建 LimitRange 资源来设置 Pod 或其中的 Container 能够使用资源的最大默认值

apiVersion: v1
kind: LimitRange     #使用 LimitRange 资源类型
metadata:name: mem-limit-rangenamespace: test    #可以给指定的 namespace 增加一个资源限制
spec:limits:- default:         #default 即 limit 的值memory: 512Micpu: 500mdefaultRequest:   #defaultRequest 即 request 的值memory: 256Micpu: 100mtype: Container  #类型支持 Container、Pod、PVC

        这意味着在test命名空间中,如果没有在Pod或容器的定义中显式指定资源请求和限制,那么Kubernetes将自动应用上述的默认值。例如,如果一个Pod没有指定其容器的CPU和内存请求和限制,那么容器的CPU请求将默认为100m,CPU限制为500m,内存请求为256MiB,内存限制为512MiB。

  • LimitRange 关注的是资源的规范和标准化,确保资源请求和限制合理,避免资源浪费和不足。
  • ResourceQuota 关注的是资源的总量控制,确保整个命名空间的资源使用不超过预定的配额,实现资源的合理分配和管理。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

堆栈溢出的攻击 -fno-stack-protector stack smash 检测

在程序返回的一条语句堆栈项目处&#xff0c;用新函数的起始地址覆盖&#xff0c;将会跳转到执行新函数。 现在系统对这个行为做了判断&#xff0c;已经无法实施这类攻击或技巧。 1&#xff0c;测试代码 #include <stdio.h> void cc() {printf("I am cc( )\n"…

小功率无变压器电源设计

采用无变压器电源解决方案为低功率电路提供所需电源通常是有利的。 事实上&#xff0c;如果负载电流只有几十毫安&#xff0c;则可以将输入交流电压转换为直流电压&#xff0c;而无需使用大型、昂贵且笨重的变压器。不带变压器的替代方案也更便宜、更轻并且占地面积更小。无变…

CorelDraw 2024软件安装包下载 丨不限速下载丨亲测好用

​简介&#xff1a; CorelDRAW Graphics Suite 订阅版拥有配备齐全的专业设计工具包&#xff0c;可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值&#xff0c;即时、有保障地获得独家的新功能和内容、…

【Photoshop】PS修改文字内容

Photoshop(PS)修改图片上文字内容&#xff0c;网上教材不少&#xff0c;本人整理实践过的方法&#xff0c;分享给各位。本人实践方法&#xff1a; 内容识别填充&#xff1a;适用于背景色复杂的图片内容修补工具&#xff1a;适用于背景色为纯色的图片 方式一&#xff1a;内容识…

Flink作业执行之 1.DataStream和Transformation

Flink作业执行之 1.DataStream和Transformation 1. 滥觞 在使用Flink完成业务功能之余&#xff0c;有必要了解下我们的任务是如何跑起来的。知其然&#xff0c;知其所以然。 既然重点是学习应用程序如何跑起来&#xff0c;那么应用程序的内容不重要&#xff0c;越简单越好。…

Linux基础命令[29]-chown

文章目录 1. chown 命令说明2. chown 命令语法3. chown 命令示例3.1 修改属主3.2 修改属组3.3 修改属主和属组3.4 修改文件夹所属 4. 总结 1. chown 命令说明 chown&#xff1a;更改文件的用户或用户组&#xff0c;需要 root 用户或 sudo 权限的用户执行该命令。基本信息如下&…

【电路笔记】-共集极放大器

共集极放大器 文章目录 共集极放大器1、概述2、等效电路3、电压增益4、偏置方法5、输入阻抗6、输出阻抗7、电流增益8、示例:共集电极放大器的电压、电流和功率增益9、达林顿对10、总结1、概述 本文介绍另一种用于放大信号的双极晶体管架构,通常称为共集电极放大器 (CCA)。 C…

python如何对list求和

如何在Python中对多个list的对应元素求和&#xff0c;前提是每个list的长度一样。比如&#xff1a;a[1&#xff0c;2&#xff0c;3]&#xff0c;b[2&#xff0c;3&#xff0c;4]&#xff0c;c[3&#xff0c;4&#xff0c;5]&#xff0c;对a&#xff0c;b&#xff0c;c的对应元素…

Java中List流式转换为Map的终极指南

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java编程中&#xff0c;经常需要将一个List对象转换为另一个Map对象。这可能是因为需要根据List中的元素的某些属性来创建一个新的键值对集合。在本文中&#xff0c;我将向您展示如何使用Java 中的流式API轻松地实…

IP地址、子网掩码、网段、网关

前面相同就是在同一个网段 如果子网掩码和网络号相与的结果是一样的&#xff0c;那么他们就在同一个子网 IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?_掩码248可以用几个ip-CSDN博客

uni-app 怎么在tabbar使用阿里图标库

提示&#xff1a;微信小图标不支持使用字体图标的方式&#xff0c;只能下载png 方法一&#xff1a;直接下载png图片 我们首选打开阿里矢量图标库 链接在下方 &#x1f447; iconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

GEO ISP图像调试-PFC(蓝紫边校正)

目录 1、简单介绍 2、调试策略 3、输出结果 1、简单介绍 GEO中中调整图像蓝紫边可分为两步&#xff0c;第一步&#xff1a;调整蓝紫边检测区域&#xff0c;第二步&#xff1a;设置去蓝紫边强度。 2、调试策略 图1 该图像蓝紫边较严重 主要原因是由于蓝紫边检测不准导致的&…

GStreamer 源码编译,在 Clion 下搭建调试环境

前言 最近在学习 GStreamer&#xff0c;官方提供了一些教程&#xff0c;本人希望能够断点调试&#xff0c;以便学习代码逻辑。本文记录如何在 Clion 搭建 GStreamer 源码编译、调试环境 步骤 下载源码 git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.gitCl…

Orange_Pi_AIpro运行蜂鸟RISC-V仿真

Orange_Pi_AIpro运行蜂鸟RISC-V仿真 突发奇想&#xff0c;试一试Orange Pi AIpro上运行蜂鸟RISC-V的仿真。 准备 默认已经有一个Orange Pi AIpro&#xff0c;并且对设备进行一定的初始化配置&#xff0c;可以参考上一篇博文开源硬件初识——Orange Pi AIpro&#xff08;8T&a…

第2章 Rust初体验3/8:使用Result进行错误处理:编译时错误检查增强代码安全性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.3.9 类型的关联函数:简化对象创建和初始化 席双嘉:“那个String::new(),毫无疑问,它确实像C++中的静态成员函数。” 贾克强:“哈哈!是的,两个冒号确实让人联想到一些东西,对吧?” “这其实是Rust中的关联函数(associated function,详…

非线性规划解决工资分配问题

来源&#xff1a;河北工业职业技术大学 安彤彤 彭金杉 张家硕 题目 薪资发放问题 一般公司给职员发放薪金&#xff0c;通常按每月等额发放。某公司即将改进薪金发放方案&#xff0c;允许任职5年以上的职员向公司财务部门申请工资每月可变额度发放&#xff0c;每月工资发放额…

HAL库开发--串口

知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 开发流程 串口功能配置 串口功能开启 串口中断配置 串口参数配置 查询配置结果 发送功能测试 中断接收功能测试 printf配置 DMA收发 配置 DMA发送 DMA接收(方式1) DMA接收(方式2) 总结 前言…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

【漏洞复现】东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司-款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司)&#xff0c;专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS…