一、K8S中的應用服務質量(QoS)
服務質量(QoS)類是Kubernetes的概念,它確定Pod的調度和驅逐優先級
Kubelet使用它來管理驅逐pod的順序,以及使用高級CPU管理策略允許更復雜的pod調度決策。
QoS由Kubernetes本身分配給Pod。但是,DevOps可以通過處理Pod內各個容器的資源請求和限制來控制分配給容器的QoS類。
二、QoS級別
Guaranteed:POD中所有容器(包含初始化容器)都必須統一設置了limits,并且設置參數都一致;
Burstable:POD中有容器設置了 內存 或 CPU request;
BestEffort:POD中的所有容器都沒有指定CPU和內存的requests和limits;
2.1、Guaranteed
對于 QoS 類為 Guaranteed 的 Pod:
Pod 中的每個容器,包含初始化容器,必須指定內存 請求和 內存 限制,并且兩者要相等。
Pod 中的每個容器,包含初始化容器,必須指定 CPU 請求和 CPU 限制,并且兩者要相等。
apiVersion: v1 kind: Pod metadata: name: qos-demo spec: containers: - name: qos-demo image: nginx resources: limits: memory: "500Mi" cpu: "700m" requests: memory: "500Mi" cpu: "700m"
驗證:
# kubectl describe po qos-demo ··· QoS Class: Guaranteed
注意點:
如果容器指定了自己的內存limits,但沒有指定內存requests,Kubernetes 會自動為它指定與內存limits匹配的內存requests。同樣,如果容器指定了自己的 CPU limits,但沒有指定 CPU requests,Kubernetes 會自動為它指定與 CPU limits匹配的 CPU requests;
2.2、Burstable
如果滿足下面條件,將會指定 Pod 的 QoS 類為 Burstable:
Pod 不符合 Guaranteed QoS 類的標準;
Pod 中至少一個容器具有內存 或 CPU requests;
apiVersion: v1 kind: Pod metadata: name: qos-demo2 spec: containers: - name: qos-demo2 image: nginx resources: limits: memory: "500Mi" requests: memory: "200Mi"
驗證:
# kubectl describe po qos-demo2 ··· QoS Class: Burstable
2.3、BestEffort
對于 QoS 類為 BestEffort 的 Pod,Pod 中的容器必須沒有設置內存和 CPU 限制或請求。
apiVersion: v1 kind: Pod metadata: name: qos-demo3 spec: containers: - name: qos-demo3 image: nginx
三、QoS優先級
3種QoS優先級從有低到高(從左向右):
BestEffort pods -> Burstable pods -> Guaranteed pods
四、驅逐原理
可壓縮資源:CPU
在壓縮資源部分已經提到CPU屬于可壓縮資源,當pod使用超過設置的limits值,pod中進程使用cpu會被限制,但不會被kill。
不可壓縮資源:內存
4.1、節點OOM時如何處理Guaranteed, Burstable 和 BestEffort Pods?
如果節點在Kubelet可以回收之前耗盡了內存,即節點發生了oom,則oom_killer會根據其oom_score終止容器。
對于 “Guaranteed” Pod中的容器,oom_score_adj 為 “ -998”;
對于 “BestEffort” Pod中的容器,其為“ 1000”;
Burstable Pod中的容器,值為“ min(max(2,1000-(1000 * memoryRequestBytes)/ machineMemoryCapacityBytes),999” )”。
oom_killer首先終止QoS等級最低,且超過請求資源最多的容器。這意味著會優先從Burstable中選擇占用資源請求過多的容器進行驅逐;
五、最佳實踐
1、按照應用類型進行分類:核心應用(core)/ 常規應用(nomarl)/ 附加應用(extral)
2、核心應用:Guaranteed / 常規應用:Burstable / 附加應用:BestEffort
3、集群節點分為:核心應用節點 / 常規應用節點 / 附加應用節點
4、調度策略:
核心應用:可以采用nodeAffinity的prefer調度策略調度到核心節點;
常規應用:可以采用nodeAffinity的硬親和調度策略調度到常規節點;
附加應用:可以采用nodeAffinity的硬親和調度策略調度到附加節點;
審核編輯:劉清
-
cpu
+關注
關注
68文章
10901瀏覽量
212686 -
QoS
+關注
關注
1文章
136瀏覽量
44844
原文標題:關于K8S的服務質量QoS你知道多少?
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論