kubernetes調度之資源耗盡處理配置

系列目錄html

本篇將介紹如何使用kubelet處理資源耗盡的狀況node

當可用的計算機資源很是低的時候,kubelet仍然要保證節點的穩定性.當處理不可壓縮的計算機資源(好比內存或磁盤空間)時,這尤爲重要,當這些資源被耗盡時,節點將變得不穩定spa

驅離策略

kubelet會積極的監視並阻止可用計算機資源耗盡.這種狀況下,kubelet會終止一個或者多個pod來從新取回耗盡的資源,當kubelet終止一個pod時,它將會終止pod的全部容器並把PodPhase設置爲Failedcode

驅離信號

kubelet支持基於下面列表中描述的驅離信號的驅離策略.每個信號值都由後面description列來描述,而且它們是基於kubelet的summary APIhtm

Eviction Signal Description
memory.available memory.available := node.status.capacity[memory] - node.stats.memory.workingSet
nodefs.available nodefs.available := node.stats.fs.available
nodefs.inodesFree nodefs.inodesFree := node.stats.fs.inodesFree
imagefs.available imagefs.available := node.stats.runtime.imagefs.available
imagefs.inodesFree imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

以上的信號同時支持字面量或者百分比值.百分比值根據每一個信號的總容量來計算blog

memory.available的值從cgroup裏衍生出來,而不是經過free -m,這一點很重要由於free -m在容器裏是無效的排序

kubelet僅支持如下兩種文件類型分區:token

  • nodefs文件系統,kubelet用於存儲卷,守護進程log等進程

  • imagefs文件系統,容器運行時用於存儲鏡像和容器的可寫層ip

imagefs是可選的,kubelet使用cAdvisor來自動發現.kubelet並不關心其它文件系統.其它類型的配置目前kubelet也不支持,好比把存儲卷和log存放到filesystemnot OK

驅離閾值

kubelet支持指定驅離閾值來來觸發kubelet回收資源

每個閾值都是如下形式的:

[eviction-signal][operator][quantity]
  • eviction-signal 是上面表中定義的一個信號token

  • operator是一種指望的操做符,好比<(小於號)

  • quantity 驅離閾值的量,好比1Gi,驅離閾值也能夠是由%百分號表示的百分比值

好比說一個節點有10Gi總內存值,而且若是可用內存的值若是低於1Gi的時候你想要觸發驅離,你能夠以以下兩種方式中的任一來定義驅離閾值

memory.available<10%memory.available<1Gi可是你不能二者同時使用.

軟驅離閾值

軟驅離閾值和一個包含管理員指定的優雅時間的驅離閾值成對出現.驅離信號發出後,在優雅時間沒有超出以前,kubelet不會回收資源.若是不指定優雅時間,kubelet會在一開始就返回錯誤

此外,若是軟驅離閾值被知足,operator能夠指定被驅離時最大容許的pod優雅終止時間.若是指定了,kubelet使用pod.Spec.TerminationGracePeriodSeconds和最大容許的優雅終止時間二者中較小的一個值.若是沒有指定,kubelet會立刻殺死pod

如下標識被用於支持軟驅離閾值

  • eviction-soft描述了一系列軟驅離閾值.

  • eviction-soft-grace-period描述了一系列驅離時間,(好比memory.available=1m30s),對應在驅離發生以前,軟件驅離閾值持續的時間

  • eviction-max-pod-grace-period描述了當軟驅離閾值被知足時,最大容許的優雅終止時間(單位是秒)

硬驅離閾值

硬驅離閾值沒有優雅時段,kubelet會立馬對相關的資源採起動做.若是硬驅離閾值被知足,kubelet會立馬殺死pod,而沒有優雅終止時段.

如下標識能夠被用於配置硬驅離閾值

  • memory.available<100Mi

  • nodefs.available<10%

  • nodefs.inodesFree<5%

  • imagefs.available<15%

驅離監視時間間隔

經過housekeeping-interval

節點狀態

kubelet把一個或多個驅離信號映射到的對應的節點狀態上

若是硬驅離閾值被知足,或者不依賴於優雅時段的軟驅離閾值被知足,kubelet會報告一種狀態來反映節點處於壓力之下

如下是節點狀態和特定驅離信號間的關係

Node Condition Eviction Signal Description
MemoryPressure memory.available Available memory on the node has satisfied an eviction threshold
DiskPressure nodefs.available, nodefs.inodesFree, imagefs.available, or imagefs.inodesFree Available disk space and inodes on either the node’s root filesystem or image filesystem has satisfied an eviction threshold

kubelet會繼續以--node-status-update-frequency指定的值(默認爲10秒)來報告更新的節點狀態

回收節點級別的資源

若是驅離閾值被知足而且優雅時段已過,kubelet開始啓動對處於壓力的資源的回收工做直到監測到壓力信號已經消失而且低於定義的閾值

kubelete嘗試優先回收節點級別的資源而不是驅離pod.若是監測到磁盤壓力,若是節點有容器運行時專用的imagefs,則kubelet回收資源的方式不一樣

驅離pod

若是kubelet沒法在節點上回收到足夠的資源,則開始驅離pod.

kubelet首先會根據pod使用的資源是否超過了申請的資源,而後根據他們的優先級把要驅離的pod進行排序.

最終kubelet按照如下列出的順序對要驅離的pod進行排序:

  • BestEffort或者Burstable類型pod
相關文章
相關標籤/搜索