第十一章 Kubernetes运维—资源监控方案

目录

一、Prometheus简介

二、Prometheus架构

三、Prometheus数据模型

1、metric

2、标签

四、Prometheus部署

1、常用的部署方式

2、通过k8s资源对象部署prometheus系统

(1)部署 Prometheus

(2)监控 ingress-nginx

(3)创建node-exporter,监控节点资源

1)添加 node-exporter 至 Prometheus 捕获

2)kubelet metrics 接口添加监控

3)合并上面1-2的配置项,添加进Prometheus configmap 配置文件中

(4)监控容器资源指标

(5)监控ApiServer指标

(6)通过 Service 监控服务

(7)部署 kube-state-metrics,并监控

(8)部署 grafana 服务

仪表盘配置

导入仪表盘配置

(9)部署metric.server监控

(10) AlertManager部署


一、Prometheus简介

原文链接: yPrometheus监控平台的部署与监控 - aganippe - 博客园

Prometheus是一个开源的系统监控和报警系统,在2012年由SoundCloud创建,并于2015年正式发布。2016年,Prometheus项目正式加入CNCF基金会,成为继kubernetes之后第二个在CNCF托管的项目,现在已经广泛用于容器和微服务领域。

Prometheus本身是基于go开发的一套开源的系统监控报警框架和时序数据库(TSDB)。

Prometheus的监控功能很完善和全面,性能支持上万规模的集群。

Prometheus的特点如下:

  • 支持多维数据模型:由度量名和键值对组成的时间序列数据
  • 内置时间序列数据库TSDB
  • 支持PromQL(Prometheus Query Language)查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
  • 支持HTTP的PULL方式采集时间序列数据
  • 支持PushGateway采集瞬时任务的数据
  • 支持服务发现和静态配置两种方式发现目标
  • 多种可视化和仪表盘,支持第三方dashboard,比如Grafana

数据特点:

  • 监控指标,采用独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中非常常见
  • 数据标签,支持多维度标签,每个独立的标签组合都代表一个独立的时间序列
  • 数据处理,Prometheus内部支持多种数据的聚合、切割、切片等功能
  • 数据存储,Prometheus支持双精度浮点型数据存储

适用场景:

  • Prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监控场景,又适合高度动态的面向服务的体系结构的监控场景
  • 在微服务场景中,它对多维数据收集和查询的支持是一种特别的优势
  • Prometheus的设计旨在提升可用性,使其省委中断期间要使用的系统,以快速诊断问题
  • 每个Prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务

二、Prometheus架构

Prometheus监控是一个监控体系,主要模块包括:Prometheus server、exporters、PushGateway、PromQL、Alertmanager以及图形化界面

主要组件:

  • Prometheus server:时序数据存储、监控指标管理。Prometheus server包含Retrieval、TSDB、HTTP server三个组件。
  • 可视化:Prometheus webUI、Grafana可视化套件
  • 数据采集:exporters为当前客户端暴露出符合Prometheus规格的数据指标、PushGateway为push模式下的数据采集工具
  • 监控目标:服务发现,包括文件方式、DNS方式、console方式、kubernetes方式
  • 告警:Alertmanager,主要用来接受prometheus发送的告警信息,它支持丰富的告警通知渠道,并且很容易做到告警信息进行去重,降噪,分组 ,策略路由,是一款前卫的告警通知系统。

其中TSDB支持存储60天的数据,如果想要永久存储监控数据的话需要增加一个时序数据库后端,比较典型的是InfluxDB

Retrieval负责获取监控数据,也就是Prometheus targets,通常采用的是pull模式

本质上来讲Prometheus只支持pull的方式来获取监控数据。

那么push又从何而来的呢?对于一些瞬时任务,比如一个存在时间极短的job,pull的方式显然是不太能够抓取到这些数据的。

Prometheus所采用的方式就是部署一个PushGateway,job在执行完成之后将数据push到这个网关代理,而Prometheus将从PushGateway中pull数据。

pull模式的特点:

  • 被监控方提供一个server,并负责维护
  • 监控方控制采集频率

第一点对用户来说要求更高了,但是好处很多,比如pull不到数据本身就说明节点存在故障;比如监控指标自然而然由用户自己维护,使得标准化很简单;

第二点更为重要,那就是在监控体系对metric采集的统一和稳定有了可靠的保证,对于数据量大的情况下很重要。

