k8s node节点可分配资源限制


Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。 除非为这些系统守护进程留出资源,否则它们将与 Pod 争夺资源并导致节点资源短缺问题。

kubelet 公开了一个名为 ‘Node Allocatable’ 的特性,有助于为系统守护进程预留计算资源。 Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 ‘Node Allocatable’。

  • 查看节点的Capacity和Allocatable
[root@m1 ~]# kubectl describe node <node_name>
#里面有一段类似如下的内容
Capacity:
 cpu:                8
 ephemeral-storage:  101917688Ki
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             32939412Ki
 pods:               110
Allocatable:
 cpu:                8
 ephemeral-storage:  93927341106
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             32837012Ki
 pods:               110

一、CGROUP

1、概念了解

cgroup 是control group的缩写,是linux内核提供的一种可以限制,记录,隔离进程组所使用的物理资源的机制,其中物理资源包含(cpu/memory/io等等)。 cgroup是将任意进程进行分组化管理的linux内核功能,CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。

2、DOCKER 中的CGROUP 驱动

  • systemd cgroup driver
    • systemd cgroup driver 是systemd本身提供了一个cgroup的管理方式,使用systemd做cgroup驱动的话,所有的cgroup操作都必须通过systemd的接口来完成,不能手动更改cgroup的文件
  • cgroupfs cgroup driver
    • cgroupfs 比较好理解。比如说要限制内存是多少、要用 CPU share 为多少?其实直接把 pid 写入对应的一个 cgroup 文件,然后把对应需要限制的资源也写入相应的 memory cgroup 文件和 CPU 的 cgroup 文件就可以了.

二、配置docker和kubelet的cgroup驱动

默认kubeadm安装的kubernetes集群 cgroup驱动为systemd,这样是开启不了Kubelet Node Allocatable
先确认docker的cgroup driver:

[root@dev14 ~]# docker info | grep "Cgroup Driver"
Cgroup Driver: cgroupfs

如果确认docker的Cgroup Driver不是 cgroupfs,则可以通过以下方法配置。

  • docker 配置cgroup驱动为cgroupfs
vim /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=cgroupfs"],
	"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
	"log-driver": "json-file",
	"log-opts": {
		"max-size": "10m",
		"max-file": "5"
	},
	"insecure-registries": ["192.168.108.133:5000"]
}
  • 修改kubelet cgroup 驱动systemd为cgroupfs
vim /var/lib/kubelet/kubeadm-flags.env
#给KUBELET_KUBEADM_ARGS添加 --cgroup-driver=cgroupfs
KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=nexus.10010sh.cn/pause:3.1"

三、Kubelet Node Allocatable

1、概念

  • Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。

  • 目前支持cpu, memory, ephemeral-storage三种资源预留。

  • Node Capacity是Node的所有硬件资源,kube-reserved是给kube组件预留的资源,system-reserved是给System进程预留的资源, eviction-threshold(阈值)是kubelet eviction(收回)的阈值设定,allocatable才是真正scheduler调度Pod时的参考值(保证Node上所有Pods的request resource不超过Allocatable)

  • allocatable = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold]

在这里插入图片描述

2、配置 修改/var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=nexus.10010sh.cn/pause:3.1 \
    --enforce-node-allocatable=pods,kube-reserved,system-reserved \
    --kube-reserved-cgroup=/system.slice/kubelet.service \
    --system-reserved-cgroup=/system.slice \
    --kube-reserved=cpu=1,memory=1Gi \
    --system-reserved=cpu=1,memory=1Gi  \
    --eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10% \
    --eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15% \
    --eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m \
    --eviction-max-pod-grace-period=30 \
    --eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi"
  • 配置解析
    • 1). 开启为kube组件和系统守护进程预留资源的功能
      –enforce-node-allocatable=pods,kube-reserved,system-reserved
    • 2). 设置k8s组件的cgroup
      –kube-reserved-cgroup=/system.slice/kubelet.service
    • 3). 设置系统守护进程的cgroup
      –system-reserved-cgroup=/system.slice
    • 4). 配置为k8s组件预留资源的大小,CPU、MEM
      –kube-reserved=cpu=1,memory=1G
    • 5). 配置为系统进程(诸如 sshd、udev 等系统守护进程)预留资源的大小,CPU、MEM
      –system-reserved=cpu=1,memory=1Gi
    • 6). 驱逐pod的配置:硬阈值(保证95%的内存利用率)
      –eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10%
      我用k8s 1.14版本做实验时,这个选项还不支持百分比,可以用实际容量数字,例如:–eviction-hard=memory.available<500Mi。
    • 7). 驱逐pod的配置:软阈值
      –eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15%
    • 8). 定义达到软阈值之后,持续时间超过多久才进行驱逐
      –eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m
    • 9). 驱逐pod前最大等待时间=min(pod.Spec.TerminationGracePeriodSeconds, eviction-max-pod-grace-period),单位秒
      –eviction-max-pod-grace-period=30
    • 10). 至少回收多少资源,才停止驱逐
      –eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi

四、修改Kubelet启动service文件 /lib/systemd/system/kubelet.service

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/

[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

五、重启kubelet 和docker服务,再次查看节点的Capacity和Allocatable

可以看到配置已经生效

~]# systemctl restart docker && systemctl restart kubelet
~]# kubectl describe node <node>
Capacity:
 cpu:                8
 ephemeral-storage:  102106104Ki
 hugepages-2Mi:      0
 memory:             32909464Ki
 pods:               110
Allocatable:
 cpu:                6
 ephemeral-storage:  94100985291
 hugepages-2Mi:      0
 memory:             30709912Ki
 pods:               110
  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值