• 集群外Prometheus 集群 k8s


    一、部署规划

    1、一台普通的机器  192.168.18.9 
    2、k8s 集群一台master节点  192.168.18.7

    二、二进制部署Prometheus (192.168.18.9 )

    下载并解压

    1. cd /opt/
    2. wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz
    3. tar xvf prometheus-2.37.0.linux-amd64.tar.gz

    创建软连接

    ln -sv /opt/prometheus-2.37.0.linux-amd64 /opt/prometheus

    配置自动启动

    --web.enable-lifecycle:配置热加载

    1. cat /etc/systemd/system/prometheus.service
    2. [Unit]
    3. Description=Prometheus Server
    4. Documentation=https://prometheus.io/docs/introduction/overview/
    5. After=network.target
    6. [Service]
    7. Restart=on-failure
    8. WorkingDirectory=/opt/prometheus/
    9. ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --web.enable-lifecycle
    10. [Install]
    11. WantedBy=multi-user.target

    提权

    chmod 777 /etc/systemd/system/prometheus.service
    

    启动

    1. systemctl daemon-reload
    2. systemctl start prometheus
    3. systemctl enable prometheus

    查看端口,启动 9090

    netstat -tunlp |grep prometheus

    三、二进制部署 node_exporter (192.168.18.7)

    node_exporter 是监控本机的基础设施信息状态的,node_exporter 目前支持二进制安装,和部署在k8s 中,二进制安装直接通过本地启动一个9100端口,并将基础设施信息放入127.0.0.1:9100/metrics 中,然后由Prometheus拉取。而部署在k8s 中,由 k8s 在每个运算节点上,启动node-exporters 的 pod,由此pod 去获取本地的基础设施信息放入pod_IP:9100/metrics 中,然后由Prometheus拉取。在这里我们直接给192.168.18.7部署二进制的node_exporter ,以便我们能看出效果。

    安装node_exporter

    1. cd /opt/
    2. wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
    3. tar xvf node_exporter-1.3.1.linux-amd64.tar.gz
    4. ln -sv /opt/node_exporter-1.3.1.linux-amd64 /opt/node_exporter

    启动

    1. cd /opt/node_exporter
    2. ./node_exporter

    测试访问本机的192.168.18.7:9100/metrics

     修改192.168.18.9 机器的 prometheus.yml,添加主机 192.168.18.7 端口号 9100

    1. vim /opt/prometheus/prometheus.yml
    2. static_configs:
    3. - targets: ["localhost:9090","192.168.18.7:9100"]

    热加载192.168.18.9 机器的 prometheus 配置

    curl -X POST http://10.0.0.9:9090/-/reload

    浏览器访问下 prometheus  http://192.168.18.9:9090/targets

     配置一个node_exporter自动启动,提权

    1. [root@VM-0-13-centos ~]# cat /etc/systemd/system/node-exporter.service
    2. [Unit]
    3. Description=Prometheus Node Exporter
    4. After=network.target
    5. [Service]
    6. ExecStart=/opt/node_exporter/node_exporter
    7. [Install]
    8. WantedBy=multi-user.target

    提权

    chmod 777 /etc/systemd/system/node-exporter.service
    

    启动

    1. systemctl start node-exporter.service
    2. systemctl enable node-exporter.service

    三、集群外Prometheus 集群 k8s

    1、创建RBAC

    创建用于 Prometheus 访问 Kubernetes 资源对象的 RBAC 对象,使用serviceaccounts 、集群角色、集群角色绑定。简单理解:集群角色里面带有能访问集群中的那些资源,命名空间、pod资源等等。serviceaccounts 服务账号就是我们使用的账号。集群角色绑定就是将服务账号、集群角色进行绑定,意思是我们拿服务账号由于跟集群角色进行绑定,才有了集群角色的权限。如下cluster-admin是k8s的超级管理员的权限,为了方便本测试直接使用cluster-admin

    1. 1.创建 serviceaccounts,建议将 serviceaccounts 创建在专门收集监控信息(node-exporters、cadvisor、blackbox-exporter等这些kube-state的pod下的命名空间,具体在那个空间下,对集群外的监控影响不大),假如我的在devops
    2. kubectl create sa prometheus -n devops
    3. 2.创建prometheus角色并对其绑定cluster-admin
    4. kubectl create clusterrolebinding prometheus --clusterrole cluster-admin --serviceaccount=devops:prometheus

    建议使用如下,自己创建ClusterRole集群角色,因为 cluster-admin 权限太大了,不安全

    1. vim prom.rbac.yaml
    2. apiVersion: v1
    3. kind: ServiceAccount
    4. metadata:
    5. name: prometheus
    6. namespace: devops #填写对应的namespace
    7. ---
    8. apiVersion: rbac.authorization.k8s.io/v1
    9. kind: ClusterRole
    10. metadata:
    11. name: prometheus
    12. rules:
    13. - apiGroups:
    14. - ""
    15. resources:
    16. - nodes
    17. - services
    18. - endpoints
    19. - pods
    20. - nodes/proxy
    21. verbs:
    22. - get
    23. - list
    24. - watch
    25. - apiGroups:
    26. - "extensions"
    27. resources:
    28. - ingresses
    29. verbs:
    30. - get
    31. - list
    32. - watch
    33. - apiGroups:
    34. - ""
    35. resources:
    36. - configmaps
    37. - nodes/metrics
    38. verbs:
    39. - get
    40. - nonResourceURLs:
    41. - /metrics
    42. verbs:
    43. - get
    44. ---
    45. apiVersion: rbac.authorization.k8s.io/v1beta1
    46. kind: ClusterRoleBinding
    47. metadata:
    48. name: prometheus
    49. roleRef:
    50. apiGroup: rbac.authorization.k8s.io
    51. kind: ClusterRole
    52. name: prometheus
    53. subjects:
    54. - kind: ServiceAccount
    55. name: prometheus
    56. namespace: devops #填写对应的namespace
    kubectl apply -f prom.rbac.yaml

    2、获取serviceaccounts 的token

    k8s 认证授权目前只要有两种,ca认证、serviceaccounts认证,ca认证一般用于创建集群的时候,另一种就是已经可以访问集群,通过集群创建serviceaccounts认证,需要使用serviceaccounts的token

    #获取上面的 Prometheus 对应的 Secret 的信息:

    kubectl get sa prometheus -n devops -o yaml

    kubectl describe secret prometheus-token-m8lbb -n devops

    3、配置Prometheus与RBAC

    实验:本地实验是使用 kubeadm 部署的v1.16.2

    其中 kubeadm 有些资源直接给我们提供了metrices 接口,ok我们这次实验就要获取它

    3.1、保存token文件(192.168.18.9)

    1. mkdikr /opt/prometheus/k8s
    2. cd /opt/prometheus/k8s
    3. vim promethues-rbac-token.yaml

    3.2、配置采集任务

    [root@18_9 prometheus]# cat /opt/prometheus/prometheus.yml

    1. alerting:
    2. alertmanagers:
    3. - static_configs:
    4. - targets:
    5. scrape_configs:
    6. - job_name: "prometheus"
    7. static_configs:
    8. - targets: ["localhost:9090","192.168.18.7:9100"]
    9. - job_name: k8s-coreDns
    10. honor_timestamps: true
    11. metrics_path: /metrics
    12. scheme: http
    13. kubernetes_sd_configs:
    14. - api_server: https://192.168.18.7:6443
    15. role: pod
    16. bearer_token_file: k8s/promethues-rbac-token.yaml
    17. tls_config:
    18. insecure_skip_verify: true
    19. bearer_token_file: k8s/promethues-rbac-token.yaml
    20. tls_config:
    21. insecure_skip_verify: true
    22. relabel_configs:
    23. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme]
    24. separator: ;
    25. regex: coreDns
    26. replacement: $1
    27. action: keep
    28. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    29. separator: ;
    30. regex: (.+)
    31. target_label: __metrics_path__
    32. replacement: $1
    33. action: replace
    34. - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    35. separator: ;
    36. regex: ([^:]+)(?::\d+)?;(\d+)
    37. target_label: __address__
    38. replacement: $1:$2
    39. action: replace
    40. - separator: ;
    41. regex: __meta_kubernetes_pod_label_(.+)
    42. replacement: $1
    43. action: labelmap
    44. - source_labels: [__meta_kubernetes_namespace]
    45. separator: ;
    46. regex: (.*)
    47. target_label: kubernetes_namespace
    48. replacement: $1
    49. action: replace
    50. - source_labels: [__meta_kubernetes_pod_name]
    51. separator: ;
    52. regex: (.*)
    53. target_label: kubernetes_pod_name
    54. replacement: $1
    55. action: replace
    56. [root@18_9 prometheus]#

    讲解:

    1. 1、如果打开默认的prometheus.yaml,会发现几乎都注释,只有alerting和scrape_configs模块由内容
    2. ----------------------------------------------------------------------------------------
    3. 2、其中alerting模块针对的是报警机制
    4. alerting:
    5. alertmanagers:
    6. - static_configs:
    7. - targets:
    8. ----------------------------------------------------------------------------------------
    9. 3、其中scrape_configs模块针对的是如何获取监控机制
    10. scrape_configs:
    11. - job_name: "prometheus" #其中一个job_name代表一个监控项目
    12. static_configs:
    13. - targets: ["localhost:9090","192.168.18.7:9100"] 很明显,直接看监控本机的localhost:9090,这个是自身监控,192.168.18.7:9100我们刚刚配置的监控
    14. - job_name: k8s-coreDns # 其中一个job_name代表一个监控项目
    15. honor_timestamps: true
    16. metrics_path: /metrics # 代表监控的路径
    17. scheme: http # 代表监控的协议,如上的信息,代表监控http://IP/metrics
    18. kubernetes_sd_configs: # 此项目重点,代表自动发现,你要知道prometheus是跟kubernetes都是google的产品,对自己产品做了支持,自动发现
    19. - api_server: https://192.168.18.7:6443 # 从那接入kubernetes,如果在容器中部署prometheus都不用写
    20. role: pod # 监控的类型是pod,这也是prometheus写好的,可以监控pod|node 等
    21. bearer_token_file: k8s/promethues-rbac-token.yaml # 重点,使用的rbac
    22. tls_config: # 是不是用tls协议
    23. insecure_skip_verify: true
    24. bearer_token_file: k8s/promethues-rbac-token.yaml # 使用的rbac
    25. tls_config: # 是不是用tls协议
    26. insecure_skip_verify: true
    27. relabel_configs: # 重点如何匹配需要的pod,先看 action: keep
    28. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme] # 这里面说了,我要匹配pod的注释annotation,带有prometheus_io_scheme的注释
    29. separator: ;
    30. regex: coreDns # 而且prometheus_io_scheme=coreDns
    31. replacement: $1
    32. action: keep
    33. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] # 这里面说了,我要匹配pod的注释annotation,带有prometheus_io_path的注释
    34. separator: ;
    35. regex: (.+) # 而且prometheus_io_path=$1,$1取的就是上面的metrics_path: /metrics,也就是prometheus_io_path=/metrics
    36. target_label: __metrics_path__
    37. replacement: $1
    38. action: replace
    39. - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] # 这里面说了,我要匹配pod的注释annotation,带有prometheus_io_port的注释
    40. separator: ;
    41. regex: ([^:]+)(?::\d+)?;(\d+)
    42. target_label: __address__
    43. replacement: $1:$2
    44. action: replace
    45. - separator: ;
    46. regex: __meta_kubernetes_pod_label_(.+)
    47. replacement: $1
    48. action: labelmap
    49. - source_labels: [__meta_kubernetes_namespace]
    50. separator: ;
    51. regex: (.*)
    52. target_label: kubernetes_namespace
    53. replacement: $1
    54. action: replace
    55. - source_labels: [__meta_kubernetes_pod_name]
    56. separator: ;
    57. regex: (.*)
    58. target_label: kubernetes_pod_name
    59. replacement: $1
    60. action: replace
    61. [root@18_9 prometheus]#

    总上所述,匹配的是带有

    1. annotations:
    2. "prometheus_io_path": "/metrics"
    3. "prometheus_io_port": "9153"
    4. "prometheus_io_scheme": "coreDns"

    3.2、改造coreDns,增加注释,注意annotations 跟 label 同级

    kubectl edit deploy coredns -n kube-system  # 注意加上" ",否则报错

    kubectl get deploy coredns -n kube-system -oyaml

    3.3、查看http://192.168.18.9:9090/targets

    这时候发现,prometheus已经通过api接口自动发现了pod,但是是down,原因是Get "http://172.7.0.66:9153/metrics": context deadline exceeded,意思即使本机没法访问集群中的pod

     所以建议在此机器部署为node节点,或者了解 CNI 插件原理,比如我的机器192.168.18.9 
    192.168.18.7 就是同网段的,所以去往172.7.0.66 172.7.0.67 的流量可以直接写route

    查看http://192.168.18.9:9090/targets

  • 相关阅读:
    C# Thread.Sleep 不精准的问题以及解决方案
    ValueError: --caption_column‘ value ‘text‘ needs to be one of: image
    vue-使用input封装上传文件图片全局组件
    flask 可插拔视图
    keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化
    加锁和解锁-ReentrantLock详解-AQS-并发编程(Java)
    后端进阶知识 Buffer pool 图文详解 之 free链表
    OPENCV实现暴力特征匹配
    数据分析之假设检验
    YOLOV5对接微信小程序
  • 原文地址:https://blog.csdn.net/Jerry00713/article/details/126655828