為k8s預留系統資源

落魄運維發表於2020-11-28

為k8s預留系統資源

Kubernetes 的節點可以按照 Capacity 排程。預設情況下 pod 能夠使用節點全部可用容量。 這是個問題,因為節點自己通常執行了不少驅動 OS 和 Kubernetes 的系統守護程式。 除非為這些系統守護程式留出資源,否則它們將與 pod 爭奪資源並導致節點資源短缺問題。

kubelet 公開了一個名為 Node Allocatable 的特性,有助於為系統守護程式預留計算資源。 Kubernetes 推薦叢集管理員按照每個節點上的工作負載密度配置 Node Allocatable

節點可分配

如何配置

  • --enforce-node-allocatable,預設為pods,要為kube元件和System程式預留資源,則需要設定為pods,kube-reserved,system-reserve
  • --cgroups-per-qos,Enabling QoS and Pod level cgroups,預設開啟。開啟後,kubelet會將管理所有workload Pods的cgroups。
  • --cgroup-driver,預設為cgroupfs,另一可選項為systemd。取決於容器執行時使用的cgroup driver,kubelet與其保持一致。比如你配置docker使用systemd cgroup driver,那麼kubelet也需要配置--cgroup-driver=systemd。
  • --kube-reserved,用於配置為kube元件(kubelet,kube-proxy,dockerd等)預留的資源量,比如—kube-reserved=cpu=1000m,memory=8Gi,ephemeral-storage=16Gi。
  • --kube-reserved-cgroup,如果你設定了--kube-reserved,那麼請一定要設定對應的cgroup,並且該cgroup目錄要事先建立好,否則kubelet將不會自動建立導致kubelet啟動失敗。比如設定為kube-reserved-cgroup=/kubelet.service 。
  • --system-reserved,用於配置為System程式預留的資源量,比如—system-reserved=cpu=500m,memory=4Gi,ephemeral-storage=4Gi。
  • --system-reserved-cgroup,如果你設定了--system-reserved,那麼請一定要設定對應的cgroup,並且該cgroup目錄要事先建立好,否則kubelet將不會自動建立導致kubelet啟動失敗。比如設定為system-reserved-cgroup=/system.slice。
  • --eviction-hard,用來配置kubelet的hard eviction條件,只支援memory和ephemeral-storage兩種不可壓縮資源。當出現MemoryPressure時,Scheduler不會排程新的Best-Effort QoS Pods到此節點。當出現DiskPressure時,Scheduler不會排程任何新Pods到此節點。

以32C/96G為例:

我是kubespray安裝的在/etc/kubernetes/kubelet.env新增以下引數後重啟kubelet生效:

--system-reserved=cpu=200m,memory=10Gi \
--eviction-hard=memory.available<10Gi,nodefs.available<1Gi,imagefs.available<1Gi \ --eviction-minimum-reclaim=memory.available=1Gi,nodefs.available=500Mi,imagefs.available=1Gi \
--node-status-update-frequency=10s --eviction-pressure-transition-period=30s"

記憶體壓測:

yum install -y stress
stress -i 1 --vm 1 --vm-bytes 20G

 參考連結:https://kubernetes.io/zh/docs/tasks/administer-cluster/reserve-compute-resources/

 

 

 

相關文章