ResourceQuota

ResourceQuota 是 Kubernetes 中的一个资源配额对象,用于限制命名空间(Namespace)中资源的使用量。ResourceQuota 可以限制命名空间中的 Pod 数量、特定类型资源对象的数量(如 Services、Deployments 等),以及命名空间内所有 Pod 可以使用的计算资源总量(如 CPU、内存等)。

ResourceQuota 的主要作用是在多用户共享 Kubernetes 集群时,确保每个命名空间中的资源使用量不会超过其配额限制,从而避免资源过度消耗和竞争。这对于管理集群资源、确保公平性和防止资源滥用非常有用。

在创建 ResourceQuota 时,管理员需要指定要限制的资源类型(如 CPU、内存、存储等)以及相应的配额值。当用户在命名空间中创建或更新资源时,Kubernetes 的配额系统会跟踪资源使用情况,并确保不超过 ResourceQuota 中定义的限制。如果请求的资源超过了配额限制,相关的 API 请求将会被拒绝,并返回 403 Forbidden 错误。

ResourceQuota 的应用范围是命名空间级别的,每个命名空间可以有一个或多个 ResourceQuota 对象。需要注意的是,ResourceQuota 只限制命名空间中资源的创建和更新操作,对于已经存在的资源对象,修改 ResourceQuota 的配额值不会影响它们的使用。

此外,ResourceQuota 的启用需要依赖于 Kubernetes API 服务器的启动参数 --enable-admission-plugins 中包含 ResourceQuota。在默认情况下,许多 Kubernetes 发行版都会启用这个插件,以确保 ResourceQuota 的功能可用。

总的来说,ResourceQuota 是 Kubernetes 中实现资源配额管理的重要工具,它可以帮助管理员有效地控制和限制命名空间中的资源使用,确保集群的稳定性和公平性。

apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-quota-example
namespace: my-namespace
spec:
hard:
pods: "10" # 命名空间中允许的最大 Pod 数量
services: "5" # 命名空间中允许的最大 Service 数量
replicationcontrollers: "2" # 命名空间中允许的最大 ReplicationController 数量
resourcequotas: "1" # 命名空间中允许的最大 ResourceQuota 数量
secrets: "10" # 命名空间中允许的最大 Secret 数量
persistentvolumeclaims: "4" # 命名空间中允许的最大 PersistentVolumeClaim 数量
services.loadbalancers: "1" # 允许的最大 LoadBalancer 类型 Service 数量
requests.cpu: "10" # 命名空间中所有 Pods 可以请求的 CPU 总量
requests.memory: "10Gi" # 命名空间中所有 Pods 可以请求的内存总量
limits.cpu: "20" # 命名空间中所有 Pods 可以使用的 CPU 总量上限
limits.memory: "20Gi" # 命名空间中所有 Pods 可以使用的内存总量上限

LimitRange

LimitRange 是 Kubernetes 中的一个资源限制策略对象,用于在命名空间内限制资源分配(给多个 Pod 或 Container)。通过 LimitRange,管理员可以实施对每个 Pod 或 Container 的最小和最大资源使用量的限制,以及对每种资源的申请值和限制值的比值的控制。此外,LimitRange 还可以设置命名空间中计算资源的默认申请/限制值,这些默认值会自动注入到多个 Container 中。

LimitRange 的主要作用包括:

  1. 限制资源使用:通过定义最小和最大资源限制,确保 Pod 和 Container 在使用计算资源时不会过度消耗,从而避免对集群中的其他工作负载造成干扰。
  2. 资源配额控制:LimitRange 可以用来实施命名空间级别的资源配额控制,确保命名空间内的资源分配符合管理策略。
  3. 自动注入默认值:管理员可以设置默认的资源申请和限制值,这些默认值会在创建 Pod 时自动注入到 Container 的配置中,从而简化了资源配置的过程。
  4. 提升资源利用率:通过合理的资源限制和默认值设置,LimitRange 有助于提高集群中资源的利用率,避免资源浪费。

