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-quota
  namespace: 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-quota
  namespace: 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-pvc
  namespace: quota-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: 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-pvc2
  namespace: quota-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: 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-range
  namespace: default
spec:
  limits:
  - default:
      cpu: 1
      memory: 512Mi
    defaultRequest:
      cpu: 0.5
      memory: 256Mi
    type: 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 range

kubectl delete limitrange cpu-mem-limit-range -n default

定义podtouch nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - 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 default

kubectl 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: nginx
    image: nginx:latest
    resources:
      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: nginx
    image: nginx:latest
    resources:
      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-container
    image: nginx
    resources:
      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-1
    image: nginx:latest
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
    - containerPort: 80
    env:
    - name: NGINX_PORT
      value: "80"
    command: [ "sh", "-c", "nginx -g 'daemon off;' -c /etc/nginx/nginx.conf" ]
  - name: nginx-container-2
    image: nginx:latest
    resources:
      requests:
        memory: "32Mi"
        cpu: "100m"
    ports:
    - containerPort: 8080
    env:
    - name: NGINX_PORT
      value: "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-1
    image: nginx
kubectl describe pod besteffort-pod

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git的快速合并fast-forward merge详解

文章目录 1. 什么是快进合并?2. 快进合并的前提条件3. 快进合并的工作原理3.1 示例场景:3.2 使用命令:3.3 快进合并的视觉效果: 4. 快进合并的优点5. 快进合并的缺点6. 快进合并 vs 非快进合并6.1 非快进合并:6.2 非快…

splice用法

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Google推出Data Commons解决AI“幻觉”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

使用LDAP登录GitLab

使用LDAP登录GitLab gitlab.rb 配置如下 gitlab_rails[ldap_enabled] true #gitlab_rails[prevent_ldap_sign_in] false###! **remember to close this block with EOS below** gitlab_rails[ldap_servers] YAML.load <<-EOSmain:label: LDAPhost: 172.16.10.180port:…