同样pull模式的缺点在于需要服务发现模块来动态发现被监控对象,同时被监控方和Prometheus可能存在数据维护不同步的情况,造成一定的信息丢失和不准确。

kubernetes/kube-state-metrics组件

能够获取kubernetes各种资源的最新状态,比如deployment或者daemonset等

Metrics Server

可以从api-server中获取cpu、内存使用率监控指标,它当前的核心作用是:为HPA kubectl等组件提供决策指标支持。

三、Prometheus数据模型

Prometheus中存储的数据为时间序列,即基于同一度量标准或者同一时间维度的数据流。

除了时间序列数据的正常存储外,Prometheus还会基于原始数据临时生成新的时间序列数据,用于后续查询的依据或结果。

每个时间序列都是由metric名称和标签(可选键值对)组成的唯一标识。

1、metric

  • 该名字必须有意义,用于表示metric的一般性功能,例如:http_requests_total表示http请求的总数
  • metric名字由ASCII字符、数字、下划线和冒号组成,且必须满足正则表达式a-zA-Z:*的查询请求
  • 注意:冒号是为用户自定义的记录规则保留的

2、标签

  • 标签是以键值对的形式存在的,不同的标签用于表示时间序列的不同维度标识
  • 基本格式:
<metric name>{<label name>=<label value>, ...}
# 示例
http_requests_total{method="POST", endpoint="/api/tracks"}
# 解析:
# http_requests_total{method="POST"}表示所有http请求中的POST请求
# endpoint="/api/tracks"表示请求的url地址是/api/tracks
  • 标签中的key由ASCII字符、数字以及下划线组成,且必须要满足正则表达式a-zA-Z:*
  • 标签值可以包含任何Unicode字符,标签值为空被认为等同于不存在的标签

查询语言允许基于这些维度进行过滤和聚合。更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列。

四、Prometheus部署

1、常用的部署方式

包安装

RHEL系统:prometheus-rpm/release - Results in

Ubuntu和Debian可直接使用apt命令安装

二进制安装

Download | Prometheus

docker安装

Installation | Prometheus

k8s operator安装

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

2、通过k8s资源对象部署prometheus系统

通过k8s的daemonset以及deployment等资源对象完成对prometheus系统相关组件的部署。能够更好的理解prometheus整套系统的运作逻辑。部署完成后,我们通过配置相关文件,监控一些基本的资源指标。

大致的部署逻辑图如下:

上面部署架构:

1、每个node节点部署exporter组件,目的是收集每个节点的metrics数据。它是通过DaemonSet进行部署,目的是确保每个node节点都有一个exporter的pod收集指标。

2、有一个deployment部署的prometheus server,确保当prometheus server有pod挂掉的时候,还能起来新的pod,高可用性。

3、有一个deployment部署的grafana监控web,确保当pod挂掉的时候,还能起来新的pod,高可用。

具体详细的部署步骤如下。

(1)部署 Prometheus
(2)监控 ingress-nginx
(3)创建 node-exporter,监控节点资源
       1)添加 node-exporter 至 Prometheus 捕获
       2)kubelet metrics 接口添加监控
       3)合并 Prometheus configmap 配置文件
(4)监控容器资源指标
(5)监控 ApiServer 指标
(6)通过 Service 监控服务
(7)部署 kube-state-metrics,并监控
(8)部署 grafana 服务
(9)监控 metrics.server
(10)alertmanager 部署

(1)部署 Prometheus

#创建kube-ops命名空间
$ kubectl create ns kube-ops

1. 创建configmap资源对象。目的是为prometheus提供配置文件。

# 创建 prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s    # 表示 prometheus 抓取指标数据的频率,默认是 15s
      scrape_timeout: 15s     # 表示 prometheus 抓取指标数据的超时时间,默认是 15s
    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
      - targets: ['localhost:9090']

2. 创建 prometheus-pvc.yaml

# 创建 prometheus-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: prometheus
  namespace: kube-ops
spec:
  storageClassName: nfs-client #需要根据自己部署的storageclass名称
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

3.  创建prometheus-rbac.yaml

# 创建 prometheus-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-ops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - nodes/metrics
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: kube-ops

4. 创建 prometheus-deploy.yaml

# 创建 prometheus-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: kube-ops
  labels:
    app: prometheus