LimitRange 的使用在 Kubernetes 1.10 版本及之后的版本中默认启用,并且在许多 Kubernetes 发行版中也是默认启用的。

以下是一个 LimitRange 的 YAML 示例:

apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-example
namespace: my-namespace
spec:
limits:
- type: Pod
max:
cpu: "2"
memory: "2Gi"
min:
cpu: "500m"
memory: "64Mi"
default:
cpu: "1"
memory: "512Mi"
- type: Container
max:
cpu: "1"
memory: "1Gi"
min:
cpu: "200m"
memory: "32Mi"
defaultRequest:
cpu: "500m"
memory: "256Mi"

在这个示例中,我们定义了一个名为 limitrange-example 的 LimitRange 对象,它位于 my-namespace 命名空间中。spec.limits 字段下定义了两个限制规则,一个针对整个 Pod,另一个针对单个 Container。每个规则都包含了最大、最小和默认的资源限制值。

要创建这个 LimitRange 对象,同样可以使用 kubectl 命令:

bash复制代码

kubectl create -f limitrange.yaml

其中,limitrange.yaml 是包含上述 YAML 定义的文件名。

请注意,LimitRange 的名称必须是合法的 DNS 子域名,并且其限制规则应当根据实际需求和集群的硬件配置来合理设置。

QoS

QoS(Quality of Service,服务质量)是Kubernetes中用于管理Pod资源分配和调度的一个重要概念。在Kubernetes中,每个Pod都会被分配一个QoS等级,这个等级决定了Pod的调度优先级和驱逐优先级,以及Pod在不同节点上的资源分配策略。

Kubernetes定义了三种QoS等级:

  1. BestEffort:这是最低级别的QoS,适用于那些不需要保证资源使用的Pod。在这种QoS等级下,Pod中的容器没有指定CPU和内存的requests和limits,因此它们可以使用任何可用的资源,但也可能因为资源不足而被系统驱逐。BestEffort Pod通常用于一些非关键的任务,如系统服务或日志收集器。

    apiVersion: v1
    kind: Pod
    metadata:
    name: best-effort-pod
    spec:
    containers:
    - name: best-effort-container
    image: nginx
  2. Burstable:这种QoS等级适用于那些需要一定量的CPU和内存资源,但也可能需要超过这些资源的Pod。Burstable Pod被分配了一定的CPU和内存资源,但当系统中其他Pod消耗了更多的资源时,它们的资源可用性可能会受到影响。容器能够使用超过所分配的资源量(称为“突发资源”),但实际可用资源量取决于其他Pod和系统资源占用情况。

    apiVersion: v1
    kind: Pod
    metadata:
    name: burstable-pod
    spec:
    containers:
    - name: burstable-container
    image: nginx
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
  3. Guaranteed:这是最高级别的QoS,适用于那些需要保证资源使用的Pod。在这种QoS等级下,Pod里的每个容器都必须有内存/CPU限制和请求,而且值必须相等。Kubernetes会严格限制这些Pod的资源使用,确保它们始终有足够的资源来运行,并且不会被其他Pod或系统资源竞争所影响。

    apiVersion: v1
    kind: Pod
    metadata:
    name: guaranteed-pod
    spec:
    containers:
    - name: guaranteed-container
    image: nginx
    resources:
    requests:
    cpu: 500m
    memory: 500Mi
    limits:
    cpu: 500m
    memory: 500Mi

Pod的QoS等级是根据容器的资源要求和系统中其他Pod的资源使用情况来判断的。容器的资源要求可以通过在容器定义中指定相应的request和limit来定义。Kubernetes会根据这些要求来计算Pod的QoS等级,并据此进行资源分配和调度决策。

