我踩的坑
一、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 | journalctl -l -u kube-apiserver |
或者直接查看日志文件
1 | /var/log/kube-apiserver.log |
而对于使用 Static Pod 部署集群控制平面服务的场景,可以参考下面这些查看日志的方法。
kube-apiserver 日志
1 | PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}') |
kube-controller-manager 日志
1 | PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}') |
kube-scheduler 日志
1 | PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}') |
kube-dns 日志
1 | PODNAME=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}') |
Kubelet 日志
查看 Kubelet 日志需要首先 SSH 登录到 Node 上。
journalctl -l -u kubelet
Kube-proxy 日志
Kube-proxy 通常以 DaemonSet 的方式部署
1 | kubectl -n kube-system get pod -l component=kube-proxy |