文章 90
评论 1
浏览 819323
k8s调度准入控制

k8s调度准入控制

一、ResourceQuota

官方文档:https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/

当多个用户或团队共享具有固定节点数目的集群时,人们会担心有人使用超过其基于公平原则所分配到的资源量。资源配额是帮助管理员解决这一问题的工具。资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。

ResourceQuota作用于namespace,限制命名空间可用的资源。创建在那个命名空间就对这个命名空间生效。

示例文件

apiVersion: v1 kind: ResourceQuota metadata: name: resource-test labels: app: resourcequota spec: hard: #以下为常用的配置,其他配置请查看官方文档 pods: 50 #Pod的最大数量 requests.cpu: 0.5 #请求最大的cpu requests.memory: 512Mi #请求最大的内存 limits.cpu: 5 #cpu可使用最大 limits.memory: 16Gi #内存可使用最大 configmaps: 20 #cm最大数量 requests.storage: 40Gi #请求storage的最大容量 persistentvolumeclaims: 20 #PVC的最大数量 replicationcontrollers: 20 #rc控制器最大数量 secrets: 20 #secrets数量 services: 50 #svc资源数量 services.loadbalancers: "2" #loadbalancers类型的svc数量 services.nodeports: "10" #nodeports类型的svc数量

注意事项,如何设置cpumemory则在创建Pod时必须设置resourcesrequestslimits参数,否则Pod不会被启动。

二、LimitRange

官方文档:https://kubernetes.io/zh/docs/concepts/policy/limit-range/

默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用资源配额,集群管理员可以以命名空间为单位,限制其资源的使用与创建。 在命名空间中,一个 Pod 或 Container 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 有人担心,一个 Pod 或 Container 会垄断所有可用的资源。 LimitRange 是在命名空间内限制资源分配(给多个 Pod 或 Container)的策略对象。

一个 LimitRange(限制范围)对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

示例文件

apiVersion: v1 kind: LimitRange metadata: name: cpu-mem-limit-range spec: limits: - default: #默认limit配置 cpu: 0.3 memory: 256Mi defaultRequest: #默认Request配置 cpu: 0.2 memory: 128Mi max: #容器资源使用最大限制 cpu: 4 memory: 4Gi min: #容器资源使用最小限制 cpu: 0.2 memory: 128Mi type: Container #类型容器 - type: PersistentVolumeClaim #类型PVC max: storage: 2Gi #PVC最大的容量 min: storage: 1Gi #PVC最小容量

注意:如果Pod没有设置资源限制,会以limits中的默认配置进行填充,直接填充导Pod资源上面。

三、服务质量QoS

官方文档:https://kubernetes.io/zh/docs/tasks/configure-pod-container/quality-service-pod/

在k8s集群中,当一个node节点负载高时内存CPU使用已经超出了node节点的资源,这时node节点系统会进行MMO杀死占用较高的进程,k8s内部也会提前进行资源的驱逐,k8s会优先驱逐特定的一些Pod,这里k8s引用了一个服务质量Qos来确定先优先驱逐那些Pod。

Kubernetes 创建 Pod 时就给它指定了下列一种 QoS 类

  • Guaranteed:最高服务质量,当宿主机内存不够时,会先kill掉QoS为BestEffort和Burstable的Pod,如果内存还是不够,才会kill掉QoS为Guaranteed,该级别Pod的资源占用量一般比较明确,即requests的cpu和memory和limits的cpu和memory配置的一致。
  • Burstable:服务质量低于Guaranteed,当宿主机内存不够时,会先kill掉QoS为BestEffort的Pod,如果内存还是不够之后就会kill掉QoS级别为Burstable的Pod,用来保证QoS质量为Guaranteed的Pod,该级别Pod一般知道最小资源使用量,但是当机器资源充足时,还是想尽可能的使用更多的资源,即limits字段的cpu和memory大于requests的cpu和memory的配置。
  • BestEffort:尽力而为,当宿主机内存不够时,首先kill的就是该QoS的Pod,用以保证Burstable和Guaranteed级别的Pod正常运行。

示例

[root@k8s-master-1-kty-sc test]# kubectl get po -n test blackbox-78b56f764d-j7mcx -oyaml resources: #生成服务质量QoS依赖于Pod的资源限制的设置 limits: cpu: 300m memory: 256Mi requests: cpu: 200m memory: 128Mi qosClass: Burstable #服务质量级别,有k8s自己生成,不需要手动维护

标题:k8s调度准入控制
作者:Carey
地址:HTTPS://www.zhangzhuo.ltd/articles/2022/01/24/1643007249142.html

生而为人

晚上好,今天过得怎么样?
取消