spec:
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus #创建app=prometheus标签的pod
    spec:
      serviceAccountName: prometheus
      containers:
      - image: prom/prometheus:v2.4.3 #镜像名称需要根据你自己pull的镜像而定
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        - "--web.enable-admin-api"  # 控制对admin HTTP API的访问,其中包括删除时间序列等功能
        - "--web.enable-lifecycle"  # 支持热更新,直接执行localhost:9090/-/reload立即生效
        ports:
        - containerPort: 9090
          protocol: TCP
          name: http
        volumeMounts:
        - mountPath: "/prometheus"
          subPath: prometheus
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 100m
            memory: 512Mi
      securityContext:
        runAsUser: 0
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: prometheus
      - configMap:
          name: prometheus-config #前面第一步创建的configmap的资源对象名称。
        name: config-volume

5.创建 prometheus-svc.yaml 

# 创建 prometheus-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: kube-ops
  labels:
    app: prometheus
spec:
  selector:
    app: prometheus
  type: NodePort
  ports:
    - name: web
      port: 9090
      targetPort: http

部署情况:

我们看到prometheus服务通过31522端口保留出来了,在浏览器中输入master01的ip以及端口:

点击Status-Targets:

prometheus安装完成之后,我们接下来安装一个ingress-nginx 

(2)监控 ingress-nginx

Prometheus 的数据指标是通过一个公开的 HTTP(S) 数据接口获取到的,我们不需要单独安装监控的 agent,只需要暴露一个 metrics 接口,Prometheus 就会定期去拉取数据;对于一些普通的 HTTP 服务,我们完全可以直接重用这个服务,添加一个 /metrics 接口暴露给 Prometheus

首先,我们看下之前部署的ingress-nginx的metrics服务接口的端口是否开启。

一个是可以在node节点上通过命令查看端口是否存在:netstat -antp | grep 10254

前提是你需要知道metirc服务是安装在哪些node上。我的是安装在了node01、node02节点上。

 另外一个是可以通过查看service服务中的metircs是否已有了,如下。

如果上面都没有找到10254端口开启, 那么需要去找到之前ingress章节里面helm部署的文件夹,我这里是ingress-nginx,找到vaules.yaml文件。

将里面的enabled改为true。

然后upgrade一下。 

[root@k8s-master01 10]# helm upgrade  ingress-nginx -n ingress ./ingress-nginx -f ./ingress-nginx/values.yaml

开启服务及端口之后,我们可以在浏览器中分别输入两个node的ip以及10254端口看下metrics内容:

node01地址和端口:

node02地址和端口:

创建一个新的configmap文件,内容比之前第一步创建的多出了两个job_name内容。

# 创建新的配置文件 prome-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s

    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']
    #跟之前配置文件比,增加了2个job_name,其静态配置内容分别对应于自己刚上面浏览器可以访问到的meitrics的ip+10245
    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

通过apply更新下configmap对象。 

重载 prometheus,使得prometheus能够通过刚加入的两个metrics接口获取到数据。

[root@k8s-master01 2]# curl -X POST "http://10.11.109.175:9090/-/reload"

我们在prometheus页面里面查看是否获取到metrics数据

点击show more:

(3)创建node-exporter,监控节点资源

nodeexporter 就是抓取用于采集服务器节点的各种运行指标,目前 nodeexporter 支持几乎所有常见的监控点,比如 conntrack,cpu,diskstats,filesystem,loadavg,meminfo,netstat 等,详细的监控点列表可以参考其 Github repo

创建 prome-node-exporter.yaml,资源类别是daemonset,目的是在每个node主机节点上部署prom/node-exporter镜像容器,获取主机节点的运行指标。

# 创建 prome-node-exporter.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-ops
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      hostPID: true #PID,IPC,Network打开表示,容器和主机共享相同的命名空间
      hostIPC: true
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.16.0 #如果你是arm架构的服务器,需要注意使用arm架构的镜像。
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 0.15
        securityContext:
          privileged: true #开启特权模式,因为需要抓去物理主机的相关信息
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"' #排除这些挂载点,不监控相关数据
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
      tolerations:  #设置容忍
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: dev
          hostPath:
            path: /dev
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /

创建完成之后,还没有完成,还需要对1.prome_cm.yaml中configmap配置资源清单文件的修改才行。

1)添加 node-exporter 至 Prometheus 捕获

这一项的目的是监控node相关信息。

