kubeadm搭建K8s 1.16.4集群,Prometheus缺失APIServiceRegistrationController指标
我之前也碰到过类似的K8s控制器监控指标找不到的情况,结合你用kubeadm部署的1.16.4版本集群+kube-prometheus的场景,给你整理几个关键排查方向:
1. 先确认kube-controller-manager的metrics是否正常暴露
APIServiceRegistrationController是kube-controller-manager的核心控制器之一,它的指标由kube-controller-manager生成。在kubeadm默认部署的集群里,kube-controller-manager有时候会把metrics端点绑定在127.0.0.1,导致Prometheus抓不到:
- 登录控制节点,打开
/etc/kubernetes/manifests/kube-controller-manager.yaml文件,检查启动参数:
要确保有--bind-address=0.0.0.0(允许集群内其他组件访问)和--metrics-bind-address=0.0.0.0:10252(明确暴露metrics端口)。如果原来的bind-address是127.0.0.1,修改后保存,kubelet会自动重启这个Pod。
2. 手动验证指标是否存在
改完配置后,找个集群内的Pod(比如直接进Prometheus Pod),用curl访问kube-controller-manager的metrics端点:
curl http://kube-controller-manager.kube-system.svc:10252/metrics | grep APIServiceRegistrationController
如果能搜到你要的那些指标,说明组件本身没问题,问题出在Prometheus的采集配置;如果搜不到,那就要检查kube-controller-manager的日志,看有没有指标生成相关的报错。
3. 检查kube-prometheus的采集规则
kube-prometheus默认应该会采集kube-controller-manager的指标,但可能因为版本适配或者配置缺失,没加上这个采集目标:
- 先看看有没有对应的ServiceMonitor:
如果找不到kubectl get servicemonitors -n kube-prometheuskube-controller-manager相关的ServiceMonitor,就手动创建一个,示例配置如下(注意要匹配你集群里的标签和TLS配置):apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kube-controller-manager namespace: kube-prometheus labels: release: prometheus # 要和你的Prometheus实例标签匹配 spec: endpoints: - port: https-metrics scheme: https tlsConfig: insecureSkipVerify: true # 集群默认自签证书,跳过验证 selector: matchLabels: k8s-app: kube-controller-manager # 匹配kube-controller-manager Service的标签 namespaceSelector: matchNames: - kube-system
4. 注意版本兼容性问题
K8s 1.16.4是比较老的版本了(2019年的版本),而kube-prometheus的新版本可能不再适配这么旧的K8s。比如kube-prometheus v0.7.x系列是专门适配K8s 1.16-1.19的,如果你装的是v0.10及以上的版本,很可能会出现采集不兼容的情况,建议降级到对应版本的kube-prometheus。
5. 检查Prometheus的Target状态
最后,进Prometheus UI的Status -> Targets页面,看看kube-controller-manager这个target是不是处于UP状态。如果是DOWN,页面上会显示错误原因,比如连接超时、TLS认证失败,照着这些提示去排查网络或者证书问题就行。
如果以上步骤都试过还是找不到指标,可能需要确认一下K8s 1.16.4是否确实支持这些指标——理论上是支持的,这些控制器指标在更早的版本就已经上线了,所以大概率还是配置或者采集的问题。
内容的提问来源于stack exchange,提问作者hwdef

