Kubernetes 系列(六):Kubernetes部署Prometheus监控

摘要:
新建一个yaml文件命名为config-map.yaml,写入如下内容:apiVersion:v1kind:ConfigMapmetadata:name:prometheus-server-conflabels:name:prometheus-server-confnamespace:monitoringdata:prometheus.yml:|-global:scrape_interval:5sevaluation_interval:5sscrape_configs:-job_name:'kubernetes-apiservers'kubernetes_sd_configs:-role:endpointsscheme:httpstls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:-source_labels:[__meta_kubernetes_namespace,__meta_kubernetes_service_name,__meta_kubernetes_endpoint_port_name]action:keepregex:default;kubernetes;https-job_name:'kubernetes-nodes'scheme:httpstls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:-role:noderelabel_configs:-action:labelmapregex:__meta_kubernetes_node_label_(.+)-target_label:__address__replacement:kubernetes.default.svc:443-source_labels:[__meta_kubernetes_node_name]regex:(.+)target_label:__metrics_path__replacement:/api/v1/nodes/${1}/proxy/metrics-job_name:'kubernetes-pods'kubernetes_sd_configs:-role:podrelabel_configs:-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_scrape]action:keepregex:true-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_path]action:replacetarget_label:__metrics_path__regex:(.+)-source_labels:[__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]action:replaceregex:(?

1.创建命名空间

新建一个yaml文件命名为monitor-namespace.yaml,写入如下内容:

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring

执行如下命令创建monitoring命名空间:

kubectl create -f monitor-namespace.yaml

2.创建ClusterRole

你需要对上面创建的命名空间分配集群的读取权限,以便Prometheus可以通过Kubernetes的API获取集群的资源目标。

新建一个yaml文件命名为cluster-role.yaml,写入如下内容:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  -nodes
  - nodes/proxy
  -services
  -endpoints
  -pods
  verbs: ["get", "list", "watch"]
-apiGroups:
  -extensions
  resources:
  -ingresses
  verbs: ["get", "list", "watch"]
- 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: default
  namespace: monitoring

执行如下命令创建:

kubectl create -f cluster-role.yaml

3.创建Config Map

我们需要创建一个Config Map保存后面创建Prometheus容器用到的一些配置,这些配置包含了从Kubernetes集群中动态发现pods和运行中的服务。
新建一个yaml文件命名为config-map.yaml,写入如下内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-server-conf
  labels:
    name: prometheus-server-conf
  namespace: monitoring
data:
  prometheus.yml: |-
    global:
      scrape_interval: 5s
      evaluation_interval: 5s
    scrape_configs:
      - job_name: 'kubernetes-apiservers'
        kubernetes_sd_configs:
        -role: endpoints
        scheme: https
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        -source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
      - job_name: 'kubernetes-nodes'
        scheme: https
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        kubernetes_sd_configs:
        -role: node
        relabel_configs:
        -action: labelmap
          regex: __meta_kubernetes_node_label_(.+)
        -target_label: __address__
          replacement: kubernetes.default.svc:443
        -source_labels: [__meta_kubernetes_node_name]
          regex: (.+)
          target_label: __metrics_path__
          replacement: /api/v1/nodes/${1}/proxy/metrics
      - job_name: 'kubernetes-pods'
        kubernetes_sd_configs:
        -role: pod
        relabel_configs:
        -source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        -source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        -source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
          action: replace
          regex: ([^:]+)(?::d+)?;(d+)
          replacement: $1:$2
          target_label: __address__
        -action: labelmap
          regex: __meta_kubernetes_pod_label_(.+)
        -source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        -source_labels: [__meta_kubernetes_pod_name]
          action: replace
          target_label: kubernetes_pod_name
      - job_name: 'kubernetes-cadvisor'
        scheme: https
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        kubernetes_sd_configs:
        -role: node
        relabel_configs:
        -action: labelmap
          regex: __meta_kubernetes_node_label_(.+)
        -target_label: __address__
          replacement: kubernetes.default.svc:443
        -source_labels: [__meta_kubernetes_node_name]
          regex: (.+)
          target_label: __metrics_path__
          replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
      - job_name: 'kubernetes-service-endpoints'
        kubernetes_sd_configs:
        -role: endpoints
        relabel_configs:
        -source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        -source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
          action: replace
          target_label: __scheme__
          regex: (https?)
        -source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        -source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
          action: replace
          target_label: __address__
          regex: ([^:]+)(?::d+)?;(d+)
          replacement: $1:$2
        -action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        -source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        -source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: kubernetes_name

执行如下命令进行创建:

kubectl create -f config-map.yaml -n monitoring

4.创建Deployment模式的Prometheus

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: prometheus-deployment
  namespace: monitoring
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus-server
    spec:
      containers:
        -name: prometheus
          image: prom/prometheus:v2.3.2
          args:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--storage.tsdb.path=/prometheus/"
          ports:
            - containerPort: 9090
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus/
            - name: prometheus-storage-volume
              mountPath: /prometheus/
      volumes:
        - name: prometheus-config-volume
          configMap:
            defaultMode: 420
            name: prometheus-server-conf  
        - name: prometheus-storage-volume
          emptyDir: {}

使用如下命令部署:

kubectl create -f prometheus-deployment.yaml --namespace=monitoring

部署完成后通过dashboard能够看到如下的界面:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第1张

5.连接Prometheus

这里有两种方式

1.通过kubectl命令进行端口代理

2.针对Prometheus的POD暴露一个服务,推荐此种方式
首先新建一个yaml文件命名为prometheus-service.yaml,写入如下内容:

apiVersion: v1
kind: Service
metadata:
  name: prometheus-service
spec:
  selector: 
    app: prometheus-server
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      nodePort: 30909

执行如下命令创建服务:

kubectl create -f prometheus-service.yaml --namespace=monitoring

通过以下命令查看Service的状态,我们可以看到暴露的端口是30909:

kubectl get svc -n monitoring
NAME                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus-service   NodePort   10.101.186.82    <none>        9090:30909/TCP   100m

现在可以通过浏览器访问【http://虚拟机IP:30909】,看到如下界面,现在可以点击 status –> Targets,马上就可以看到所有Kubernetes集群上的Endpoint通过服务发现的方式自动连接到了Prometheus。:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第2张

我们还可以通过图形化界面查看内存:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第3张

OK,到这里Prometheus部署就算完成了,但是数据的统计明显不够直观,所以我们需要使用Grafana来构建更加友好的监控页面。

6.搭建Grafana

新建以下yaml文件:grafana-dashboard-provider.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-dashboard-provider
  namespace: monitoring
data:
  default-dashboard.yaml: |
    - name: 'default'
      org_id: 1
      folder: ''
      type: file
      options:
        folder: /var/lib/grafana/dashboards

grafana.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grafana
  namespace: monitoring
  labels:
    app: grafana
    component: core
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
        component: core
    spec:
      containers:
        - image: grafana/grafana:5.0.0
          name: grafana
          ports:
          - containerPort: 3000
          resources:
            limits:
              cpu: 100m
              memory: 100Mi
            requests:
              cpu: 100m
              memory: 100Mi
          volumeMounts:
          - name: grafana-persistent-storage
            mountPath: /var
          - name: grafana-dashboard-provider
            mountPath: /etc/grafana/provisioning/dashboards
      volumes:
      - name: grafana-dashboard-provider
        configMap:
          name: grafana-dashboard-provider
      - name: grafana-persistent-storage
        emptyDir: {}

grafana-service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: grafana
  name: grafana
  namespace: monitoring
spec:
  type: NodePort
  selector:
    app: grafana
  ports:
  -protocol: TCP
    port: 3000
    targetPort: 3000
    nodePort: 30300

执行如下命令进行创建:

kubectl apply -f grafana-dashboard-provider.yaml 
kubectl apply -f grafana.yaml 
kubectl apply -f grafana-service.yaml

部署完成后通过Kubernetes Dashboard可以看到:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第4张

根据服务暴露出来的端口30300通过浏览器访问【http://虚拟机IP:30300】看到如下界面:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第5张

输入用户名和密码(admin/admin)即可登录。

Kubernetes 系列(六):Kubernetes部署Prometheus监控第6张

接着我们配置数据源:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第7张

Kubernetes 系列(六):Kubernetes部署Prometheus监控第8张

Kubernetes 系列(六):Kubernetes部署Prometheus监控第9张

然后导入Dashboards:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第10张

Kubernetes 系列(六):Kubernetes部署Prometheus监控第11张

将JSON文件上传

grafana-dashboard.json(百度云链接 https://pan.baidu.com/s/1YtfD3s1U_d6Yon67qjihmw 密码:n25f)

然后点击导入:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第12张

然后就可以看到Kubernetes集群的监控数据了:

Kubernetes 系列(六):Kubernetes部署Prometheus监控第13张

还有一个资源统计的Dashboards:

kubernetes-resources-usage-dashboard.json

OK,Prometheus的监控搭建到此结束。

参考资料:https://www.jianshu.com/p/c2e549480c50

免责声明:文章转载自《Kubernetes 系列(六):Kubernetes部署Prometheus监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用Vim 加密文本win7下安装 oracle 10g:permission denied下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作iframe 的方法与兼容性

首先创建两个页面 //iframe1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body...

14.深入k8s:kube-proxy ipvs及其源码分析

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的比较完整了,我没有必要复述一遍,所以还不太清楚的小伙伴们可以去看官方的文档:https://kubernetes.io/docs/concepts/se...

持续集成 TeamCity 的配置与使用

环境:实现自动编译与自动化测试,发布到远程服务器,环境 VS2015 +WIN2008R2 什么是TeamCityTeamCity是由Jetbrains开发的一款功能强大的持续集成(Continue Integration)工具,包括服务器端和客户端,目前支持Java,.Net 等项目开发。 TeamCity提供一系列特性可以让团队快速实现持续继承:IDE...

vue实现筛选功能,文字选中变色

1 <template> 2 <Poptip trigger="hover"title="Title"content="content"> 3 <i-button>Hover</i-button> 4 </Poptip> 5 <Poptip tri...

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务; 核心功能 集中管理不同环境,不同集群的配置; 配置修改后可以实时推送到应用端; 具备规范的权限,流程治理特性; 开发技术 服务端使用springboot,springcloud开发,打包后可以直接运行,无需安装额外的tomcat; java客户端不依赖任何框架,对Spring,Spring...

k8s健康检查(七)

默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精细的健康检查,进而实现如下需求: 零停机部署。 避免部署无效的镜像。 更加安全的滚动升级。 每个容器启动时都会执行一个进程,此进程由 Do...