为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/进程

相关文章
相关标签/搜索