為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/
如果用原生的kubeadm安裝,則需修改/var/lib/kubelet/kubeadm-flags.env文件后重啟kubelet生效。
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.4.1 --max-pods=130 \ --system-reserved=cpu=20m,memory=100Mi \ --eviction-hard=memory.available<1Mi,nodefs.available<1Mi,imagefs.available<1Mi \ --eviction-minimum-reclaim=memory.available=1Gi,nodefs.available=500Mi,imagefs.available=1Gi \ --node-status-update-frequency=10s --eviction-pressure-transition-period=30s"