文章目录
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 类由容器的资源限制和请求定义指定。这些类会影响节点的资源利用率。为了有效利用可用资源,必须考虑它们。