k8s资源管理之ResourceQuota、LimitRange和QoS的更多相关文章

  1. k8s资源管理(基础操作)

    1. 基础 本文实操基于k8s 1.22.1 # 可以查看资源分配情况 kubectl describe node # 全局资源情况查看 kubectl api-resources 1.1 apply ...

  2. K8s 资源范围管理对象 LimitRange

    默认情况下如果创建一个 Pod 没有设置 Limits 和 Requests 对其加以限制,那么这个 Pod 可能能够使用 Kubernetes 集群中全部资源, 但是每创建 Pod 资源时都加上这个 ...

  3. k8s 资源管理

    对应到Kubernetes的Pod容器上,就是下面这4个参数:◎ spec.container[].resources.requests.cpu:◎ spec.container[].resource ...

  4. Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, In ...

  5. k8s补充

    k8s补充 容器云发展及主要内容 1.云计算,交付标准(iaas--openstack) 国内:阿里云一华为云(振兴杯)百度云(私有云) 国外:AWS 2.平台即服务(PAAS) 例如:新浪云(号称免 ...

  6. Kubernetes资源与对象简述

    资料 k8s基本对象概念 背景 资源和对象   Kubernetes 中的所有内容都被抽象为"资源",如 Pod.Service.Node 等都是资源."对象" ...

  7. Dapr和Rainbond集成,实现云原生BaaS和模块化微服务开发

    背景 Dapr 是一个开源的分布式应用运行时,帮助开发者构建松耦合的分布式应用程序,具有良好的可扩展性和可维护性.Rainbond 是一款企业级的云原生应用管理平台,提供了丰富的功能和工具,方便开发者 ...

  8. k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)

    Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...

  9. 从零开始入门 K8s | Kubernetes 调度和资源管理

    作者 | 子誉  蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词"入门",即可下载从零入门 K8s 系列文章 PPT. Kubernetes 调 ...

  10. 2.K8S的核心资源管理方法

    目录 1.1陈述式资源管理方法 1.1.1.管理名称空间资源 1.1.2.管理Deployment资源 1.1.3.管理Service资源 1.1.4.kubectl用法总结 1.2.声明式资源管理方 ...

随机推荐

  1. MySQL 之高级命令(精简笔记)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...

  2. python函数:匿名函数,闭包,装饰器

    匿名函数 可以只有一个入参或多个入参,但返回值只能是一个函数 #普通函数 def sum(a,b): return a+b #等价的匿名函数 add = lambda a,b: a+b  闭包 举一个 ...

  3. maven打包报错

    * 系统:macOS* 开发工具:Idea* 问题描述:在idea中执行mvn clean install时报No compiler is provided in this environment. ...

  4. Cpu是如何选择线程的?

    Cpu是如何选择线程的? linux中线程存放格式 linux中线程与进程对应的结构体都是task_struct 唯一不同的点在于线程存放的东西少了点(由于一个进程中的线程们是共享一定数据的那些东西就 ...

  5. Python-统计执行时间

    方法一:datetime.datetime.now() import datetime import time starttime = datetime.datetime.now() print(st ...

  6. SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试

    今天在工作中遇到一个问题,一个Service类中有一个方法,其中使用了 AopContext.currentProxy() 去访问自身的函数,例如 int result = ((OrderServic ...

  7. CF1886

    A 分类讨论. B 二分. C 题意:给定一个字符串 \(s\).记 \(s_i\) 为将 \(s\) 删去 \(i\) 个字符,使得剩余字符串字典序最小得到的字符串.令 \(S=s_0+s_1+\d ...

  8. SSD 表项管理概述(一)——L1、L2、L3

    分类 名称 说明 映射表相关 L1 Table 记录每个4KB用户数据在SSD上的存放物理地址: L2 Table 记录每个sub L1 Table在SSD上的存放物理地址: L3 Table 记录每 ...

  9. 多层PCB的制造工艺流程

    多层PCB的制造工艺流程 多层板制造方法有电镀通孔法以及高密度增层法两种,都是通过不同工艺的组合来实现电路板结构.其中目前采用最多的是电镀通孔法,电镀通孔法经过超过半个世纪的发展与完善,电镀通孔法无论 ...

  10. Python Print 显示颜色

    1.顺序:显示方式,前景颜色,背景颜色 2.顺序非固定,但尽量按默认书写方式 3.也可以在input中输出使用 4.格式: print('\033[显示方式:前景颜色:背景颜色m .......... ...