k8s 资源管理

文章目录

  • ResourceQuota
    • 什么是资源配额
    • 定义一个ResourceQuota
    • ResourceQuota的使用
  • LimitRange
    • LimitRange的用途
    • 示例1:配置默认的requests和limits
    • 示例2:配置requests和limits的范围
  • QoS
    • 什么是服务质量保证
    • 示例1:实现QoS为Guaranteed的Pod
    • 示例2:实现QoS为Burstable的Pod
    • 示例3:实现QoS为BestEffort的Pod

节点故障大部分都是由于资源分配不合理、超额分配引起的,因此需要用某个技术手段保证节点的资源不会过大地超额分配。Kubernetes为我们提供了开箱即用的资源管理,可以通过ResourceQuota和LimitRange的配合防止节点资源超额分配。

ResourceQuota

首先看一下ResourceQuota(资源配额)的使用,资源配额是限制某个命名空间对资源使用的一个总量限制,比如内存、CPU、Pod数量等。

什么是资源配额

在生产环境中,可能会有多个Kubernetes集群,面向开发环境、测试环境、预生产环境和生产环境等。身为Kubernetes管理员,必然知道每个环境的规模有多大、可调度资源有多少,并且知道如何合理地为容器分配内存和CPU,所以一个管理员去管理整个Kubernetes集群时,很少会有资源分配超出集群可调度范围的情况。

在生产环境中,可能会有多个Kubernetes集群,面向开发环境、测试环境、预生产环境和生产环境等。身为Kubernetes管理员,必然知道每个环境的规模有多大、可调度资源有多少,并且知道如何合理地为容器分配内存和CPU,所以一个管理员去管理整个Kubernetes集群时,很少会有资源分配超出集群可调度范围的情况。

为了解决上述问题,Kubernetes引入了ResourceQuota的概念,以方便Kubernetes管理员方便地进行资源分配,比如给A项目组分配16核64GB的资源,并且最多只能部署20个Pod、30个Service等,这样来对Kubernetes的各类资源进行限制。

定义一个ResourceQuota

和其他资源配置方法一样,资源配额也可以通过一个YAML文件进行创建,比如定义一个比较常用的ResourceQuota如下:

apiVersion: v1
kind: ResourceQuota
metadata:name: example-quotanamespace: default
spec:hard:pods: "10"requests.cpu: "4"requests.memory: "10Gi"limits.cpu: "8"limits.memory: "20Gi"

在此配置中:

pods: “10” 限制命名空间中的 Pod 数量最多为 10 个。
requests.cpu: “4” 限制命名空间中所有 Pod 合计的 CPU 请求最多为 4 个 CPU。
requests.memory: “10Gi” 限制命名空间中所有 Pod 合计的内存请求最多为 10 GiB。
limits.cpu: “8” 限制命名空间中所有 Pod 合计的 CPU 使用量上限为 8 个 CPU。
limits.memory: “20Gi” 限制命名空间中所有 Pod 合计的内存使用量上限为 20 GiB。

ResourceQuota的使用

接下来演示ResourceQuota的具体使用方法,首先创建一个用于测试的Namespace:

kubectl create ns quota-example

创建一个测试Demo,比如限制该Namespace的PVC不能超过1个:


apiVersion: v1
kind: ResourceQuota
metadata:name: pvc-quotanamespace: quota-example
spec:hard:persistentvolumeclaims: "1"

创建该ResourceQuota:

     kubectl create -f quota-objects.yaml

查看创建的资源限制状态:

kubectl get quota pvc-quota -n quota-example -o yaml

在这里插入图片描述

可以从status字段的used看出当前资源限制的使用量,并且Namespace只有在创建了ResourceQuota才会启用资源使用的配额,没有创建ResourceQuota的Namespace不限制资源使用。

之后创建一个PVC:

**touch pvc.yaml **

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvcnamespace: quota-example
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: standard
kubectl create -f pvc.yaml -n quota-example

查看当前资源的使用情况:


kubectl get quota pvc-quota -n quota-example -o yaml

再次尝试创建PVC:

touch pvc2.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc2namespace: quota-example
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: standard
kubectl create -f pvc2.yaml -n quota-example

在这里插入图片描述

可以看到此时无法创建PVC,其他资源的限制类似,在此不再演示。

环境清理:

LimitRange

和ResourceQuota不同的是,LimitRange用来配置默认值,也就是一个Pod如果没有配置要用多少内存、CPU,LimitRange会在创建Pod时添加一个默认值。

LimitRange的用途

