k8s安装prometheus

实验k8s集群环境如下:

主机名主机ip类型
k8s-master192.168.56.104master
k8s-node1192.168.56.105worker
k8s-node2192.168.56.106worker

1.创建sa账号, 对sa做rbac授权

#创建一个 sa 账号 monitor
[root@k8s-master prometheus]# kubectl create serviceaccount monitor -n monitor-sa
#把 sa 账号 monitor 通过 clusterrolebing 绑定到 clusterrole 上
[root@k8s-master prometheus]# kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin --serviceaccount=monitor-sa:monitor

2.创建 prometheus 数据存储目录

#在k8s集群的k8s-node1节点上创建数据存储目录
[root@k8s-node1 prometheus]# mkdir /data
[root@k8s-node1 prometheus]# chmod 777 /data/

3.安装prometheus

3.1 下载并上传prometheus-cfg.yaml

云盘下载:

链接:https://pan.baidu.com/s/160lduIQOK1uk3Ags7bIIRg
提取码:8tue

上传到 k8s 控制节点 k8s-master上

3.2 创建一个 configmap 存储卷,用来存放 prometheus 配置信息

通过 kubectl apply 更新 configmap

[root@k8s-master prometheus]# kubectl apply -f prometheus-cfg.yaml
# 查看prometheus-cfg.yaml内容
[root@k8s-master prometheus]# cat prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor-sa
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s # 采集目标主机监控据的时间间隔
      scrape_timeout: 10s # 数据采集超时时间, 默认 10s
      evaluation_interval: 1m # 触发告警检测的时间,默认是 1m
    scrape_configs: # 配置数据源,称为target,每个target用job_name命名。又分为静态配置和服务发现
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs: # 使用的是 k8s 的服务发现
      - role: node # 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。
      relabel_configs:
      - source_labels: [__address__] # 配置的原始标签,匹配地址
        regex: '(.*):10250' # 匹配带有10250端口的 url
        replacement: '${1}:9100' # 把匹配到的ip:10250的ip保留
        target_label: __address__
        action: replace
      - action: labelmap
        # 匹配到下面正则表达式的标签会被保留,如果不做regex正则的话,默认只是会显示instance标签
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      # 抓取cAdvisor数据,是获取kubelet上/metrics/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 # 把匹配到的标签保留
        # 保留匹配到的具有__meta_kubernetes_node_label的标签
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        # 获取到的地址: __address__="192.168.56.104:10250"
        # 把获取到的地址替换成新的地址 kubernetes.default.svc:443
        replacement: kubernetes.default.svc:443
      # 把原始标签中__meta_kubernetes_node_name值匹配到
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        # 获取__metrics_path__对应的值
        target_label: __metrics_path__
        # 把metrics替换成新的值api/v1/nodes/k8s-master/proxy/metrics/cadvisor
        # ${1}是__meta_kubernetes_node_name获取到的值
        # 新的url就是https://kubernetes.default.svc:443/api/v1/nodes/k8s-master/proxy/metrics/cadvisor
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      # 使用k8s中的endpoint服务发现,采集apiserver 6443端口获取到的数据
      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:
      # endpoint这个对象的名称空间  ---> __meta_kubernetes_namespace
      # endpoint对象的服务名 ---> __meta_kubernetes_service_name
      # exnpoint 的端口名称 ---> __meta_kubernetes_endpoint_port_name
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        # 采集满足条件的实例,其他实例不采集
        action: keep
        regex: default;kubernetes;https
    # 正则匹配到的默认空间下的service名字是kubernetes,协议是https的endpoint类型保留下来
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      # 重新打标仅抓取到的具有"prometheus.io/scrape:true"的annotation的端点,
      # 意思是说如果某个service具有prometheus.io/scrape=true annotation声明则抓取, 
      # annotation本身也是键值结构,所以这里的源标签设置为键,
      # 而regex设置值true,当值匹配到regex设定的内容时则执行keep动作也就是保留,其余则丢弃。
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      # 重新设置scheme,匹配源标签__meta_kubernetes_service_annotation_prometheus_io_scheme也就是prometheus.io/scheme annotation, 
      # 如果源标签的值匹配到regex, 则把值替换为__scheme__对应的值
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      # 应用中自定义暴露的指标,也许你暴露的API接口不是/metrics这个路径,那么你可以在这个POD对应的service中做一个"prometheus.io/path=/mymetrics"声明,
      # 下面面的意思就是把你声明的这个路径赋值给__metrics_path__,
      # 其实就是让prometheus来获取自定义应用暴露的metrices的具体路径,
      # 不过这里写的要和service中做好约定, 
      # 如果service中这样写prometheus.io/app-metricspath:'/metrics'那么你这里就要__meta_kubernetes_service_annotation_prometheus_io_app_metrics_path 这样写。
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      # 暴露自定义的应用的端口,就是把地址和你在service中定义的"prometheus.io/port=<port>"声明做一个拼接, 
      # 然后赋值给__address__,这样prometheus就能获取自定义应用的端口,
      # 然后通过这个端口再结合__metrics_path__来获取指标,
      # 如果__metrics_path__值不是默认的/metrics,那么就要使用上面的标签替换来获取真正暴露的具体路径。
      - 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 # 替换__meta_kubernetes_namespace变成kubernetes_namespace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name