在 Kubernetes 下,Promethues 通过与 Kubernetes API 集成,目前主要支持 5 种服务发现模式,分别是:Node、Service、Pod、Endpoints、Ingress。

通过指定 kubernetes_sd_configs 的模式为 node,Prometheus 就会自动从 Kubernetes 中发现所有的 node 节点并作为当前 job 监控的目标实例,发现的节点 /metrics 接口是默认的 kubelet 的 HTTP 接口。

prometheus 去发现 Node 模式的服务的时候,访问的端口默认是10250。不过目前我们通过 node-exporter 的pod抓取到的节点指标数据,配置中指定了hostNetwork=true(与物理主机节点共享网络),以及指定了容器端口为9100。 

        ports:
        - containerPort: 9100

所以在每个pod部署所在的物理主机节点上就会绑定一个端口 9100。

下面的这个job做的目标就是将原来的默认的10250替换为9100端口,并且将物理节点node标签加到监控数据里面去。

    - job_name: 'kubernetes-nodes'
      kubernetes_sd_configs: #自动发现配置
      - role: node   #发现类型为node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定数据的来源是哪个node节点。 

对于 kubernetessdconfigs 下面可用的元标签如下:

  • _meta_kubernetes_node_name:节点对象的名称
  • _meta_kubernetes_node_label:节点对象中的每个标签。如上使用的示例。
  • _meta_kubernetes_node_annotation:来自节点对象的每个注释
  • _meta_kubernetes_node_address:每个节点地址类型的第一个地址(如果存在) *

关于 kubernetssdconfigs 更多信息可以查看官方文档:kubernetessdconfig

2)kubelet metrics 接口添加监控

这一项的目的是监控pod相关信息。(但是为什么在role中配置的是node呢?)

Kubernetes 1.11+ 版本以后,kubelet 就移除了 10255 端口, metrics 接口回到了 10250 端口也就是 node 自动发现监控的默认端口,但是需要使用 https 的协议。

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs:  #自动发现配置
      - role: node      #发现类型为node
      scheme: https  #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt    #CA证书存放地址
        insecure_skip_verify: true     #证书验证跳过为true,即跳过证书验证,如果觉得不安全就改为false
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token #指定SA的token,用于认证
      relabel_configs: #标签的配置
      - action: labelmap 
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定数据的来源是哪个node节点。 同上。

3)合并上面1-2的配置项,添加进Prometheus configmap 配置文件中
# 创建新的配置文件 prome-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s

    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']
    #跟之前配置文件比,增加了2个job_name,其静态配置内容分别对应于自己刚上面浏览器可以访问到的meitrics的ip+10245
    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

    - job_name: 'kubernetes-nodes'
      kubernetes_sd_configs: #自动发现配置
      - role: node #发现类型为node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs: #自动发现配置
      - role: node   #发现类型为node
      scheme: https  #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
        insecure_skip_verify: true    #证书验证跳过为true,即跳过证书验证,如果觉得不安全就改为false
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token   #指定SA的token,用于认证
      relabel_configs:  #标签的配置
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定数据的来源是哪个node节点。 同上.

apply更新配置文件。

[root@k8s-master01 3]# kubectl apply -f 1.prome-cm.yaml 
configmap/prometheus-config configured

稍微等待下,触发prometheus重载:

[root@k8s-master01 2]# curl -X POST "http://10.11.109.175:9090/-/reload"

我们在prometheus页面里面查看是否获取到metrics数据

这是对kubelet的监控(间接可以知道节点有多少pod,以及重启了多少次等等pod的信息):

 这是对node的监控:

(4)监控容器资源指标

说到容器监控我们自然会想到cAdvisor,我们前面也说过cAdvisor已经内置在了 kubelet 组件之中,所以我们不需要单独去安装,cAdvisor的数据路径为/api/v1/nodes/<node>/proxy/metrics,同样我们这里使用 node 的服务发现模式,因为每一个节点下面都有 kubelet。

我们在原来的prom-cm.yaml基础上增加cAdvisor的配置信息。