每个命名空间的最大资源使用量,细心的读者可能会发现,如果创建了一个Pod或Deployment没有指定requests和limits字段,是不是就意味着资源配额对内存和CPU的限制变成了一个摆设?答案是可想而知的,CPU和内存永远不会被限制。还有另一种情况,假如一个Namespace分配了16核、64GB的空间,之后创建一个申请了requests.cpu为16、requests.memory为64GB的容器,那么单个Pod就能把整个Namespace的资源全部占用。

为了防止这类情况发生,Kubernetes又引出了另一个概念:LimitRanger,用于针对没有配置requests和limits的资源设置一个默认值,同时配置单个资源最大的requests和limits,这样就能解决上述问题(注意:LimitRanger不会影响已经创建的资源)​。

示例1:配置默认的requests和limits

可以通过LimitRanger配置默认的requests和limits值,用来解决创建的资源没有配置或配置过小的requests和limits带来的问题,比如创建一个requests.cpu默认为0.5(0.5为半颗CPU,1个CPU等于1000m)​、requests.memory为256MB、limits.cpu为1、limits.memory为512MB的LimitRanger(创建完成后可以通过kubectl get limitrange cpu-mem-limit-range -oyaml查看)​:

touch cpu-mem-limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:name: cpu-mem-limit-rangenamespace: default
spec:limits:- default:cpu: 1memory: 512MidefaultRequest:cpu: 0.5memory: 256Mitype: Container

default: 当 Pod 没有指定资源限制时,为容器设置默认的 CPU 和内存上限。
defaultRequest: 当 Pod 没有指定资源请求时,为容器设置默认的 CPU 和内存请求。
type: 规定该规则适用于容器级别。

应用 LimitRange:
使用 kubectl 命令将 LimitRange 对象应用到 Kubernetes 集群中。kubectl apply -f cpu-mem-limit-range.yaml
验证 LimitRange:
可以使用以下命令查看已经定义的 LimitRange:kubectl get limitrange -n default删除limit rangekubectl delete limitrange cpu-mem-limit-range -n default

定义podtouch nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx
spec:containers:- name: nginx-containerimage: nginx:latestports:- containerPort: 80
kubectl apply -f nginx-pod.yaml
kubectl get pod nginx-pod -o yaml

在这里插入图片描述
可以看到该Pod被设置为LimitRanger的默认配置。

在配置了requestslimits参数时,会以自行配置的为准(如果没有超过LimitRanger的最大、最小限制的话)​。如果配置了limits而没有配置requests,那么requests的默认值将被设置成limits配置的参数,由于该配置和ResourceQuota类似,此处不再演示,可以参考ResourceQuota的步骤进行验证。

示例2:配置requests和limits的范围

上述针对没有设置requestslimits字段的资源添加了默认值,但是并没有限制requestslimits的最大值和最小值,这样同样会给集群带来风险,所以在管理资源分配时,对requestslimits的最大值和最小值也需要进行管控。

touch cpu-min-max-demo-1r.yaml
apiVersion: v1
kind: LimitRange
metadata:name: cpu-min-max-demo-1r
spec:limits:- max:cpu: "800m"memory: "1Gi"min:cpu: "200m"memory: "500Mi"type: Container
kubectl apply -f cpu-mem-limit-range.yaml
验证 LimitRange:
可以使用以下命令查看已经定义的 LimitRange:kubectl get limitrange -n defaultkubectl get limitrange cpu-min-max-demo-1r -o yaml

在这里插入图片描述
假设创建一个内存最大值超过limits限制的Pod:

vim nginx-pod1.yaml
kubectl apply -f nginx-pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-pod
spec:containers:- name: nginximage: nginx:latestresources:limits:memory: "1.5Gi"requests:memory: "800Mi"

在这里插入图片描述

假设创建一个内存最小值小于limits最小值的Pod:

vim nginx-pod2.yaml
kubectl apply -f nginx-pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-pod
spec:containers:- name: nginximage: nginx:latestresources:limits:memory: "1.5Gi"requests:memory: "100Mi"

在这里插入图片描述

QoS

虽然我们进行了资源限制,但是实际使用时依旧会造成节点资源不足,针对资源不足Kubernetes会通过重启或驱逐Pod释放资源,再重启时,难免会造成一些很重要的服务不可用。但实际情况可能是,如果重启或驱逐一些不重要的Pod可能会更好,而这种决策是通过QoS(Quality of Service,服务质量)决定的,所以在生产环境中,QoS是一个非常重要的环节。

什么是服务质量保证

Kubernetes为我们提供了3种级别的服务质量,分别是:

Guaranteed:最高服务质量,当宿主机内存不够时,会先杀死QoS为BestEffort和Burstable的Pod,如果内存还是不够,才会杀死QoS为Guaranteed的Pod,该级别Pod的资源占用量一般比较明确,即requests字段的cpu和memory与limits字段的cpu和memory配置的一致

Burstable:服务质量低于Guaranteed,当宿主机内存不够时,会先杀死QoS为BestEffort的Pod,如果内存还是不够,就会杀死QoS级别为Burstable的Pod,用来保证QoS质量为Guaranteed的Pod,该级别的Pod一般知道最小资源使用量,但是当机器资源充足时,还是想尽可能使用更多的资源,即limits字段的cpu和memory大于requests字段的cpu和memory的配置

BestEffort:尽力而为,当宿主机内存不够时,首先杀死的就是该QoS的Pod,用以保证Burstable和Guaranteed级别的Pod正常运行。

示例1:实现QoS为Guaranteed的Pod

创建一个QoS为Guaranteed的Pod需要满足以下条件:

  1. Pod中的每个容器必须指定limits.memoryrequests.memory,并且两者需要相等。

  2. Pod中的每个容器必须指定limits.cpulimits.memory,并且两者需要相等。

定义一个GuaranteedPod

apiVersion: v1
kind: Pod
metadata:name: guaranteed-pod
spec:containers:- name: app-containerimage: nginxresources:requests:memory: "128Mi"cpu: "500m"limits:memory: "128Mi"cpu: "500m"

在这里插入图片描述

如果容器指定了limits的cpu和memory配置,但是没有指定requests的cpu和memory配置,Kubernetes会自动添加和limits配置相同的requests配置。

示例2:实现QoS为Burstable的Pod

创建一个QoS为Burstable的Pod需要满足以下条件:

1)Pod不符合Guaranteed的配置要求。

2)Pod中至少有一个容器配置了requests.cpu或者requests.memory。

定义一个Burstable的Pod:

apiVersion: v1
kind: Pod
metadata:name: burstable-pod
spec:containers:- name: nginx-container-1image: nginx:latestresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80env:- name: NGINX_PORTvalue: "80"command: [ "sh", "-c", "nginx -g 'daemon off;' -c /etc/nginx/nginx.conf" ]- name: nginx-container-2image: nginx:latestresources:requests:memory: "32Mi"cpu: "100m"ports:- containerPort: 8080env:- name: NGINX_PORTvalue: "8080"command: [ "sh", "-c", "echo \"server { listen 8080; location / { root /usr/share/nginx/html; index index.html index.htm; } }\" > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" ]
kubectl describe pod burstable-pod

在这里插入图片描述

在这个示例中,Pod包含两个容器:

nginx-container-1
设置了资源请求和限制,但它们是不相等的。这个配置允许容器在需要的时候 “bust”,即可以临时使用超过请求的资源限制,但受限于定义的最大限制。

nginx-container-1
只设置了资源请求,没有设置资源限制。这意味着它默认没有硬性资源限制,可以利用集群中额外的可用资源。
这样配置也使得Pod属于Burstable类别。

示例3:实现QoS为BestEffort的Pod

创建一个QoS为Burstable的Pod更为简单,Pod中的所有容器都没有设置requestslimits字段即可,比如创建一个QoSBestEffortPod

apiVersion: v1
kind: Pod
metadata:name: besteffort-pod
spec:containers:- name: app-container-1image: nginx
kubectl describe pod besteffort-pod

在这里插入图片描述

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

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

相关文章

优化安防视频监控的关键体验:视频质量诊断技术如何应用在监控系统中?

随着科技的不断进步,视频监控平台在公安、司法、教育、基础设施等众多领域得到了广泛应用。然而,视频图像的质量直接关系到监控系统的应用效果,是反映监控系统运维效果的重要指标之一。因此,视频监控平台需要配备一系列先进的视频…

Active Neural SLAM 复现记录

Active Neural SLAM 复现记录 创建虚拟环境安装habitat-sim安装habitat-api安装Pytorch配置项目准备数据先搞Gibson场景数据再搞pointnav任务数据创建软链接 测试训练 创建虚拟环境 conda create -n AVSLAM python3.10 conda activate AVSLAM安装habitat-sim git clone https…

存储课程学习笔记8_spdk的安装以及简单demo测试

已经对相关的基础概念有一定的了解,比如裸盘,文件系统,读写相关裸盘,裸盘挂载使用,内核插入文件系统的方式,相关操作io的库或者函数(io_uring, readv,writev, mmap等)&am…

nlohmann::json中有中文时调用dump转string抛出异常的问题

