Prometheus监控Kubelet, kube-controller-manager 和 kube-scheduler

修订 kubelet 配置

在排查 Prometheus访问监控对象metrics连接被拒绝 时可以看到,Kubelet的metrics监控采集并不是 connection refused 报错,而是 server returned HTTP status 403 Forbidden

而且我也发现,并不是所有节点都出现 403 Forbidden ,管控服务器 control001control003 这3台服务器的kubelet是正常监控的(实际上工作节点采用了手工安装的定制 kubelet 软件包)

../../../_images/prometheus_monitor_kubelet_403_forbidden.png

对比检查了生产环境,管控服务器采集没有问题:

  • 比较异常节点和正常节点 kubelet 运行参数:

能够 通过 10250 端口访问 Metricskubelet 运行参数
/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 部署),对应配置:

默认 kubeadm 部署 kubelet 配置了 --authorization-mode=Webhook
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"

修订添加 --authentication-token-webhook=true ,即:

修订添加 --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 配置脚本

综合以上操作,可以使用如下脚本来修正:

修正 Kubelet, kube-controller-manager 和 kube-scheduler 配置,以便prometheus能够监控cadvisor
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-managerkube-scheduler 配置

kube-controller-managerkube-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
    

参考