爲k8s預留系統資源

爲k8s預留系統資源

Kubernetes 的節點能夠按照 Capacity 調度。默認狀況下 pod 可以使用節點所有可用容量。 這是個問題,由於節點本身一般運行了很多驅動 OS 和 Kubernetes 的系統守護進程。 除非爲這些系統守護進程留出資源,不然它們將與 pod 爭奪資源並致使節點資源短缺問題。node

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

節點可分配

如何配置

  • --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爲例:spa

我是kubespray安裝的在/etc/kubernetes/kubelet.env添加如下參數後重啓kubelet生效:code

--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"

內存壓測:blog

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

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

相關文章
相關標籤/搜索