K8S 資源限制 QoS
設置資源很煩,但是十分必要。如果不設,Pod雖然很容易被調度,可以使用整個node資源,但是當資源緊俏時,會被第一個kill。所以這裏學習下資源限制。
QoS
Guaranteed:每個容器都必須設置CPU和內存的限制和請求(最大和最小)。最嚴格的要求
Every Container in the Pod must have a memory limit and a memory request, and they must be the same.
Every Container in the Pod must have a CPU limit and a CPU request, and they must be the same.
Burstable:在不滿足Guaranteed
的情況下,至少設置一個CPU或者內存的請求。
The Pod does not meet the criteria for QoS class Guaranteed.
At least one Container in the Pod has a memory or CPU request.
BestEffort:什麼都不設置,佛系資源申請。
For a Pod to be given a QoS class of BestEffort, the Containers in the Pod must not have any memory or CPU limits or requests.
可壓縮資源
CPU資源。
當資源緊俏,發生資源搶佔時,Pod可以分享時間片。例如,在1U的node上,容器A請求0.6U,容器B請求0.4U。資源緊俏時,將會按照請求的比例分配時間片。容器A:0.6U/(0.6U+0.4U);容器B:0.4U/(0.6U+0.4U)。
當資源剩餘,發生超用時,即實際使用超過請求,Pod按照比例分配剩餘資源。例如,在1U的node上,容器A請求0.6U,容器B請求0.3U,剩餘0.1U。兩個容器都想超用,剩餘的0.1U將會按照請求的比例進行2:1分配給兩個容器。
關於提高資源利用率,可以將負載高峯時間錯開的應用部署在一起,提高node利用率。
不可壓縮資源
內存和磁盤資源。
當資源緊俏時,例如OOM,kubelet會根據QoS進行驅逐:
Best-Effort
,最低優先級,第一個被kill;Burstable
,第二個被kill。Guaranteed
,最高優先級,最後kill。除非超過limit或者沒有其他低優先級的Pod;
由於對於不可壓縮資源,發生搶佔的情況會出Pod被意外Kill掉的情況,所以建議對於不可以壓縮資源(Memory,Disk)的設置成0<Request==Limit,即Guaranteed
。
至於這三種是哪一種不用配置,k8s會自動給pod分配,比如你什麼都沒配(cpu,內存),k8s就給你分個BestEffort,依次類推