vincentgao 1、环境描述 k8s版本:1.15.11 k8s部署方式:二进制手动部署,kube-apiserver、kube-scheduler、kube-controller-manager用systemd托管运行在host上 kubsphere版本:2.1.0 kubsphere部署方式:采用在已有k8s集群上部署kubesphere方式(后面简称ks) 2、问题描述 ks最小化安装正常部署,但是发现apiserver和scheduler没有监控数据,一片空白,现象如下: 3、基本排查过程 首先明白的是ks的监控是基于prometheus实现的,所以你需要懂一点prometheus的知识,此外你还需要懂prometheus在k8s最佳实践方式也就是prometheus operator,也就是把prometheus当作k8s的crd来操作,这样我们对prometheus的配置就是对k8s的资源的修改配置,是不是很牛逼?(建立大家往下读可以参考prometheus官网了解下这块:https://github.com/coreos/prometheus-operator) 接下来,我们看看ks是怎么做的,我们首先看看ks在我的集群里面启动了那些监控pod: 这其中prometheus-k8s-system-0就是用来监控我们的系统服务指标的pod实例,也就是kube-apiserver、kube-scheduler、kube-controller-manager等,我们可以看看这个容器的配置文件对监控项的配置: 这个是用来给prometheus实例提供配置的,我们进入查看: 可以确定,对于prometheus来说,是确实配置了相关的监控。那么我们采集不到数据,基本只能确定prometheus没有发现需要采集的target或者发现了但是没法链接(其实很容想到这个,人都配置监控,但是没数据,要么连接不上,要么没发现监控目标)。 监控是采用自动发现配置,这点可以从配置中看到,基本都是通过endpoints发现的: 以apiserver为例,我们看看它是怎么发现的: 看见我标记的几个部分么,这就是自动发现的条件,在defaut ns里面,采用https方式抓去metrics,证书设置,servername: kubernetes。其实kube-apiserver,就是我们安装好k8s集群默认第一个service: 也就是说,prometheus pod实例会通过https访问这个服务的6443端口来采集metrics,但是prometheus怎么发现这个service的呢,其实是通过service monitor来关联,service monitor是exporter的抽象,我们看看ks的service monitor: 我们看看这个service monitor的配置: 意思就是在default ns中,带有component: apiserver、provider: kubernetes的service都会被监控起来,我们接下来看看kube-apiserver的service: 到这里,感觉都没什么问题,从prometheus配置到service monitor再到service都是匹配的,我们再看看这个service背后的endpoints: 也就是说,prometheus server肯定能发现这个endpoints,我们在容器里面ping一下看看: 到这里验证了我说的,prometheus是可以发现监控target的,那就是连接出问题,没办法。我们看看prometheus实例的service: 这个svc没有cluster ip,我没办法从浏览器登录,只有自己再创建一个service映射到node一个port(创建过程我就不写了),就是上图的prometheus-k8s-system01,目的是为了从浏览器看看当前所有target的状态,浏览器打开:node_ip:22222: 果然如我所测,能发现target,但是状态是down,看错误是证书出了问题。本来k8s集群是正常运行的,我所有的证书都是有一个根ca颁发的,我特意验证了pod中和我host上的证书md5值,确实一样: 仔细查看提示报错,告诉我们好像是域不对,还记得我们当时查看pod中的配置么,有个servername:kubernetes,其实只要更改这个就行,改成满足错误提示中的任意一个都可以,但是那个是pod配置,我不想改动。于是只有修改apiserver的证书,因为我的证书也没有这个域,原来的我的证书请求模版如下,注意没有“kubernetes”: 我改了这个证书请求模版重新利用根ca生成了一套证书: cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr-01.json|cfssljson -bare apiserver01 然后用新生成的替换了apiserver中的需要的证书: 最后重启apiserver服务,这个不我就不在赘述了,注意所有的master节点都需要替换,接下来就可以发现了: 刷新ks监控面板,发现apiserver就有数据了: 4、总结 第一,ks的监控使用prometheus operator方式,你必须对prometheus有了解才行,至少能看懂其配置文件,知道prometheus做了什么事情。 第二,你必须对证书有了解,我这里只替换了apiserver服务端证书,这里apiserver是作为服务端存在,prometheus作为客户端访问,所以只需要替换服务端证书。 第三,排查问题不要急,顺藤摸瓜,顺源头捋下来,抽丝剥茧,就可以找到答案。 5、后续 这里kube scheduler和kube controller manager的方式和这个是一样的,我就没有详细,下次再补上,其实就是二进制部署的话是缺失这两个服务的endpoints,所以当然采集不到数据了。后续我再补上来,也顺便讲下我是如何对接外部etcd集群的,先放图: etcd监控 kube-scheduler监控
xuanyuanaosheng vincentgao Feynman 您好,通过二进制的方式部署k8s后再安装kubesphere 3.0,再监控kube-apiserver、kube-scheduler、kube-controller-manager的时候都会出问题 ? 请问您能分析一下么?