Kubernetes Prometheus 监控

入门参考Prometheus官方文档 Promrthes Oprerator官网 托管Github项目地址

Prometheus-operator

Prometheus是一个集数据收集存储,数据查询,数据图表显示于一身的开源监控组件,Prometheus结构图

prometheus

因为是prometheus主动去拉取的,所以在k8s里pod因为调度的原因导致pod的ip会发生变化,人工不可能去维持,自动发现有基于DNS的,但是新增还是有点麻烦

Prometheus-operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator这个controller有BRAC权限下去负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作

在Kubernetes中我们使用Deployment、DamenSet,StatefulSet来管理应用Workload,使用Service,Ingress来管理应用的访问方式,使用ConfigMap和Secret来管理应用配置。我们在集群中对这些资源的创建,更新,删除的动作都会被转换为事件(Event),Kubernetes的Controller Manager负责监听这些事件并触发相应的任务来满足用户的期望。这种方式我们成为声明式,用户只需要关心应用程序的最终状态,其它的都通过Kubernetes来帮助我们完成,通过这种方式可以大大简化应用的配置管理复杂度。

而除了这些原生的Resource资源以外,Kubernetes还允许用户添加自己的自定义资源(Custom Resource)。并且通过实现自定义Controller来实现对Kubernetes的扩展,不需要用户去二开k8s也能达到给k8s添加功能和对象

因为svc的负载均衡,所以在K8S里监控metrics基本最小单位都是一个svc背后的pod为target,所以prometheus-operator创建了对应的CRD: kind: ServiceMonitor ,创建的ServiceMonitor里声明需要监控选中的svc的label以及metrics的url路径的和namespaces即可

prometheus-operator是由coreos开源一套在k8s上管理应用的软件,通过operator可以方便的实现部署,扩容,删除应用等功能,利用k8s的CustomResourceDefinitions功能实现了只需要像写原生kubectl支持的yaml文件一样,轻松收集应用数据,配置报警规则等,包含如下自定义资源定义CRD:

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

工作架构如下图所示

prometheus-operator

部署

收集kube-controller-manager,kube-scheduler数据,需要配置组件监听0.0.0.0地址

以二进制部署的集群在配置文件(kube-controller-manager,kube-scheduler)添加如下参数 –address=0.0.0.0

使用kubeadm部署的集群,可使用如下命令修改

1
2
sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml

收集kubelet相关数据时需要配置kubelet使用如下认证方式。使用kubeadm默认情况下已经开启

二进制部署集群:在kubelet配置文件添加参数

1
2
--authentication-token-webhook=true
--authorization-mode=Webhook
部署metric-server

使用metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等,从 v1.8 开始,资源使用情况的度量(如容器的 CPU 和内存使用)可以通过 Metrics API 获取。

  • Metrics API 只可以查询当前的度量数据,并不保存历史数据
  • Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护
  • 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    # 下载
    git clone https://github.com/kubernetes-incubator/metrics-server.git
    
    cd metrics-server/deploy/1.8+/
    
    # 替换metrics-server-deployment.yaml谷歌镜像
    sed -i "s#k8s.gcr.io#zhengwei919#g" metrics-server-deployment.yaml
    
    # 部署
    kubectl create -f ./
    
    # 查看
    kubectl top node
部署 Prometheus Operator
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 下载
git clone https://github.com/mgxian/k8s-monitor.git

cd prometheus-operator/contrib/kube-prometheus/manifests

# 把文件分下类
mkdir -p operator node-exporter alertmanager grafana kube-state-metrics prometheus serviceMonitor adapter
mv *-serviceMonitor* serviceMonitor/
mv 0prometheus-operator* operator/
mv grafana-* grafana/
mv kube-state-metrics-* kube-state-metrics/
mv alertmanager-* alertmanager/
mv node-exporter-* node-exporter/
mv prometheus-adapter* adapter/
mv prometheus-* prometheus/

# 创建ns和替换谷歌镜像,嫌慢的可以把所有镜像先下载下来
kubectl create -f 00namespace-namespace.yaml

sed -i "s#k8s.gcr.io#zhengwei919#" kube-state-metrics/kube-state-metrics-deployment.yaml

kubectl apply -f operator/

# 确认状态后在往后执行
kubectl get po -n monitoring
NAME                                   READY   STATUS    RESTARTS   AGE
prometheus-operator-7cb68545c6-4lwth   1/1     Running   0          16h

# 部署整套CRD,拉镜像可能要很久,可以提前下载镜像
kubectl apply -f adapter/
kubectl apply -f alertmanager/
kubectl apply -f node-exporter/
kubectl apply -f kube-state-metrics/
kubectl apply -f grafana/
kubectl apply -f prometheus/
kubectl apply -f serviceMonitor/

kubectl -n monitoring get all
创建 ingress

Prometheus server的服务访问,用ingress,ingress怎么部署参照上一篇traefik-ingress

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
vim pro-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: prometheus-ing
  namespace: monitoring
spec:
  rules:
  - host: prometheus.monitoring.k8s.local
    http:
      paths:
      - backend:
          serviceName: prometheus-k8s
          servicePort: 9090
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana-ing
  namespace: monitoring
spec:
  rules:
  - host: grafana.monitoring.k8s.local
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: 3000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: alertmanager-ing
  namespace: monitoring
spec:
  rules:
  - host: alertmanager.monitoring.k8s.local
    http:
      paths:
      - backend:
          serviceName: alertmanager-main
          servicePort: 9093

kubectl create -f pro-ingress.yaml
访问页面

通过浏览器查看prometheus.monitoring.k8s.local与grafana.monitoring.k8s.local是否正常,若沒问题就可以看到下图结果,grafana初始用股名和密码是admin

prometheus-targets

grafana