3.3 prometheus镜像拉取

[root@k8s-node1 prometheus]# docker pull prom/prometheus:latest

3.4 prometheus-deploy.yaml下载

链接:https://pan.baidu.com/s/1SsnF1Cj4286klATjknqSfw
提取码:17gl

下载完上传之控制节点k8s-master上

[root@k8s-master prometheus]# cat prometheus-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-node1       # 指定pod调度到哪个节点上
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:latest # 在工作节点k8s-node1拉取最新镜像
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus     # 数据存储目录
          - --storage.tsdb.retention=720h       #何时删除旧数据,默认为 15 天。
          - --web.enable-lifecycle      # 开启热加载
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory

3.5 通过 deployment 部署 prometheus

[root@k8s-master prometheus]# kubectl apply -f prometheus-deploy.yaml
# 可看到pod状态是Running,说明prometheus部署成功
[root@k8s-master prometheus]# kubectl get pods -n monitor-sa
NAME                                  READY   STATUS    RESTARTS   AGE
node-exporter-84tk7                   1/1     Running   0          2d5h
node-exporter-ctmks                   1/1     Running   0          2d5h
node-exporter-jzg8t                   1/1     Running   0          2d5h
prometheus-server-66567fb7bd-lbww8    1/1     Running   0          8m40s

注意:在上面的 prometheus-deploy.yaml 文件有个 nodeName 字段,这个就是用来指定创建的这个
prometheus 的 pod 调度到哪个节点上,我们这里让 nodeName=k8s-node1,也即是让 pod 调度到
k8s-node1 节点上,因为 k8s-node1 节点我们创建了数据目录/data,所以大家记住:你在 k8s
集群的哪个节点创建/data,就让 pod 调度到哪个节点, nodeName 根据你们自己环境主机去修改即可。

3.6 prometheus-svc.yaml 下载上传

  1. 下载

链接:https://pan.baidu.com/s/1dlh8V-z3fmEWv5ujgTeoWQ
提取码:440l

  1. 上传

prometheus-svc.yaml上传到控制节点k8s-master上

  1. 查看
[root@k8s-master prometheus]# cat prometheus-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: prometheus
    component: server

3.7 创建prometheus的service

[root@k8s-master prometheus]# kubectl apply -f prometheus-svc.yaml

3.8 查看 service 在物理机映射的端口

[root@k8s-master prometheus]# kubectl get svc -n monitor-sa
NAME                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus           NodePort   10.109.254.133   <none>        9090:32138/TCP   25m

通过上面可以看到 service 在宿主机上映射的端口是 32138,这样我们访问 k8s 集群的 k8s-node1 节点
的 ip:32138,就可以访问到 prometheus 的 web ui 界面了
在这里插入图片描述

4.prometheus热加载

为了每次修改配置文件可以热加载 prometheus,也就是不停止 prometheus,就可以使配置生效,想要使配置生效可用如下热加载命令:

[root@k8s-master prometheus]# kubectl get pods -n monitor-sa -o wide -l app=prometheus
NAME                                 READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
prometheus-server-66567fb7bd-lbww8   1/1     Running   0          29m   10.244.1.35   k8s-node1   <none>           <none>

10.244.1.35 是 prometheus 的 pod 的 ip 地址,如何查看 prometheus 的 pod ip

方法一:想要使配置生效可用如下命令热加载:

[root@k8s-master prometheus]# curl -X POST http://10.244.1.35:9090/-/reload

方法二:热加载速度比较慢,可以暴力重启 prometheus,如修改上面的 prometheus-cfg.yaml 文件之后,可
执行如下强制删除:

kubectl delete -f prometheus-cfg.yaml
kubectl delete -f prometheus-deploy.yaml
然后再通过 apply 更新:
kubectl apply -f prometheus-cfg.yaml
kubectl apply -f prometheus-deploy.yaml

注意:线上最好热加载,暴力删除可能造成监控数据的丢失

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值