再次查看已经正常了
[root@uk8s-a kube-prometheus]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% 192.168.0.170 109m 5% 1362Mi 36% 192.168.0.183 65m 3% 1118Mi 30% 192.168.0.236 175m 8% 1581Mi 42% 192.168.0.243 118m 5% 1344Mi 36% 192.168.0.86 60m 3% 829Mi 22%实际排查后发现,是 kube-proxy 的 clusterCIDR写成了 service 的网段。
clusterCIDR: kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;
3.17.3 监控 etcd除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤如下:
第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项
第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象
第三步确保 Service 对象可以正确获取到 metrics 数据
对于 etcd 集群一般情况下,为了安全都会开启 https 证书认证的方式,所以要想让 Prometheus 访问到 etcd 集群的监控数据,就需要提供相应的证书校验。
首先我们将需要使用到的证书通过 secret 对象保存到集群中去:(在 etcd 运行的节点)
[root@uk8s-a ssl]# pwd /opt/etcd/ssl [root@uk8s-a ssl]# kubectl -n monitoring create secret generic etcd-certs --from-file=http://www.likecs.com/opt/kubernetes/ssl/server.pem --from-file=http://www.likecs.com/opt/kubernetes/ssl/server-key.pem --from-file=http://www.likecs.com/opt/kubernetes/ssl/ca.pem secret/etcd-certs createdPrometheus配置文件,将上面创建的 etcd-certs 对象配置到 prometheus 资源对象中
[root@uk8s-a manifests]# pwd /root/kube-prometheus/manifests [root@uk8s-a manifests]# vim prometheus-prometheus.yaml replicas: 2 secrets: - etcd-certs [root@uk8s-a manifests]# kubectl apply -f prometheus-prometheus.yaml prometheus.monitoring.coreos.com/k8s configured进入 pod 内查看证书是否存在
#等到pod重启后,进入pod查看是否可以看到证书 [root@uk8s-a kube-prometheus]# kubectl exec -it prometheus-k8s-0 -n monitoring -- sh Defaulting container name to prometheus. Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod. /prometheus $ ls /etc/prometheus/secrets/ etcd-certs /prometheus $ ls /etc/prometheus/secrets/ -l total 0 drwxrwsrwt 3 root 2000 140 Jun 27 04:59 etcd-certs /prometheus $ ls /etc/prometheus/secrets/etcd-certs/ -l total 0 lrwxrwxrwx 1 root root 13 Jun 27 04:59 ca.pem -> ..data/ca.pem lrwxrwxrwx 1 root root 21 Jun 27 04:59 server-key.pem -> ..data/server-key.pem lrwxrwxrwx 1 root root 17 Jun 27 04:59 server.pem -> ..data/server.pem创建 ServiceMonitor
现在 Prometheus 访问 etcd 集群的证书已经准备好了,接下来创建 ServiceMonitor 对象即可(prometheus-serviceMonitorEtcd.yaml)
$ vim prometheus-serviceMonitorEtcd.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: etcd-k8s namespace: monitoring labels: k8s-app: etcd-k8s spec: jobLabel: k8s-app endpoints: - port: port interval: 30s scheme: https tlsConfig: caFile: /etc/prometheus/secrets/etcd-certs/ca.pem certFile: /etc/prometheus/secrets/etcd-certs/server.pem keyFile: /etc/prometheus/secrets/etcd-certs/server-key.pem insecureSkipVerify: true selector: matchLabels: k8s-app: etcd namespaceSelector: matchNames: - kube-system $ kubectl apply -f prometheus-serviceMonitorEtcd.yaml上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor
对象,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd 这个 label 标签的
Service,jobLabel 表示用于检索 job 任务名称的标签,和前面不太一样的地方是 endpoints 属性的写法,配置上访问
etcd 的相关证书,endpoints 属性下面可以配置很多抓取的参数,比如 relabel、proxyUrl,tlsConfig
表示用于配置抓取监控数据端点的 tls 认证,由于证书 serverName 和 etcd 中签发的可能不匹配,所以加上了
insecureSkipVerify=true
创建 Service
ServiceMonitor 创建完成了,但是现在还没有关联的对应的 Service 对象,所以需要我们去手动创建一个 Service 对象(prometheus-etcdService.yaml):
$ vim prometheus-etcdService.yaml apiVersion: v1 kind: Service metadata: name: etcd-k8s namespace: kube-system labels: k8s-app: etcd spec: type: ClusterIP clusterIP: None ports: - name: port port: 2379 protocol: TCP --- apiVersion: v1 kind: Endpoints metadata: name: etcd-k8s namespace: kube-system labels: k8s-app: etcd subsets: - addresses: - ip: 10.10.10.128 - ip: 10.10.10.129 - ip: 10.10.10.130 ports: - name: port port: 2379 protocol: TCP $ kubectl apply -f prometheus-etcdService.yaml等待一会儿就可以看到 target 已经包含了
![image-20200627131634303](/Users/liyongjian/Library/Application Support/typora-user-images/image-20200627131634303.png)
数据采集到后,可以在 grafana 中导入编号为3070的 dashboard,获取到 etcd 的监控图表。