k8s 节点可分配资源限制 Node Allocatable

k8s 节点健康状态

状态 释义
NodeHasSufficientMemory 节点有足够的内存
NodeHasNoDiskPressure 节点没有磁盘压力
NodeHasSufficientPID 节点有足够的PID
NodeNotReady 节点未准备好

k8s 节点可分配资源限制 Node Allocatable

官方文档

前言

默认kubelet没配置资源预留应用没做应用资源限制情况下,那host上所有资源都是可以给pod调配使用的,这样很容易引起集群雪崩效应,比如集群内有一台上跑的pod没做resource limt导致占用资源过大导致将宿主机压死了,此时这个节点在kubernetes内就是一个no ready的状态了,kubernetes会将这台host上所有的pod在其他节点上重建,也就意味着那个有问题的pod重新跑在其他正常的节点上,将另外正常的节点压跨。循怀下去直到集群内所有主机都挂了,这就是集群雪崩效应。

0. 查看节点的Capacity和Allocatable

~]# kubectl describe <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@m1 ~]# 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

    编辑 /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)
  • Node Allocatable Resource = Node Capacity - 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"
3. 配置解析

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>
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

转自:https://chulinx.github.io/2019/12/11/Kubernetes1.16配置节点资源预留/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容