Kubernetes 的節點可以按照 Capacity
調度。默認情況下 pod 能夠使用節點全部可用容量。 這是個問題,因為節點自己通常運行了不少驅動 OS 和 Kubernetes 的系統守護進程。 除非為這些系統守護進程留出資源,否則它們將與 pod 爭奪資源並導致節點資源短缺。
- 未設置資源預留導致flannel組件oom,頻繁重啟
處理方案
kubelet
公開了一個名為 'Node Allocatable' 的特性,有助於為系統守護進程預留計算資源。 Kubernetes 推薦集群管理員按照每個節點上的工作負載密度配置 Node Allocatable
。
-
rke配置方案
在kubelet配置中添加以下配置
extra_args:
cgroups-per-qos: 'true'
cgroup-driver: 'cgroupfs'
# 節點資源預留
enforce-node-allocatable: 'pods'
# 操作系統預留資源量
system-reserved: 'cpu=1,memory=2048Mi'
# k8s自身組件預留資源量
kube-reserved: 'cpu=0.5,memory=512Mi'
# POD驅逐,這個參數只支持內存和磁盤。
## 硬驅逐閾值
### 當節點上的可用資源降至保留值以下時,就會觸發強制驅逐。強制驅逐會強制kill掉POD,不會等POD自動退出。
eviction-hard: 'memory.available<300Mi,nodefs.available<10%,imagefs.available<10%,nodefs.inodesFree<5%'
## 軟驅逐閾值
### 以下四個參數配套使用,當節點上的可用資源少於這個值時但大於硬驅逐閾值時候,會等待eviction-soft-grace-period設置的時長;
### 等待中每10s檢查一次,當最后一次檢查還觸發了軟驅逐閾值就會開始驅逐,驅逐不會直接Kill POD,先發送停止信號給POD,然后等待eviction-max-pod-grace-period設置的時長;
### 在eviction-max-pod-grace-period時長之后,如果POD還未退出則發送強制kill POD"
eviction-soft: 'memory.available<500Mi,nodefs.available<20%,imagefs.available<20%,nodefs.inodesFree<10%'
# 當node的內存/磁盤空間達到一定的閾值后,要觀察一段時間,如果改善到低於閾值就不進行驅逐,若這段時間一直高於閾值就進行驅逐
eviction-soft-grace-period: 'memory.available=1m30s,nodefs.available=1m30s,imagefs.available=1m30s,nodefs.inodesFree=1m30s'
# 終止pod容器要花費的時間
eviction-max-pod-grace-period: '30'
# Node Condition Pressure換回False需要等待的時間,防止Node Condition來回切換引起scheduler做出錯誤的調度決定
eviction-pressure-transition-period: '30s'
- 確認
服務器資源為4c/12G
查看node信息
$ kubectl describe node 192.168.2.27|grep -A 10 Capacity
Capacity: #Node節點總資源量
cpu: 4
ephemeral-storage: 102350Mi
hugepages-2Mi: 0
memory: 12271508Ki
pods: 110
Allocatable: #k8s可用資源量
cpu: 2500m
ephemeral-storage: 96589578081
hugepages-2Mi: 0
memory: 9342868K