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