Kubernetes 预留资源

Administrator
发布于 2024-12-25 / 15 阅读 / 0 评论 / 0 点赞

Kubernetes 预留资源

Kubernetes 预留资源

有一套环境在腾讯云上,今天想部署一个服务,发现服务在 Pending 中,其报错内容为 0/3 nodes are available: 1 Insufficient memory... 含义就是内存不足,经过排查发现 Node 节点总使用资源为 12G 但节点配置为 8C16G,不理解为什么创建不了Pod。

通过研究发现腾讯云有页面能够查看到 Node 节点资源使用情况,发现总资源也为 12G,这就涉及到了一个新的知识点,预留资源
7070c66643046dbeacf5cfeb2f8c263.png

查看官网

kubernetes 官网

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

ae98b9315f21b593f80f09e65a2a413.png

Kubernetes 节点上的 'Allocatable' 被定义为 Pod 可用计算资源量。 调度器不会超额申请 'Allocatable'。 目前支持 'CPU'、'memory' 和 'ephemeral-storage' 这几个参数。其中 ephemeral-storage 是临时存储空间

Kube 预留值,参数分别为 kubeReservedkubeReservedCgroup

kubeReserved:

  • 用来给诸如 kubelet、容器运行时等 Kubernetes 系统守护进程记述其资源预留值。该配置并非用来给以 Pod 形式运行的系统守护进程预留资源。kubeReserved 通常是节点上 Pod 密度 的函数。

kubeReservedCgroup:

  • 是有针对性的保留组件资源如:KUBE_RESERVED_CGROUP=/kubelet.service

系统预留值,分别为 systemReservedsystemReservedCgroup

systemReserved:

  • 用于为诸如 sshdudev 等系统守护进程记述其资源预留值

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