# 创建新的配置文件 prome-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s
    
    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']
    #跟之前配置文件比,增加了2个job_name,其静态配置内容分别对应于自己刚上面浏览器可以访问到的meitrics的ip+10245
    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

    - job_name: 'kubernetes-nodes' 
      kubernetes_sd_configs: #自动发现
      - role: node #发现类型为node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs: #自动发现
      - role: node   #发现类型为node
      scheme: https  #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
        insecure_skip_verify: true    #证书验证跳过为true,即跳过证书验证,如果觉得不安全就改为false
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token   #指定SA的token,用于认证
      relabel_configs:  #标签的配置
      - action: labelmap 
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。

    - job_name: 'kubernetes-cadvisor' 
      kubernetes_sd_configs: #自动发现
      - role: node       #发现类型为node
      scheme: https      #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token  #指定SA的token,用于认证
      relabel_configs:   #标签的配置
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+) #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。
      - 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 #替换成目标路径,其中${1}表示当前节点名

 [root@k8s-master01 4]# kubectl apply -f 1.prome-cm.yaml 
configmap/prometheus-config configured

 等待一会之后,执行热重启:

[root@k8s-master01 4]# curl -X POST "http://10.11.109.175:9090/-/reload"

如果在浏览器中没有找到如下的监控内容,可以等一会后再执行热重启命令。

(5)监控ApiServer指标

ApiServer的请求频率,总请求量等等,我们也可以监控。我们通过监控ApiServer相关指标,判断是否其压力过大,也是可以评估我们kubernetes集群是否正常的重要的指标。需要将其监控起来。

同样在原来的cm资源文件后面增加相关内容。

# 创建新的配置文件 prome-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s
    
    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']
    #跟之前配置文件比,增加了2个job_name,其静态配置内容分别对应于自己刚上面浏览器可以访问到的meitrics的ip+10245
    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

    - job_name: 'kubernetes-nodes' 
      kubernetes_sd_configs: #自动发现
      - role: node #发现类型为node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs: #自动发现
      - role: node   #发现类型为node
      scheme: https  #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
        insecure_skip_verify: true    #证书验证跳过为true,即跳过证书验证,如果觉得不安全就改为false
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token   #指定SA的token,用于认证
      relabel_configs:  #标签的配置
      - action: labelmap 
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。

    - job_name: 'kubernetes-cadvisor' 
      kubernetes_sd_configs: #自动发现
      - role: node       #发现类型为node
      scheme: https      #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token  #指定SA的token,用于认证
      relabel_configs:   #标签的配置
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+) #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。
      - 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 #替换成目标路径,其中${1}表示当前节点名
    
    - 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

操作同上。在浏览器可以看到如下结果: 

(6)通过 Service 监控服务

# 创建新的配置文件 prome-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s
    
    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']
    #跟之前配置文件比,增加了2个job_name,其静态配置内容分别对应于自己刚上面浏览器可以访问到的meitrics的ip+10245
    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

    - job_name: 'kubernetes-nodes' 
      kubernetes_sd_configs: #自动发现
      - role: node #发现类型为node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs: #自动发现
      - role: node   #发现类型为node
      scheme: https  #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
        insecure_skip_verify: true    #证书验证跳过为true,即跳过证书验证,如果觉得不安全就改为false
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token   #指定SA的token,用于认证
      relabel_configs:  #标签的配置
      - action: labelmap 
        regex: __meta_kubernetes_node_label_(.+)  #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。

    - job_name: 'kubernetes-cadvisor' 
      kubernetes_sd_configs: #自动发现
      - role: node       #发现类型为node
      scheme: https      #当前协议为https,因为是https,所以需要进行认证的相关配置
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  #CA证书存放地址
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token  #指定SA的token,用于认证
      relabel_configs:   #标签的配置
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+) #将node节点标签加到监控数据里面去,固定写法,以便确定监控的数据的来源是哪个node节点。 同上。
      - 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 #替换成目标路径,其中${1}表示当前节点名
    
    - 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-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true  #在relabel_configs中过滤了 annotation 有prometheus.io/scrape=true的 Service
      - 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

(7)部署 kube-state-metrics,并监控

# 部署 kube-state-metrics,地址 https://github.com/kubernetes/kube-state-metrics
$ kubectl apply -f examples/standard

# 创建 kube-state-metrics 服务的 svc 文件,被监控,svc.yaml 
apiVersion: v1
kind: Service
metadata:
  annotations: #自动会被上面configmap中的'kubernetes-service-endpoints'所监控到
    prometheus.io/scrape: 'true'
    prometheus.io/port: "8080" #默认为9100,修改默认端口
  namespace: kube-system
  labels:
    app: kube-state-metrics
  name: kube-state-metrics-exporter
