怎么使用Prometheus Operator监控k8s集群外服务器

这是《Golang 微服务监控浅谈》的子篇,本篇介绍一下怎么使用kubernetes prometheus operator监控集群外部节点。

一、 什么是Prometheus Operator?

Prometheus Operator(下面简称PO) 是一个流行的k8s集群监控套件,项目地址:https://github.com/prometheus-operator/kube-prometheus。
Prometheus可以通过ServiceMonitor来定义你的服务监控规则规则,具体的prometheus配置规则不在本篇讨论范围,感兴趣的朋友可以翻翻PO的配置 ,这里面有各种工作负载的配置方法。

二、在k8s中监控外部资源

本文介绍了怎么使用ServiceMonitor采集node_expoter数据,其他业务监控基本类似,可以通过《Golang 微服务监控浅谈》看到监控业务服务的案例。

1.外部服务器安装expoter

docker安装node_expoter
docker run -d --name=node_exporter \
--restart=always \
-v /:/host:ro,rslave \
-p 10.150.22.2:9100:9100 \
prom/node-exporter:latest \
--path.rootfs=/host

本篇旨在介绍怎么在k8s中监控外部资源,当然不仅限于node,可以是任意类型的服务,比如Mysql、Redis、etcd等。案例中10.150.22.2非集群节点。

2.为外部资源(服务器)创建Service

外部资源的服务定义与普通服务定义非常相似,不需要定义Pod Selector。

Kubernetes Service配置
cat <<EOF  |  kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
app.kubernetes.io/name: node-exporter
spec:
type: ClusterIP
ports:
- name: metrics
port: 9100
protocol: TCP
targetPort: 9100
EOF

这样我就有了一个无POD的service,但目前这个svc并不能访问,因为缺少Endpoint。

3.为Service创建一个Endpoints

Kubernetes endpoints
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Endpoints
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
app.kubernetes.io/name: node-exporter
subsets:
- addresses:
- ip: 10.150.22.2 # 这里是外部资源列表
ports:
- name: metrics
port: 9100
EOF
检查Service于Endpoints是否正常产生关联
kubectl describe svc -n monitoring node-exporter
查看Endpoint部分时候包含了上面的IP列表,如果没有再次检查上面的的配置正否正确。
Name:              node-exporter
Namespace: monitoring
...
Port: metrics 9100/TCP
TargetPort: 9100/TCP
Endpoints: 10.150.22.2:9100

需要注意的是Service名称必须和Endpoints名称一致才能使用Service指向对应的资源

4.配置ServiceMonitor

服务创建完成需要配置一个ServiceMonitor来监控服务监控采集地址,默认情况下监控采集地址为 http://:/metrics。

配置ServiceMonitor
cat << EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
release: prometheus
spec:
selector:
matchLabels: #Service选择器
app: node-exporter
namespaceSelector: #Namespace选择器
matchNames:
- monitoring
endpoints:
- port: metrics #采集节点端口(svc定义)
interval: 10s #采集频率根据实际需求配置,prometheus默认15s
path: /metrics #默认地址/metrics
EOF

更多关于ServiceMonitor的配置可以使用explain功能

kubectl explain
kubectl explain ServiceMonitor.spec.endpoints

5.Kubernetes集群中查看监控数据

1、) Prometheus Targets

2、) Grafana Dashboard