11-K8S部署普罗米修斯

K8S-Kubernetes 集群部署 Prometheus 和 Grafana

1.实验环境

控制节点/master01       192.168.80.20
工作节点/node01         192.168.80.30
工作节点/node02         192.168.80.35

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.20 master01
192.168.80.30 node01
192.168.80.35 node02

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

2.部署 node-exporter

#创建监控 namespace
kubectl create ns monitor-sa

#部署 node-exporter
mkdir /opt/prometheus
cd /opt/prometheus/

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

kubectl apply -f prometheus-cfg.yaml

11-K8S部署普罗米修斯

3.3 通过 deployment 部署 prometheus

#将 prometheus 调度到 node1 节点,在 node1 节点创建 prometheus 数据存储目录
mkdir /data && chmod 777 /data

#通过 deployment 部署 prometheus
vim prometheus-deploy.yaml

vim prometheus-deploy.yaml
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
      nodePort: 31000
  selector:
    app: prometheus
    component: server

kubectl apply -f prometheus-svc.yaml

kubectl get svc -n monitor-sa
NAME         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus   NodePort   10.105.118.211           9090:31000/TCP   18s

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

3.5Prometheus 配置热加载

###为了每次修改配置文件可以热加载prometheus,也就是不停止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-75fb7f8fc6-46kd9   1/1     Running   0          5m27s   10.244.1.10   node01

#想要使配置生效可用如下命令热加载
curl -X POST -Ls http://10.244.1.10:9090/-/reload

#查看 log
kubectl logs -n monitor-sa prometheus-server-75fb7f8fc6-46kd9  | grep "Loading configuration file"

11-K8S部署普罗米修斯

4.Grafana 安装

vim grafana.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.

    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-grafana
  name: monitoring-grafana
  namespace: kube-system
spec:
  # In a production setup, we recommend accessing Grafana through an external Loadbalancer
  # or through a public IP.

  # type: LoadBalancer
  # You could also use NodePort to expose the service at a randomly-generated port
  # type: NodePort
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
  type: NodePort

kubectl apply -f grafana.yaml

kubectl get pods -n kube-system -l task=monitoring -o wide

[root@master01 prometheus]# kubectl get svc -n kube-system | grep grafana
monitoring-grafana   NodePort    10.100.87.121           80:32745/TCP             2m40s

11-K8S部署普罗米修斯

4.1 Grafana配置

//Grafana 配置
(1)浏览器访问http://192.168.80.20:32745 ,登陆 grafana

(2)开始配置 grafana 的 web 界面:选择 Add data source
【Name】设置成 Prometheus
【Type】选择  Prometheus
【URL】设置成 http://prometheus.monitor-sa.svc:9090      #使用service的集群内部端口配置服务端地址
点击 【Save & Test】

(3)导入监控模板
官方链接搜索:https://grafana.com/dashboards?dataSource=prometheus&search=kubernetes

(4)监控 node 状态
点击左侧+号选择【Import】
点击【Upload .json File】导入 node_exporter.json 模板
【Prometheus】选择 Prometheus
点击【Import】

(5)监控 容器 状态
点击左侧+号选择【Import】
点击【Upload .json File】导入 docker_rev1.json 模板
【Prometheus】选择 Prometheus
点击【Import】

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

5.k8s 部署 kube-state-metrics 组件

(1)安装 kube-state-metrics 组件
#创建 sa,并对 sa 授权
vim kube-state-metrics-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
  verbs: ["list", "watch"]
- apiGroups: ["extensions"]
  resources: ["daemonsets", "deployments", "replicasets"]
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources: ["statefulsets"]
  verbs: ["list", "watch"]
- apiGroups: ["batch"]
  resources: ["cronjobs", "jobs"]
  verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["list", "watch"]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
        image: quay.io/coreos/kube-state-metrics:v1.9.0
        ports:
        - containerPort: 8080
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor-sa
data:
  alertmanager.yml: |-
    global:                    #设置发件人邮箱信息
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.qq.com:25'
      smtp_from: '*******6@qq.com'
      smtp_auth_username: '*******6@qq.com'
      smtp_auth_password: '**********'    #此处为授权码,登录QQ邮箱【设置】->【账户】中的【生成授权码】获取
      smtp_require_tls: false
    route:                        #用于设置告警的分发策略
      group_by: [alertname]         #采用哪个标签来作为分组依据
      group_wait: 10s               #组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
      group_interval: 10s           #上下两组发送告警的间隔时间
      repeat_interval: 10m          #重复发送告警的时间,减少相同邮件的发送频率,默认是1h
      receiver: default-receiver    #定义谁来收告警
    receivers:                    #设置收件人邮箱信息
    - name: 'default-receiver'
      email_configs:
      - to: '*********@qq.com'    #设置收件人邮箱地址
        send_resolved: true

kubectl apply -f alertmanager-cm.yaml

11-K8S部署普罗米修斯

6.2 创建 prometheus 和告警规则配置文件

#上传 prometheus-alertmanager-cfg.yaml 文件

#删除之前的配置,更新配置
kubectl delete -f prometheus-cfg.yaml
kubectl apply -f prometheus-alertmanager-cfg.yaml

kubectl get cm -n monitor-sa
NAME                DATA   AGE
alertmanager        1      3m6s
kube-root-ca.crt    1      63m
prometheus-config   2      6s

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

6.3 安装 prometheus 和 alertmanager

#生成一个 secret 资源 etcd-certs,这个在部署 prometheus 需要,用于监控 etcd 相关资源
kubectl -n monitor-sa create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.key  --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/ca.crt

#更新资源清单 yaml 文件,安装 prometheus 和 alertmanager
vim prometheus-alertmanager-deploy.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    name: prometheus
    kubernetes.io/cluster-service: 'true'
  name: alertmanager
  namespace: monitor-sa
spec:
  ports:
  - name: alertmanager
    nodePort: 30066
    port: 9093
    protocol: TCP
    targetPort: 9093
  selector:
    app: prometheus
  sessionAffinity: None
  type: NodePort

kubectl apply -f alertmanager-svc.yaml

kubectl get svc -n monitor-sa
NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
alertmanager   NodePort   10.111.4.137             9093:30066/TCP   9s
prometheus     NodePort   10.105.118.211           9090:31000/TCP   73m

11-K8S部署普罗米修斯

11-K8S部署普罗米修斯

可以在配置邮箱中收到告警

11-K8S部署普罗米修斯

Original: https://www.cnblogs.com/Canyun-blogs/p/16546087.html
Author: 残-云
Title: 11-K8S部署普罗米修斯

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606434/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球