prometheus-operator监控集群外的docker服务

20 篇文章 0 订阅
16 篇文章 1 订阅

 

这个主题网上可以搜到好多内容,如果直接照抄过来,还是不好用,应该是我没掌握原理。

10.10.14.2这个服务器并不在集群内,这个服务器上面跑的服务都是docker起的。prometheus-operator部署在集群内,想要通过prometheus-operator监控10.10.14.2这个服务器上的docker服务,以及该服务器本身的指标。

docker服务使用cadvisor来暴露指标,服务器本身的指标使用node-exporter来暴露。

首先在10.10.14.2这个服务器部署cadvisor和node-exporter

部署cadvisor

// 拉取cadvisor镜像
docker pull google/cadvisor:latest

// 使用特权模式运行cadvisor,由于该服务器上的8080端口已经被占用,这里把cadvisor的8080端口映射到8000端口
docker run -d -p 8000:8080 --name cadvisor  --privileged=true -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro google/cadvisor:latest

部署node-exporter

// 拉取node-exporter镜像。我的prometheus-operator里面的node-exporter版本为0.18.1,这里也跟着部署相同的版本
docker pull quay.io/prometheus/node-exporter:v0.18.1

// 运行node-exporter
docker run -d --name node-exporter -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host registry.local/cloudtogo/node-exporter:v0.18.1 --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($|/)"

prometheus-operator要监控集群外的服务需要定义对应的EndpointsServiceMonitor

我把这些docker服务和节点监控数据全部放入demo-system这个ns下。如果不设置默认是在default下。

编写docker容器的endpoints yaml,即docker-ep.yaml

kind: Endpoints
apiVersion: v1
metadata:
  name: demo-docker
  namespace: demo-system
  labels:
     cloudos: demo-docker
subsets:
  - addresses:
      - ip: 10.10.14.2 # ip为安装cadvisor服务器的ip
    ports:
      - name: metrics
        port: 8000 # cadvisor的8080端口映射到了8000端口

编写服务器endpoints yaml,即node-ep.yaml

kind: Endpoints
apiVersion: v1
metadata:
  name: demo-node
  namespace: demo-system
  labels:
    cloudos: demo-node
subsets:
  - addresses:
      - ip: 10.10.14.2 # ip为部署node-exporter的服务器ip
    ports:
      - name: metrics
        port: 9100 # node-exporter暴露在该服务器的9100端口

编写service monitor yaml,即customer-serviceMonitor.yaml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: demo
  namespace: demo-system
spec:
  endpoints:
    - interval: 15s
      port: metrics
      relabelings:
        # 对instance进行relabel
      - action: replace
        sourceLabels: ['__address__']
        separator: ':'
        regex: '(.*):.*'
        targetLabel:  'instance'
        replacement:   '${1}'
  selector: {}

可以看到在10.10.14.2上的docker服务cadvisor和node-exporter ,都已经被收集到了

 

如果我有另外好几台服务器也部署了相同的cadvisor和node-exporter,按照上面的做法就是有几台服务器就需要几个endpoints,servicemonitor可以继续使用同一个。

endpoints.subsets.address其实是个数组,如果有多个,则直接加入。
如新增10.10.14.3部署了cadvisor服务,那么只需要在docker-ep.yaml中添加10.10.14.3这个ip即可。

完整docker-ep.yaml如下

kind: Endpoints
apiVersion: v1
metadata:
  name: demo-docker
  namespace: demo-system
  labels:
    demo: demo-docker
subsets:
  - addresses:
      # 把使用docker部署的cadvisor即服务器ip加入这里
      - ip: 10.10.14.2
      - ip: 10.10.14.3
    ports:
      # 由于cadvisor暴露的端口相同,都是8000,这里无需做任何修改,可以适配所有情况
      - name: metrics
        port: 8000

 

 

如果只指定了Endpoints和ServiceMonitor,没有指定Service会存在一个问题,那就是一旦master关机后(reboot没有问题)再开机,创建的Endpoints对象就全部不见了。

这个现象也是无意之间发现的,当时还跟测试争论起来,因为大家都说没有删Endpoints,但是Endpoints就是不见了,后面才想起来master机器有被关机过,于是再关机验证一把问题就复现了。

在这里找到相关的信息参考:https://github.com/kubernetes/kubernetes/issues/12964

于是给Endpoints增加了对应的Service,即使后续关机,也没有任何影响了。
完整docker-service.yaml如下

apiVersion: v1
kind: Service
metadata:
  name: demo-docker
  namespace: demo-system
  labels:
    demo: demo-docker
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: cadvisor
    port: 8000
    protocol: TCP

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值