C++ | Leetcode C++题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; class Solution {vector<int> &nums; public:Solution(vector<int> &nums) : nums(nums) {}int pick(int target) {int ans;for (int i 0, cnt 0; i < nums.size(); i) {if (nums[i] target) {cnt; // 第 cnt 次…

c++中的继承和多态

目录 Linux中的管道通信 ​编辑派生类的默认成员函数 继承 派生类的构造 隐藏 如何设计一个不能被继承的类 菱形继承 virtual virtual是如何解决的 内存对象模型 继承和组合 继承 组合 多态 概念 多态的构成条件 虚函数的重写 Linux中的管道通信 派生类的默认成…

ESKF学习笔记

参考资料 https://zhuanlan.zhihu.com/p/441182819 惯性导航(三)-基于流型的ESKF及代码实现_eskf和ekf-CSDN博客 用ESKF实现IMU/GNSS组合导航&#xff08;学习记录&#xff09;_eskf imu-CSDN博客 0.ESKF与KF的区别以及总体流程 0.1卡尔曼滤波过程 卡尔曼滤波的流程按照1…

unity安装配置和vs2022联动教程

目录 1.选择vs2022配置 2.安装unity 2.1安装unity hub 2.2注册个人账号 2.3安装编辑器 2.4修改为简体中文 2.5添加许可证 2.6安装位置修改 3.项目的创建 3.1如何创建 3.2如何选择 3.3配置语言 3.4去哪里找语言包 4.unity编辑器窗口的介绍 4.1游戏的运行和停止 4…

Leetcode面试经典150题-162.寻找峰值

解法都在代码里&#xff0c;不懂就留言或者私信 想清楚的话会特别简单&#xff0c;你可能想不到这是个二分。。。 class Solution {/**本题题目规定我们只能用O(logN)的时间复杂度来解题&#xff0c;这显然就是让二分嘛而题目给的数组本身是无需&#xff0c;怎么二分呢其实我…

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;它被设计用来提供一对多的消息分发和应用之间的通讯&#xff0c;尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构&…

5.安卓逆向-java面向对象

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;4.安卓逆向-常用数据结构java语言中的集合 之前的内容写了java语言常用的数据结构&#xff08…

海外云服务器安装 Redis 6.2.x (Ubuntu 18.04 记录篇三)

本文已首发于 秋码记录 通过前两篇的实践&#xff0c;我们已然在海外云服务器/VPS安装了JDK和MariaDB数据库&#xff0c;一个能够运行Java项目的海外云服务器/VPS算是告一段落了。 然而&#xff0c;在这请求量与日俱增的情况下&#xff0c;MariaDB数据库显然是在超负债的工作…

Linux shell编程学习笔记80:gzip命令——让文件瘦身

0 引言 在 Linux shell编程学习笔记76&#xff1a;tar命令——快照 & 备份&#xff08;上&#xff09;-CSDN博客 Linux shell编程学习笔记77&#xff1a;tar命令——快照 & 备份&#xff08;下&#xff09;_linux 系统快照-CSDN博客 Linux shell编程学习笔记78&am…

10万人服务器配置如何选择?10w并发量配置架构

10万并发量的应用如何选择阿里云服务器配置&#xff1f;首先要选择云服务器ECS实例规格&#xff0c;因为是10万并发量需要配置负载均衡&#xff0c;而且还要使用缓存技术&#xff0c;阿里云服务器网aliyunfuwuqi.com从阿里云官网整理的关于阿里云10万并发量服务器配置和案例分享…

哈工大“计算机设计与实践”(cpu)处理器实验设计报告

哈工大“计算机设计与实践”&#xff08;cpu&#xff09;处理器实验设计报告 【哈工大“计算机设计与实践”&#xff08;cpu&#xff09;处理器实验设计报告】 在计算机科学领域&#xff0c;CPU&#xff08;中央处理器&#xff09;是计算机系统的核心部件&#xff0c;负责执行指…

【我的 PWN 学习手札】Fastbin Double Free

前言 Fastbin的Double Free实际上还是利用其特性产生UAF的效果&#xff0c;使得可以进行Fastbin Attack 一、Double Free double free&#xff0c;顾名思义&#xff0c;free两次。对于fastbin这种单链表的组织结构&#xff0c;会形成这样一个效果&#xff1a; 如果我们mallo…

如何下载各个版本的tomcat-比如tomcat9

1&#xff0c;找到tomcat官网https://tomcat.apache.org/ Apache Tomcat - Welcome! 找到tomcat9&#xff0c;或者archives 1.1&#xff0c;找到对应版本 1.2&#xff0c;找到小版本 1.3&#xff0c;找到bin 2&#xff0c;Index of /dist/tomcat/tomcat-9/v9.0.39/bin 2.1&a…

【知识图谱】3.Protege下载安装

一、Protege 1.相关介绍 Protg软件是斯坦福大学医学院生物信息研究中心基于Java语言开发的本体编辑和知识获取软件&#xff0c;或者说是本体开发工具&#xff0c;也是基于知识的编辑器&#xff0c;属于开放源代码软件。 这个软件主要用于语义网中本体的构建&#xff0c;是语义…

烂番茄96%高分恐怖片来袭,吓到连呼吸都小心

今年的恐怖片市场中&#xff0c;出人意料地杀出了一匹黑马&#xff0c;一部名叫《咒物寻凶》的爱尔兰小成本电影在大牌影片扑街的背景下异军突起&#xff0c;成为不少恐怖片爱好者口中的惊喜之作。这部由达米安麦卡锡执导的电影虽然制作成本有限&#xff0c;却凭借独特的民俗恐…

9天也能养成ins账号!超详细操作指南

Instagram&#xff0c;作为全球最受欢迎的社交媒体平台之一&#xff0c;为跨境电商卖家们提供了一个展示产品、吸引潜在客户的绝佳舞台。然而&#xff0c;受限于ins的规则&#xff0c;要想在这个平台上进行产品的宣传并非易事。 这就是为什么我们需要精心培养一个ins账号&#…