Kubernetes资源预留
2019-12-10 本文已影响0人
王勇1024
为什么需要预留资源
Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。
这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程(system daemons)。除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题。
按照是否为 Pod,可以把计算节点的进程分为两类:
- Pod 类进程:容器内部的进程,这些容器由 K8S 创建
- 非 Pod 类进程:系统进程,如内核,systemd 等;K8S 管理进程,如 Docker, Kubelet 等
如果没有资源预留,K8S 认为宿主机上所有的资源(Mem, CPU)都是可以分配给 Pod 类进程。因为非 Pod 类进程也需要占用一定的资源,当 Pod 创建很多时,就有可能出现资源不足的情况。
kubelet 公开了一个名为 Node Allocatable 的特性,有助于为系统守护进程预留计算资源。Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 Node Allocatable。
Node Allocatable(节点可分配资源)
Node Capacity
---------------------------
| kube-reserved |
|-------------------------|
| system-reserved |
|-------------------------|
| eviction-threshold |
|-------------------------|
| |
| allocatable |
| (available for pods) |
| |
| |
---------------------------
Kubernetes 节点上的 Allocatable 被定义为 pod 可用计算资源量。调度器不会超额申请 Allocatable。目前支持 CPU, memory 和 storage 这几个参数。
Node Allocatable 暴露为 API 中 v1.Node 对象的一部分,也是 CLI 中 kubectl describe node 的一部分。
在 kubelet 中,可以为两类系统守护进程预留资源。
如何预留
K8S 把计算节点资源分为 4 个部分
- kube-reserved:预留给 K8S 管理进程的资源,如 Kubelet,Docker Daemon 等
- system-reserved:预留给系统资源
- eviction-threshold:eviction 的阈值
- allocatable(available for pods):pods 可以使用的资源
为了简化管理,建议不对 kube-reserved/system-reserved 做区分,预留给二者内存的总和为 4 GB。启动 kubelet 时,设置如下参数
$ sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroups-per-qos=true --kube-reserved=cpu=1000m,memory=4Gi"