问题描述 Winodows下C开发想使用一个json库,使用的nlohmann::json,但是遇到json中使用中文时,转成string,会抛出异常。 nlohmann::json contentJson;contentJson["chinese"] "哈哈哈";std::string test con…

前端算法(持续更新)

1、最大的钻石 1楼到n楼的每层电梯口都放着一个钻石,钻石大小不一。你从电梯1楼到n楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能最大的钻石? 解题思路: 这是一个经典的动态规划问题&#xff…

让人眼前一亮的软件测试简历,收不到面试邀请算我输

不知道大家的简历是不是都写成下面这样 根据需求文档进行需求分析 熟悉业务流程,明确测试点 根据测试点设计测试用例 参与评审测试用例 提交和回归跟踪缺陷,确认修复完成之后关闭Bug 通过使用Fiddler进行抓包分析并定位前后端Bug 使用简单的SQL语…

git一个项目关联多个远程仓库

一行代码就行: git remote set-url origin [想要关联的远程仓库地址]想要关联哪个就切换哪个 或者不用每次切换,集中管理: Git->Manage Remotes 点击“”,填入Name和想要关联的远程库地址 每次push时执行命令 git push [为…

美团OC感想

OC感想 晚上十点拿到美团意向了 到家事业部。,日常实习没过,暑期实习没过,秋招终于意向了,晚上十点发的,整整激动到一点才睡着,不仅因为这是秋招的第一个意向,更因为这是我一直心心念念想去的地…

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录 [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法: [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问…

五款知名国内外OA系统厂商盘点,优缺点一目了然!

本文将推荐五款知名的OA系统,助力企业选型! OA 系统就像是企业办公的智慧枢纽。它整合了流程审批、文档管理、沟通协作等多种功能,让企业的日常办公更加高效有序。就好比一个多功能的办公工具箱,为企业提供各种实用的工具。 然而…

研1日记9

1.理解conv1d和conv2d a. 1和2处理的数据不同,1维数据和图像 b. 例如x输入形状为(32,19,512)时,卷积公式是针对512的,而19应该变换为参数中指定的输出通道。 2.“SE块”(Squeeze-and-Excitation Block)它可以帮助模…

jenkins工具的介绍和gitlab安装

使用方式 替代手动,自动化拉取、集成、构建、测试;是CI/CD持续集成、持续部署主流开发模式中重要工具;必须组件 jenkins-gitlab,代码公共仓库服务器(至少6G内存);jenkins-server,需…

无人机视角-道路目标检测数据集 航拍 8600张 voc yolo

数据集名称: 无人机视角-道路目标检测数据集 数据集规模: 图像数量:8600张拍摄方式:航拍(使用无人机拍摄)标注格式:支持VOC和YOLO格式 数据集内容: 该数据集由无人机从空中拍摄的…

网络安全架构师

网络安全架构师负责构建全面的安全框架,以保护组织的数字资产免受侵害,确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监Lester Nichols强调,成为网络安全架构师对现代企业至关重要,…

源代码防泄密软件的五大特点

在数据防泄密领域,深信达的SDC沙盒软件以其独特的技术和创新应用,为源代码安全提供了强有力的保护。特别是在源代码防泄密方面,SDC沙盒表现出色,其实现方式主要包括以下几个方面: 1. **内核级虚拟沙盒技术**&#xff1…

Vue | Vue深入浅出——Vue中的render函数详解

1.render函数 在编写vue单文件的大多数情况下,我们都是使用template模板来创建HTML。然而在一些条件判断比较复杂的场景下,使用JavaScript去描绘HTML的生成逻辑会显得更加的简洁直观。 使用Vue官网的例子来简单说明: 如果自己在开发的时候…

部署Apache网站

简易部署自己的apache网站 写在前面:先安装好mysql,再来搭建站点 1.安装php [rootlocalhost ~]# yum install php -y ##安装了php,默认会和apache结合工作2.创建文件编写php网页代码 [rootlocalhost ~]# vim /var/www/html/index.php ##创…

linux入门到实操-1 Linux概述、诞生过程、发行版本,如何安装?

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料,供大家学习交流下载:夸克网盘分享 本文内容为完整笔记的入门篇 概述部分历史内容…

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式:3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制:Maven & SpringBoot 多环境兼容 配置文件分类:4种 整合…

【JUC】15-ThreadLocal线程局部变量

1. ThreadLocal ThreadLocal提供线程局部变量。每个线程在访问ThreadLocal实例的时候都有自己的、独立的变量副本。ThreadLocal实例通常是类中的私有静态字段&#xff0c;使用它的目的是希望将状态(用户ID或事务ID)与线程关联起来。 class Saler {ThreadLocal<Integer> …