Kubernetes 的节点可以按照 Capacity
调度。默认情况下 pod 能够使用节点全部可用容量。 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。 除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题。
kubelet
公开了一个名为 'Node Allocatable' 的特性,有助于为系统守护进程预留计算资源。 Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 “Node Allocatable”。
节点可分配资源
Node Capacity | 是指Kubernetes Node所有资源总量 |
Kube-reserved | 是指为Kubernetes组件预留的资源量,如(Docker deamon, kubelet, kube proxy) |
System-reserved | 是指为系统守护进程预留的资源量,如不受kubernetes 管理的进程、一般涵盖在/system 下的raw container的所有进程 |
eviction-threshold | 是指节点的驱逐策略,根据kubelet启动时注入的参数(--eviction-hard等其它)设定的阈值,如果触发该阈值,kubelet会根据Kubenetes中的Qos的等级进行驱逐Pod |
allocatable | 是指节点上的Pod所完全能够分配的资源,具体公式如:[Allocatable] = [Node Capacity] - [Kube-Reserved] - [System-Reserved] - [Hard-Eviction-Threshold] |
Kubernetes 节点上的 Allocatable 被定义为 pod 可用计算资源量。调度器不会超额申请 Allocatable。 目前支持 CPU, memory 和 ephemeral-storage 这几个参数.
Kube-Reserved
kube-reserved
用来给诸如 kubelet
、容器运行时、节点问题监测器等 kubernetes 系统守护进程记述其资源预留值。 该配置并非用来给以 Pod 形式运行的系统守护进程保留资源。kube-reserved
通常是节点上 pod 密度
的函数。除了 cpu
,内存
和 ephemeral-storage
之外,pid
可用来指定为 kubernetes 系统守护进程预留指定数量的进程 ID。
kubereserved是为kubernetes组件预留资源而设立的参数配置,设置此参数必须需要重启kubelet(在kublet启动时通过cmd-line引入),因此kubelet正常运行时无法将其更改
--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
--kube-reserved-cgroup=/kube.slice
System-Reserved
system-reserved
用于为诸如 sshd
、udev
等系统守护进程记述其资源预留值。 system-reserved
也应该为 kernel
预留 内存
,因为目前 kernel
使用的内存并不记在 Kubernetes 的 Pod 上。 同时还推荐为用户登录会话预留资源(systemd 体系中的 user.slice
)。除了 cpu
,内存
和 ephemeral-storage
之外,pid
可用来指定为 kubernetes 系统守护进程预留指定数量的进程 ID。
最初实现,system-reserved 与 kube-reserved 的功能是一样的,同样都是资源预留功能,但是二者的意义是不同的,很明显kubereserved是为kubernetes组件实现资源预留;而systemreserved是为非kubernetes组件的系统进程而预留的资源值
--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
--system-reserved-cgroup=/system.slice,user.slice
Evictions Thresholds
节点级别的内存压力将导致系统内存不足,这将影响到整个节点及其上运行的所有 Pod。 节点可以暂时离线直到内存已经回收为止。 为了防止(或减少可能性)系统内存不足,kubelet 提供了 资源不足管理。 驱逐操作只支持 memory
和 ephemeral-storage
。 通过 --eviction-hard
标志预留一些内存后,当节点上的可用内存降至保留值以下时, kubelet
将尝试驱逐 Pod。 如果节点上不存在系统守护进程,Pod 将不能使用超过 capacity-eviction-hard
所 指定的资源量。因此,为驱逐而预留的资源对 Pod 是不可用的。
为了提高节点的可靠性,每当节点内存或本地存储耗尽时,kubelet 都会驱逐 pod, evictions & node allocatable可共同有助于提高节点稳定性。
--eviction-hard=imagefs.available<15%,memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%
--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]
示例场景
这是一个用于说明节点可分配(Node Allocatable)计算方式的示例:
- 节点拥有
32Gi
memeory
,16 CPU
和100Gi
Storage
资源 --kube-reserved
被设置为cpu=1,memory=2Gi,ephemeral-storage=1Gi
--system-reserved
被设置为cpu=500m,memory=1Gi,ephemeral-storage=1Gi
--eviction-hard
被设置为memory.available<500Mi,nodefs.available<10%
具体配置
1.启用cgroupsPerQOS,默认值是 true,即启动
--cgroups-per-qos=true
2.配置 cgroup driver
--cgroup-driver=systemd
3.配置kube-reserved
--kube-reserved=memory=400Mi
4.配置kube-reserved-cgroup
--kube-reserved-cgroup=/kube.slice
5.配置system-reserved
--system-reserved=memory=300Mi
6.配置system-reserved-cgroup
--system-reserved-cgroup=/system.slice
7.配置eviction-hard
--eviction-hard=imagefs.available<15%,memory.available<300Mi,nodefs.available<10%,nodefs.inodesFree<5%
8.配置enforce-node-allocatable,默认是pods就可
--enforce-node-allocatable=[pods][,][kube-reserved][,][system-reserved]
使用kubeadm创建的kubernetes集群,具体的配置在/var/lib/kubelet目录下,配置文件config.yaml安装之后默认生成的配置文件,当然kubelet启动的时候会指向该配置--config=/var/lib/kubelet/config.yaml
配置示例如下:
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 0s
cacheUnauthorizedTTL: 0s
clusterDNS:
- 10.10.0.10
clusterDomain: nflow.so
enforceNodeAllocatable:
- pods
- kube-reserved
- system-reserved
systemReserved:
cpu: 200m
memory: 2000Mi
kubeReserved:
cpu: 200m
memory: 500Mi
kubeReservedCgroup: /kube.slice
systemReservedCgroup: /system.slice
evictionHard:
memory.available: "500Mi"
imagefs.available": "15%"
nodefs.available": "10%"
nodefs.inodesFree": "5%"
evictionMinimumReclaim:
memory.available: "300Mi"
nodefs.available: "500Mi"
imagefs.available: "2Gi"
cgroupDriver: systemd
maxPods: 64
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 4m0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s