spec:
  ports:
  - name: 8080-8080
    port: 8080 #集群接口端口8080
    protocol: TCP
    targetPort: 8080 #后端真实服务器8080
  selector:
    app.kubernetes.io/name: kube-state-metrics #锁定带有这样标签的pod
  type: ClusterIP

(8)部署 grafana 服务

# 创建 grafana 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: kube-ops
  labels:
    app: grafana
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:5.3.4
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
          name: grafana
        env:
        - name: GF_SECURITY_ADMIN_USER
          value: admin
        - name: GF_SECURITY_ADMIN_PASSWORD
          value: admin321
        readinessProbe:
          failureThreshold: 10
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTP
          initialDelaySeconds: 60
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 30
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          limits:
            cpu: 100m
            memory: 256Mi
          requests:
            cpu: 100m
            memory: 256Mi
        volumeMounts:
        - mountPath: /var/lib/grafana
          subPath: grafana
          name: storage
      securityContext:
        fsGroup: 472
        runAsUser: 472
      volumes:
      - name: storage
        persistentVolumeClaim:
          claimName: grafana
# 创建 grafana 存储 pv,grafana-volume.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana
  namespace: kube-ops
spec:
  storageClassName: nfs-client
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# 创建 grafan svc 文件,grafana-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-ops
  labels:
    app: grafana
spec:
  type: NodePort
  ports:
    - port: 3000
  selector:
    app: grafana
# 创建 job,调整 grafana 挂载目录权限,grafana-chown-job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: grafana-chown
  namespace: kube-ops
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: grafana-chown
        command: ["chown", "-R", "472:472", "/var/lib/grafana"]
        image: busybox
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: storage
          subPath: grafana
          mountPath: /var/lib/grafana
      volumes:
      - name: storage
        persistentVolumeClaim:
          claimName: grafana

 

用户名admin,密码admin321,这个是我们在deployment资源清单中配置的。login登陆进去。

我们接下来通过grafana的仪表盘可视化监控数据(prometheus)。

仪表盘配置

因为grafana并不存储数据,他需要通过引入其他数据源,拉取数据源数据进行可视化展示。

首先我们配置数据来源。点击“设置”- “data sources”。

配置数据源:

 

 还没有仪表盘,我们需要添加仪表盘:

我们选择Graph,然后点击“Edit”编辑。

在Data Source里面选择“Prometheus”。

下面需要输入PQL语句,我们可以先从prometheus中选择以及输入PQL查询语句:

 将其PQL语句复制,粘贴到grafana界面的输入框中。

 可以为这个graph图表起一个名字,点击general。在title中输入名称,然后点击save dashboard。

 在弹出来的框中,可以不改任何信息,点击save。

 可以看到仪表盘dashboard创建成功了。

导入仪表盘配置

另外可以通过Import导入之前保存的仪表盘配置信息。

 提示是否想保存你的修改。可以点击save保存。

 

点击Upload .json File按钮,选择相关的Json文件。

选择prometheus的数据源。再点击下面的Import。

可以看到已经导入成功。

(9)部署metric.server监控

从 Kubernetes v1.8 开始,资源使用情况的监控可以通过 Metrics API 的形式获取,例如容器 CPU 和内存使用率。这些度量可以由用户直接访问(例如,通过使用 kubectl top 命令),或者由集群中的控制器(例如,Horizontal Pod Autoscaler)使用来进行决策,具体的组件为 Metrics Server,用来替换之前的 heapster,heapster 从 1.11 开始逐渐被废弃。

Metrics-Server 是集群核心监控数据的聚合器。通俗地说,它存储了集群中各节点的监控数据,并且提供了 API 以供分析和使用。Metrics-Server 作为一个 Deployment 对象默认部署在 Kubernetes 集群中。不过准确地说,它是 Deployment,Service,ClusterRole,ClusterRoleBinding,APIService,RoleBinding 等资源对象的综合体。

metric-server监控数据的原理图:

通过metric-server监控数据的原理图如上所示,当前端比如kubectl命令、k8s dashboard以及scheduler等获取监控数据的时候,他们会调用api-server接口,api-server接口去请求metric-server或者heapster,metric-server或者heapster去请求kubelet(cadvisor),然后其再去请求cgroup,获取到相关监控数据后,依次返回,最终返回到前端。

