Kubernetes 预留资源
有一套环境在腾讯云上,今天想部署一个服务,发现服务在 Pending 中,其报错内容为 0/3 nodes are available: 1 Insufficient memory... 含义就是内存不足,经过排查发现 Node 节点总使用资源为 12G 但节点配置为 8C16G,不理解为什么创建不了Pod。
通过研究发现腾讯云有页面能够查看到 Node 节点资源使用情况,发现总资源也为 12G,这就涉及到了一个新的知识点,预留资源

查看官网
通过观察发现 Kubelet 有一个 Node Allocatable(节点可分配) 的特性,用于帮助系统预留资源,但默认是使用全部容量。

Kubernetes 节点上的 'Allocatable' 被定义为 Pod 可用计算资源量。 调度器不会超额申请 'Allocatable'。 目前支持 'CPU'、'memory' 和 'ephemeral-storage' 这几个参数。其中 ephemeral-storage 是临时存储空间
Kube 预留值,参数分别为 kubeReserved 和 kubeReservedCgroup
kubeReserved:
- 用来给诸如
kubelet、容器运行时等Kubernetes系统守护进程记述其资源预留值。该配置并非用来给以 Pod 形式运行的系统守护进程预留资源。kubeReserved 通常是节点上 Pod 密度 的函数。
kubeReservedCgroup:
- 是有针对性的保留组件资源如:KUBE_RESERVED_CGROUP=/kubelet.service
系统预留值,分别为 systemReserved 和 systemReservedCgroup
systemReserved:
- 用于为诸如
sshd、udev等系统守护进程记述其资源预留值
systemReservedCgroup:
- 可为系统守护进程上可选地实施 systemReserved 约束
驱逐阈值,参数为 evictionHard
evictionHard:
- 当节点级别的内存压力将导致系统内存不足,
kubelet将尝试驱逐Pod
查看 kubelet
确实发现了已经配置了 KUBE_RESERVED,保留了一部分资源以供 Kubernetes 组件使用
# 通过观察发现 kubelet 启动文件是 /usr/lib/systemd/system/kubelet.service
[root@VM-1-200-tencentos kubernetes]# systemctl status kubelet
● kubelet.service - kubelet
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2024-12-25 18:41:09 CST; 1h 22min ago
Process: 15987 ExecStartPost=/bin/bash /etc/kubernetes/deny-tcp-port-10250.sh (code=exited, status=0/SUCCESS)
Main PID: 15986 (kubelet)
Tasks: 20 (limit: 200399)
Memory: 82.5M
CGroup: /system.slice/kubelet.service
└─15986 /usr/bin/kubelet --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook
# 通过观察发现 kubelet 环境变量是 /etc/kubernetes/kubelet 文件内容
[root@VM-1-200-tencentos kubernetes]# cat /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet
[Service]
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet ${ANONYMOUS_AUTH} ${AUTHENTICATION_TOKEN_WEBHOOK} ${AUTHORIZATION_MODE} ${CLIENT_CA_FILE} ${CLOUD_CONFIG} ${CLOUD_PROVIDER} ${CLUSTER_DNS} ${CLUSTER_DOMAIN} ${CONTAINER_RUNTIME_ENDPOINT} ${EVICTION_HARD} ${FAIL_SWAP_ON} ${HOSTNAME_OVERRIDE} ${KUBE_RESERVED} ${KUBECONFIG} ${MAX_PODS} ${PROVIDER_ID} ${REGISTER_SCHEDULABLE} ${REGISTER_WITH_TAINTS} ${RUNTIME_REQUEST_TIMEOUT} ${SERIALIZE_IMAGE_PULLS} ${V}
ExecStartPost=-/bin/bash /etc/kubernetes/deny-tcp-port-10250.sh
Restart=always
RestartSec=10
LimitNOFILE=65536
# 通过观察发现 KUBE_RESERVED 保留了一些 CPU、内存资源
[root@VM-1-200-tencentos kubernetes]# cat /etc/kubernetes/kubelet
...
FAIL_SWAP_ON="--fail-swap-on=false"
HOSTNAME_OVERRIDE="--hostname-override=10.0.1.200"
EVICTION_HARD="--eviction-hard=nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<15%,memory.available<100Mi"
KUBE_RESERVED="--kube-reserved=cpu=200m,memory=2662Mi"
MAX_PODS="--max-pods=125"
...
使用 `describe` 查看 `node` 节点描述信息,有两项指标,一项是`capacity`就是能力,意味着能够使用资源。另一项是`Allocatable`就是可分配资源,可以查看到资源比`capacity`少一点,但是通过`kubelet`配置文件加上,发现正好对应`capacity`
[root@VM-1-12-tencentos ~]# kubectl describe node 10.0.1.200
...
Capacity:
cpu: 8
ephemeral-storage: 103145380Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 32099244Ki
pods: 125
tke.cloud.tencent.com/eip: 2
tke.cloud.tencent.com/eni-ip: 95
Allocatable:
cpu: 7800m
ephemeral-storage: 95058782051
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 29270956Ki
pods: 125
tke.cloud.tencent.com/eip: 2
tke.cloud.tencent.com/eni-ip: 14
...