Overview

服务质量(QoS)类是 Kubernetes 的一个概念,调度器用它来决定 pod 的调度和驱逐优先级。
QoS 类是由 Kubernetes 分配给 pod 的,如以下示例所示,可以通过更改资源request和limit定义来设置。

Pod的QoS分类

  • Guaranteed
  • Burstable
  • BestEffort
    大致如下图所示:
    在这里插入图片描述

要解释 QoS 类,必须了解 cpu 和内存的“Request”和“Limit”概念。request是容器請求获得的资源,limit是容器能够获得的最大资源。

Guaranteed

1.如何将 Pod 设置为保证Guaranteed

Guaranteed类意味着request和limit的资源值是相同的。因为在任何情况下,容器将拥有完全相同的 CPU 和内存。
当request和limit的资源相同时,qosClass 标记如下:

root@k8smaster:~# kubectl get pod calico-node-pqgmw -n kube-system -o yaml|grep limits  -A 5;kubectl get pod calico-node-pqgmw -n kube-system -o yaml|grep qos
      limits:
        cpu: 250m
        memory: 70Mi
      requests:
        cpu: 250m
        memory: 70Mi
  qosClass: Guaranteed

2. Kubernetes 调度器如何管理Guaranteed类的Pod

Kubernetes 调度器通过确保所有容器的内存和 CPU 请求总和低于节点的总 CPU 和内存来管理保证Guaranteed类的 Pod
这些 Pod 优先级最高,除非系统超过资源限制,否则不会被终止。

Burstable

1. 如何将 Pod 设置为Burstable

当容器的内存或 CPU 的limit大于request的值时,Pod 会被分配为Burstable类。
当 Pod 需要一定范围的 CPU 或内存使用时,应使用此类。值可以在定义的request和limit之间。
当limit的值大于request的值时,qosClass 为Burstable,如下所示:


root@k8smaster:~#  kubectl get pod  etcd-k8smaster.pci.co.id -n kube-system -o yaml|grep resources -A 5;kubectl get pod  etcd-k8smaster.pci.co.id -n kube-system -o yaml|grep qos
    resources:
      limits:
        cpu: 100m
        memory: 100Mi
      requests:
        cpu: 100m
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
  qosClass: Burstable

如果没有限制值,则 Pod 是“Burstable”,如下所示:

root@k8smaster:~#  kubectl get pod  etcd-k8smaster.pci.co.id -n kube-system -o yaml|grep resources -A 5;kubectl get pod  etcd-k8smaster.pci.co.id -n kube-system -o yaml|grep qos
    resources:
      requests:
        cpu: 100m
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
  qosClass: Burstable

Kubernetes 调度程序如何管理Burstable Pod

2.b. Kubernetes 调度程序如何管理 Burstable Pod

Kubernetes 调度程序无法确保 Burstable Pod 部署到具有足够资源的节点。
如果没有 BestEffort 类 Pod,则这些 Pod 在达到限制时会先于 Guaranteed 类 Pod 被终止。

BestEffort

1. 如何将 Pod 设置为 BestEffort

当 pod 没有内存或 CPU request或limit的定义时,它会被标记为BestEffort类。
由于没有limits定义,标记为 BestEffort 的 pod 只能获取节点上剩余的内存或 CPU。
当没有limit或request值时,qosClass 如下所示为 BestEffort:

kubectl get pod kube-proxy-sndtg  -n kube-system -o yaml|grep -i resources -A 1 ;kubectl get pod kube-proxy-sndtg  -n kube-system -o yaml|grep -i qos
    resources: {}
    securityContext:
  qosClass: BestEffort

2. Kubernetes 调度程序如何管理 BestEffort Pod

BestEffort类的pod 不保证被管理到有足够资源的节点上。它们能够使用节点上的任何空闲资源。这有时可能会导致其他 pod 的资源问题。
这些类的 pod 优先级最低,如果系统没有内存,它们将首先被终止。

结论

Kubernetes 调度程序根据 Pod 的 QoS 类值来调度 Pod。Pod 的 QoS 类由容器的资源限制和请求定义指定。这些类会影响节点的资源利用率。为了有效利用可用资源,必须考虑它们。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