沪ICP备2021032517号-1

Kuberntes集群部署Prometheus

  |   0 评论   |   0 浏览

参考文档

实验环境

kubernetes 1.17.0

Master01  10.10.2.30
Master02  10.10.2.31
Master03  10.10.2.32
Node01    10.10.2.33
Node02    10.10.2.34

prometheus架构

image.png

流程图

image.png

各节点作用

  • 使用metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等
  • 使用prometheus-operator部署prometheus,根据 ServiceMonitor 动态更新 Prometheus Server 的监控对象。
  • 使用kube-state-metrics收集k8s集群内资源对象数据
  • 使用node_exporter收集目标对象(host, container...)的性能数据,并通过 HTTP 接口供 Prometheus Server 获取。
  • 使用alertmanager实现监控报警
  • 使用grafana实现数据可视化
  • prometheus-adapter将这些指标数据查询接口转换为标准的Kubernetes自定义指标。

prometheus-operator利用k8s的CustomResourceDefinitions功能实现了只需要像写原生kubectl支持的yaml文件一样,轻松收集应用数据,配置报警规则等,包含如下CRDs :

  • ServiceMonitor 用于配置数据收集,创建之后会根据DNS自动发现并收集数据
  • PrometheusRule 用于配置Prometheus 规则,处理规整数据和配置报警规则
  • Alertmanager 用于部署报警实例

部署 prometheus-operator 到 Kuberntes 集群

git clone https://github.com/coreos/kube-prometheus.git

kubectl create -f manifests/setup

kubectl create -f manifests/

查看创建的服务

image.png


image.png

可以看到上面针对 grafana 和 prometheus 都创建了一个类型为 ClusterIP 的 Service,当然如果我们想要在外网访问这两个服务的话可以通过创建对应的 Ingress 对象或者使用 NodePort 类型的 Service,我们这里创建 grafana 和 prometheus-k8s 这两个 Service的ingress

使用Ingress需要在集群先配置Ingress控制器,否则无法使用ingress

grafana-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: grafana.ui
    http:
      paths:
      - path: /
        backend:
          serviceName: grafana
          servicePort: http

prometheus-k8s-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: prometheus-k8s
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: prometheus-k8s.ui
    http:
      paths:
      - path: /
        backend:
          serviceName: prometheus-k8s
          servicePort: web

查看是否配置正确

image.png

image.png

客户端访问(需要添加域名和主机的映射关系)

image.png

image.png


image.png

ControllerManager、Scheduler 状态不正常,其他都正常

解决

因为serviceMonitor是根据label去选取svc的,我们可以看到对应的 serviceMonitor是选取的ns范围是 kube-system

而kube-system里默认只有这俩svc,没有ControllerManager、Scheduler的 svc

image.png

所以这里我们创建两个管理组建的svc,名字无所谓,关键是svc的label要能被servicemonitor选中

[root@Master01 manifests]# cat controller-manger_scheduler.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-controller-manager
  labels:
    k8s-app: kube-controller-manager
spec:
  selector:
    component: kube-controller-manager
  type: ClusterIP
  clusterIP: None
  ports:
  - name: http-metrics
    port: 10252
    targetPort: 10252
    protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-scheduler
  labels:
    k8s-app: kube-scheduler
spec:
  selector:
    component: kube-scheduler
  type: ClusterIP
  clusterIP: None
  ports:
  - name: http-metrics
    port: 10251
    targetPort: 10251
    protocol: TCP

kubectl apply -f controller-manger_scheduler.yaml

kubectl apply -f controller-manger_scheduler.yaml
kubectl apply -f controller-manger_scheduler.yaml

再去查看状态

image.png

已恢复正常

Prometheus Operator 添加自定义的监控项

除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项

  • 第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项
  • 第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象
  • 第三步确保 Service 对象可以正确获取到 metrics 数据

背景:

比如我现在需要通过exporter暴露的方式,通过Kubernetes集群中的Promethus监控一个位于Kubernetes集群外的Hbase主机的相关信息。

  1. 到需要被监控的主机安装 exporter

    wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz

    tar -zxf node_exporter-0.18.1.linux-amd64.tar.gz

    mv node_exporter-0.18.1.linux-amd64 exporter

    cd exporter/

启动

nohup ./node_exporter > /dev/null &

nohup ./node_exporter > /dev/null &
nohup ./node_exporter > /dev/null &

检查是否成功启动

http://10.10.0.17:9100/metrics

http://10.10.0.17:9100/metrics
http://10.10.0.17:9100/metrics

至此 exporter 客户端部署完成

  1. 建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项

cat hbase-serviceMonitor.yaml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: hbase
  namespace: monitoring
  labels:
    k8s-app: hbase
spec:
  jobLabel: k8s-app
  endpoints:
  - port: port
    interval: 30s
    scheme: http
  selector:
    matchLabels:
      k8s-app: hbase
  namespaceSelector:
    matchNames:
    - monitoring
  1. 为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象

下面创建的 Service 没有采用前面通过 label 标签的形式去匹配 Pod 的做法,因为前面我们说过很多时候我们创建的 被监控主机是独立于集群之外的,这种情况下面我们就需要自定义一个 Endpoints,要注意 metadata 区域的内容要和 Service 保持一致,Service 的 clusterIP 设置为 None。

[root@Master01 hbase]# cat hbase-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: hbase
  namespace: monitoring
  labels:
    k8s-app: hbase
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: port
    port: 9100
    protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
  name: hbase
  namespace: monitoring
  labels:
    k8s-app: hbase
subsets:
- addresses:
  - ip: 10.10.0.17
  ports:
  - name: port
    port: 9100
    protocol: TCP

创建上面的资源

kubectl apply -f hbase-serviceMonitor.yaml

kubectl apply -f hbase-service.yaml

kubectl apply -f hbase-serviceMonitor.yaml

kubectl apply -f hbase-service.yaml
kubectl apply -f hbase-serviceMonitor.yaml

kubectl apply -f hbase-service.yaml

等待一会到Prometheus查看上面创建的资源

image.png

  1. 验证Service 对象可以正确获取到 metrics 数据

上面数据采集到后,可以在 grafana 中导入编号为 9276的 dashboard 模板

image.png

image.png

image.png

注意上面的 分组名称 选择已创建的自定义项 就可以看到自定义主机的监控详情

grafana 监控模板 编号参考 如下

第一部分

第二部分

  • 监控物理机/虚拟机(linux)
    推荐ID
  • 8919
  • 9276
  • 监控物理机/虚拟机(windows)
    推荐ID
  • 10467
  • 10171
  • 2129

第三部分

  • 监控协议http/icmp/tcp/dns/
    • http监控某个网站
    • icmp监控某台机器
    • tcp监控某个端口
    • dns监控dns
      推荐ID
  • 9965
  • 优化9965

上面是主机的监控,下面介绍中间件Hbase的监控

待续----

报警规则

待续----

Rancher prometheus添加自定义serviceMonitor

添加一个匹配所有空间权限rbac认证

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus-operator-monitoring-operator
  namespace: cattle-prometheus

注意上面的 ServiceAccount 及所在的 namespace 如下,要事先确认。

image.png

serviceMontor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: prometheus
  name: spring-prometheus
  namespace: cattle-prometheus
spec:
  endpoints:
  - interval: 30s
    port: http
    path: '/actuator/prometheus'
  selector:
    matchLabels:
      monitor: prometheus
  namespaceSelector:
    any: true


标题:Kuberntes集群部署Prometheus
作者:zifuy
地址:https://www.zifuy.cn/articles/2019/10/13/1570935776522.html