一开始没有部署相关资源对象,是无法获取监控数据的。如下: 

目前还没有激活,需要完成相关部署才行。从上图上可以看出,api-server接口本身集群安装就必须有的了,cgroup也是存在的,除此之外之前我们已完成了kubelet中的cadvisor的部署了,所以 现在剩下只需要将metric-server部署完成即可。

metric-server部署过程如下:

下载https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 文件到本地。

[root@k8s-master01 9]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

####ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system #官方习惯,但凡是系统集群本身使用的话,都一般放在kube-system命名空间下。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
####创建Service
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
####Deployment控制器,创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        ## InternalIP\Hostname\InternalDNS\ExternalDNS\ExternalIP, Hostname 默认的通过主机名通讯,InternalIP 需要显示设置后才能通过 IP 通讯
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls   ## 如果不想设置 kubelet 的证书认证,可以通过此选项跳过认证
        image: registry.k8s.io/metrics-server/metrics-server:v0.7.2 #如果因为网络拉取不下来,可以使用docker.imgdb.de/registry.k8s.io/metrics-server/metrics-server:v0.7.2镜像名
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 10250
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
          seccompProfile:
            type: RuntimeDefault
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
####添加apiservice接口,可以被我们的kubectl的top命令所读取
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true #跳过TLS认证。
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

(10) AlertManager部署

告警器。我们部署alertmanager,检验是否真的能够发送对应的报警信息。

1)部署configmap文件,设置告警相关的配置信息。

# 创建 alertmanager 配置文件,alertmanager-conf.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: alert-config
  namespace: kube-ops
data:
  config.yml: |-
    global:
      # 在没有报警的情况下声明为已解决的时间
      resolve_timeout: 5m
      # 配置邮件发送信息
      smtp_smarthost: 'smtp.163.com:25'
      smtp_from: 'wangyanglinux@163.com'
      smtp_auth_username: 'wangyanglinux@163.com'
      smtp_auth_password: 'xxxx' # 这个是授权密码。需要在163邮箱里面找到设置,获取授权密码。
      smtp_hello: '163.com'
      smtp_require_tls: false
    # 所有报警信息进入后的根路由,用来设置报警的分发策略
    route:
      # 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面
      group_by: ['alertname', 'cluster']
      # 当一个新的报警分组被创建后,需要等待至少group_wait时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。
      group_wait: 30s

      # 当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息。
      group_interval: 5m

      # 如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们
      repeat_interval: 5m

      # 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
      receiver: default

      # 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。
      routes:
      - receiver: email
        group_wait: 10s
        match:
          team: node
    receivers:
    - name: 'default'
      email_configs:
      - to: 'wangyanglinux@88.com'
        send_resolved: true
    - name: 'email'
      email_configs:
      - to: 'wangyanglinux@88.com'
        send_resolved: true

 其中邮箱密码不是你登陆邮箱的密码,而是授权密码。具体可以参考如下:

2)修改 prometheus 配置文件,prometheus-cm.yaml 

主要增加的是以下内容。因为prometheus和alertmanager是同一家公司开发,他们可以一起进行配置。

alerting:
      alertmanagers:
        - static_configs:
          - targets: ["localhost:9093"]

这里为什么是localhost,是因我们将alertmanager部署到prometheus同一个pod里面上,所以可以使用localhost。

# 修改 prometheus 配置文件,prometheus-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-ops
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
      scrape_timeout: 30s

    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']

    - job_name: 'ingressnginx12'
      static_configs:
        - targets: ['192.168.21.12:10254']

    - job_name: 'ingressnginx13'
      static_configs:
        - targets: ['192.168.21.13:10254']

    - job_name: 'kubernetes-nodes'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-kubelet'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

    - job_name: 'kubernetes-cadvisor'
      kubernetes_sd_configs:
      - role: node
      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:
      - 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-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-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

    alerting:
      alertmanagers:
        - static_configs:
          - targets: ["localhost:9093"]

3)修改 prometheus service 文件, prometheus-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: kube-ops
  labels:
    app: prometheus
spec:
  selector:
    app: prometheus
  type: NodePort
  ports:
    - name: web #prometheus配置的端口
      port: 9090
      targetPort: http
    - name: altermanager #新增altermanager配置内容
      port: 9093 
      targetPort: 9093

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值