Prometheus监控Kubelet, kube-controller-manager 和 kube-scheduler¶
修订 kubelet
配置¶
在排查 Prometheus访问监控对象metrics连接被拒绝 时可以看到,Kubelet的metrics监控采集并不是 connection refused
报错,而是 server returned HTTP status 403 Forbidden
而且我也发现,并不是所有节点都出现 403 Forbidden
,管控服务器 control001
到 control003
这3台服务器的kubelet是正常监控的(实际上工作节点采用了手工安装的定制 kubelet
软件包)
对比检查了生产环境,管控服务器采集没有问题:
比较异常节点和正常节点
kubelet
运行参数:
/usr/local/bin/kubelet \
--logtostderr=true \
--v=2 \
--node-ip=172.21.44.240 \
--hostname-override=control001 \
--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
--config=/etc/kubernetes/kubelet-config.yaml \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--container-runtime=remote \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--runtime-cgroups=/systemd/system.slice \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin
异常的节点采用了非常复杂的 kubelet
参数,其中影响的参数如下:
--authorization-mode=Webhook
这个参数配置在 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
中(如果你使用了 kubeadm
部署),对应配置:
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
修订添加 --authentication-token-webhook=true
,即:
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt --authentication-token-webhook=true"
此外,部署中可能还有如下禁止 cadvisor-port
配置,也需要移除:
cadvisor-port=0
完成修订之后,需要重启 kubelet
服务
修复 kubelet
配置脚本¶
综合以上操作,可以使用如下脚本来修正:
KUBEADM_SYSTEMD_CONF=/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sed -e "/cadvisor-port=0/d" -i "$KUBEADM_SYSTEMD_CONF"
if ! grep -q "authentication-token-webhook=true" "$KUBEADM_SYSTEMD_CONF"; then
sed -e "s/--authorization-mode=Webhook/--authentication-token-webhook=true --authorization-mode=Webhook/" -i "$KUBEADM_SYSTEMD_CONF"
fi
systemctl daemon-reload
systemctl restart kubelet
修订 kube-controller-manager
和 kube-scheduler
配置¶
kube-controller-manager
和 kube-scheduler
默认无法被 Prometheus监控 监控是因为其默认 metrics
只在回环地址 127.0.0.1
上提供。由于 kubeadm
部署的管控服务都是采用 静态Pods (通过 kubelet
确保 pod
始终运行),所以修订 /etc/kubernetes/manifest/
目录下对应配置:
/etc/kubernetes/manifest/kube-controller-manager.yaml
... - --bind-address=0.0.0.0 ... - --port=10252
/etc/kubernetes/manifest/kube-scheduler.yaml
... - --bind-address=0.0.0.0 ... - --port=10251