k8s资源管理之ResourceQuota、LimitRange和QoS
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 的主要作用包括:
- 限制资源使用:通过定义最小和最大资源限制,确保 Pod 和 Container 在使用计算资源时不会过度消耗,从而避免对集群中的其他工作负载造成干扰。
- 资源配额控制:LimitRange 可以用来实施命名空间级别的资源配额控制,确保命名空间内的资源分配符合管理策略。
- 自动注入默认值:管理员可以设置默认的资源申请和限制值,这些默认值会在创建 Pod 时自动注入到 Container 的配置中,从而简化了资源配置的过程。
- 提升资源利用率:通过合理的资源限制和默认值设置,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等级:
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
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
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的更多相关文章
- k8s资源管理(基础操作)
1. 基础 本文实操基于k8s 1.22.1 # 可以查看资源分配情况 kubectl describe node # 全局资源情况查看 kubectl api-resources 1.1 apply ...
- K8s 资源范围管理对象 LimitRange
默认情况下如果创建一个 Pod 没有设置 Limits 和 Requests 对其加以限制,那么这个 Pod 可能能够使用 Kubernetes 集群中全部资源, 但是每创建 Pod 资源时都加上这个 ...
- k8s 资源管理
对应到Kubernetes的Pod容器上,就是下面这4个参数:◎ spec.container[].resources.requests.cpu:◎ spec.container[].resource ...
- Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange
前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, In ...
- k8s补充
k8s补充 容器云发展及主要内容 1.云计算,交付标准(iaas--openstack) 国内:阿里云一华为云(振兴杯)百度云(私有云) 国外:AWS 2.平台即服务(PAAS) 例如:新浪云(号称免 ...
- Kubernetes资源与对象简述
资料 k8s基本对象概念 背景 资源和对象 Kubernetes 中的所有内容都被抽象为"资源",如 Pod.Service.Node 等都是资源."对象" ...
- Dapr和Rainbond集成,实现云原生BaaS和模块化微服务开发
背景 Dapr 是一个开源的分布式应用运行时,帮助开发者构建松耦合的分布式应用程序,具有良好的可扩展性和可维护性.Rainbond 是一款企业级的云原生应用管理平台,提供了丰富的功能和工具,方便开发者 ...
- k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)
Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...
- 从零开始入门 K8s | Kubernetes 调度和资源管理
作者 | 子誉 蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词"入门",即可下载从零入门 K8s 系列文章 PPT. Kubernetes 调 ...
- 2.K8S的核心资源管理方法
目录 1.1陈述式资源管理方法 1.1.1.管理名称空间资源 1.1.2.管理Deployment资源 1.1.3.管理Service资源 1.1.4.kubectl用法总结 1.2.声明式资源管理方 ...
随机推荐
- 8.5 CheckRemoteDebuggerPresent
CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用.函数接收两个参数进程句柄和一个指向布尔值的指针.如果指定的进程正在被调试,则函数 ...
- Swift中发布-订阅框架Combine的使用
Combine简介 Combine是一个苹果用来处理事件的新的响应式框架,支持iOS 13及以上版本. 你可以使用Combine去统一和简化在处理类似于target-action,delegate,k ...
- 案例:使用sqlplus登录报ORA-12547错误
现象:Exadata刷机之后grid/oracle用户的环境变量是没有设置的,需要手工进行设置,设置完成后发现grid用户执行报错ORA-12547: [grid@dbm0dbadm01 ~]$ sq ...
- JS Leetcode 1370. 上升下降字符串 题解分析,桶排序与charCodeAt fromCharCode妙用
壹 ❀ 引 本题来自LeetCode1370. 上升下降字符串,难度简单,是一道考察对于字符串遍历熟练度的题目,题目描述如下: 给你一个字符串 s ,请你根据下面的算法重新构造字符串: 从 s 中选出 ...
- JS Leetcode 503. 下一个更大元素 II 题解分析,依旧单调栈做法解决此题
壹 ❀ 引 我在JS Leetcode 496. 下一个更大元素 I 更清晰的图解单调栈做法一文中,介绍了单调栈做法解决下一个更大元素的问题,比较巧的是这道题还有升级版,题目来自Leetcode503 ...
- JS 数组中找到与目标值最接近的数字,记一次工作中关于二分查找的算法优化
壹 ❀ 引 在最近的工作中,有一个任务是需要修复富文本编辑器字号显示的BUG.大概情况就是,从WPS中复制不同样式的标题.正文到到项目编辑器中,发现没办法设置选中的文本为正文:而且字体字号都显示为默认 ...
- 多层PCB线路板制作流程
PCB制作第一步是整理并检查pcb多层线路板布局(Layout).电路板制作工厂收到PCB设计公司的CAD文件,由于每个CAD软件都有自己独特的文件格式,所以深圳PCB板厂会转化为一个统一的格式Ger ...
- 端口碰撞Port Knocking和单数据包授权SPA
端口碰撞技术 Port knocking 从网络安全的角度,服务器开启的端口越多就越不安全,因此系统安全加固服务中最常用的方式,就是先关闭无用端口,再对提供服务的端口做访问控制.而作为远程管理与维护的 ...
- JavaScript选择器
Js选择器 JS选择器常用的有getElementById().getElementsByClassName().getElementsByName().getElementsByTagName(). ...
- win32 - IFileDialog接口的使用
官方示例: CommonFileDialogModes.cpp 如果我们想要自己创建一个通用的文件对话框,则可以使用IFileOpenDialog接口,代码参考: HRESULT BasicFileO ...