0%

k8s 为系统守护进程预留计算资源

我踩的坑

一、kube-reserved-cgroup及system-reserved-cgroup配置

最开始,我只对kubelet做了如下配置–kube-reserved, –system-reserved,我就以为kubelet会自动给kube和system创建对应的Cgroup,并设置对应的cpu share, memory limit等,然后高枕无忧了。

然而实际上并非如此,直到在线上有一次某个TensorFlow worker的问题,无限制的使用节点的cpu,导致节点上cpu usage持续100%运行,并且压榨到了kubelet组件的cpu使用,导致kubelet与APIServer的心跳断了,这个节点便Not Ready了。

接着,Kubernetes会在其他某个最优的Ready Node上启动这个贪婪的worker,进而把这个节点的cpu也跑满了,节点Not Ready了。

如此就出现了集群雪崩,集群内的Nodes逐个的Not Ready了,后果非常严重。

把kublet加上如下配置后,即可保证在Node高负荷时,也能保证当kubelet需要cpu时至少能有–kube-reserved设置的cpu cores可用。

–enforce-node-allocatable=pods,kube-reserved,system-reserved
–kube-reserved-cgroup=/kubelet.service
–system-reserved-cgroup=/system.slice

注意,因为kube-reserved设置的cpu其实最终是写到kube-reserved-cgroup下面的cpu shares。了解cpu shares的同学知道,只有当集群的cpu跑满需要抢占时才会起作用,因此你会看到Node的cpu usage还是有可能跑到100%的,但是不要紧,kubelet等组件并没有收到影响,如果kubelet此时需要更多的cpu,那么它就能抢到更多的时间片,最多可以抢到kube-reserved设置的cpu nums。

查看日志

一般来说,Kubernetes 的主要组件有两种部署方法

直接使用 systemd 等启动控制节点的各个服务
使用 Static Pod 来管理和启动控制节点的各个服务
使用 systemd 等管理控制节点服务时,查看日志必须要首先 SSH 登录到机器上,然后查看具体的日志文件。如

1
2
3
4
5
journalctl -l -u kube-apiserver
journalctl -l -u kube-controller-manager
journalctl -l -u kube-scheduler
journalctl -l -u kubelet
journalctl -l -u kube-proxy

或者直接查看日志文件

1
2
3
4
5
/var/log/kube-apiserver.log
/var/log/kube-scheduler.log
/var/log/kube-controller-manager.log
/var/log/kubelet.log
/var/log/kube-proxy.log

而对于使用 Static Pod 部署集群控制平面服务的场景,可以参考下面这些查看日志的方法。

kube-apiserver 日志

1
2
PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-controller-manager 日志

1
2
PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-scheduler 日志

1
2
PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-dns 日志

1
2
PODNAME=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME -c kubedns

Kubelet 日志
查看 Kubelet 日志需要首先 SSH 登录到 Node 上。

journalctl -l -u kubelet
Kube-proxy 日志
Kube-proxy 通常以 DaemonSet 的方式部署

1
2
3
4
5
6
$ kubectl -n kube-system get pod -l component=kube-proxy
NAME READY STATUS RESTARTS AGE
kube-proxy-42zpn 1/1 Running 0 1d
kube-proxy-7gd4p 1/1 Running 0 3d
kube-proxy-87dbs 1/1 Running 0 4d
$ kubectl -n kube-system logs kube-proxy-42zpn

参考文档

官方文档:为系统守护进程预留计算资源

官方文档:节点压力驱逐

kubernetes集群节点资源预留

集群状态异常排错

为容器和 Pod 分配内存资源(有压力增长脚本)

Pod 问题排查

k8s节点资源预留与 pod 驱逐
kubernetes配置资源不足时的处理方式

------------- 本文结束 感谢您的阅读-------------