Prometheus Operator和kube-prometheus

处理直接在k8s中部署Prometheus,还可以先部署Prometheus Operator,通过它来部署Prometheus:
 
在部署Operator控制器前,需要创建5个CRD:
  • Prometheus
作为Prometheus Server的抽象
  • ServiceMonitor
作为各种exporter(专门提供metrics数据接口的工具)的抽象
Prometheus通过ServiceMonitor提供的metrics数据接口pull数据的。
一个ServiceMonitor可以通过labelSelector的方式去匹配一类Service,Prometheus也可以通过labelSelector去匹配多个ServiceMonitor;
  • alertmanager
作为AlertManager的抽象
  • PrometheusRule
被Prometheus实例使用的报警规则文件
  • PodMonitor
定义了监控哪些Pod
 
后来又新增了3个:
  • Probe
定义了静态监控目标
  • ThanosRuler
  • AlertmanagerConfig
定义了该Namespace下的Alertmanager配置
 
Operator作为控制器,会去创建这些资源对象,然后一直监控并维持它们的状态
直接操作这些资源对象,就可以在集群中监控数据
 
prometheus提供了kube-prometheus项目,默认将Operator默认部署在名为monitoring的namespace,还提供了以下组件的yaml文件:
  • grafana
  • node-exporter
  • alart-manager
  • prometheus
根据prometheus-prometheus.yaml等文件的描述,以statefulset方式启动的Prometheus Server,从node-exporter、cadvisor拉取数据并存储为时序数据。
自带的UI监听在9090端口,建议改成NodePort方式对外暴露
  • kube-state-metrics
监听k8s apiserver中各个对象(deployment、Pod、Node等)的事件,对外提供metrics
  • k8s-prometheus-adpater
它是一个API服务器,提供了一个APIServer服务,名为custom-metrics-apiserver,这个自定义APIServer通过Kubernetes aggregator聚合到apiserver
将prometheus中可以用PromQL查询到的指标数据转换成k8s对应的数据格式,在API组custom.metrics.k8s.io中提供出来
 
 
其它
cadvisor:集成于kubelet中的cAdvisor模块负责采集运行于当前节点上所有Pod资源(cpu、memory、network、filesystem等)使用情况,按Node、Pod、Container三种级别计算汇总后,通过/stats/summary 和/metrics/cadvisor两个接口分别向metrics-server提供核心监控指标、向Prometheus提供业务监控指标
 
通过ServiceMonitor监控etcd:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: etcd
  name: etcd
  namespace: monitoring
spec:
  endpoints:
  - interval: 30s
    port: https-metrics
    scheme: https
    tlsConfig:
      insecureSkipVerify: true
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: etcd
此处insecureSkipVerify: true表示跳过证书认证
 
如果不允许跳过,需要预先把证书配到prometheus里
(1)使用给etcd签名的CA公钥、进行healthcheck的客户端公钥私钥创建secret:
kubectl -n monitoring create secret generic etcd-certs --from-file=xxx --from-file=xxx --from-file=xxx
(2)描述prometheus状态的自定义资源对象prometheus里,添加此secret:
    secret:
    - etcd-certs
prometheus会将这三个文件放在/etc/prometheus/secrets/etcd-certs下
(3)tlsConfig改成:
    tlsConfig:
      caFile: /etc/prometheus/secrets/etcd-certs/xxx
      certFile: /etc/prometheus/secrets/etcd-certs/xxx
      keyFile: /etc/prometheus/secrets/etcd-certs/xxx
 
如果etcd不是k8s内部服务方式部署的,需要自己创建service:
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: etcd
  name: etcd
  namespace: kube-system
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: https-metrics
    port: 2379
    protocol: TCP
    targetPort: 2379
自己配置endpoints:
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    k8s-app: etcd
  name: etcd
  namespace: kube-system
subsets:
- addresses:
  - ip: 132.252.136.99
  - ip: 132.252.136.100
  - ip: 132.252.136.101
  - ip: 132.252.136.102
  - ip: 132.252.136.103
  ports:
  - name: https-metrics
    port: 2379
    protocol: TCP
kube-proxy配置同理
 
kube-prometheus已经提供了kube-controller-manager、kube-scheduler的ServiceMonitor,但如果是二进制部署的,同样需要创建service,并且修改k8s自带的endpoints
 
kube-apiserver、kubelet等的ServiceMonitor同样已提供,但即使是二进制部署,也不需要再自行创建它们的service和endpoints
 
此外,还默认集成了coredns的ServiceMonitor
posted @ 2021-06-20 12:18  扬羽流风  阅读(1337)  评论(0编辑  收藏  举报