美文网首页
物理机或虚机安装prometheus监控k8s集群的正确配置姿势

物理机或虚机安装prometheus监控k8s集群的正确配置姿势

作者: jerry的技术与思维 | 来源:发表于2020-12-13 21:54 被阅读0次

    网上大量的文章介绍prometheus监控k8s集群是将 Prometheus 安装在 Kubernetes 集群中来采集数据,但是在实际环境中很多企业是将 Prometheus 单独部署在集群外部的,所以使用 Prometheus 监控外部的 Kubernetes 集群这个需求还是非常有必要的。

    比如现在我们要去采集 Kubernetes 集群 cAdvisor 的监控数据,我们就可以利用 APIServer 通过 kubelet 去获取到对应的数据。如果我们对集群内部的 Prometheus 自动发现 Kubernetes 的数据比较熟悉的话,那么监控外部集群的原理也是一样的,只是访问 APIServer 的形式有 inCluster 模式变成了 KubeConfig 的模式,inCluster 模式下在 Pod 中就已经自动注入了访问集群的 token 和 ca.crt 文件,所以非常方便,那么在集群外的话就需要我们手动提供这两个文件,才能够做到自动发现了。

    划重点,查看文档在通过 kubernetes_sd_configs 做服务发现的时候只需要填入 Kubernetes 集群的 api_server、ca_file、bearer_token_file 信息即可。

    第一步,创建RBAC对象

    创建用于 Prometheus 访问 Kubernetes 资源对象的 RBAC 对象:

    # prom.rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: prometheus
      namespace: kube-mon
    ---
    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:
      - "extensions"
      resources:
        - ingresses
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - configmaps
      - nodes/metrics
      verbs:
      - get
    - 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: prometheus
      namespace: kube-mon
    

    在 Kubernetes 集群中创建上面的资源对象:

    $ kubectl apply -f prom.rbac.yaml

    第二步 获取secret

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

    $ kubectl get sa prometheus -n kube-mon -o yaml
    ......
    secrets:
    - name: prometheus-token-wj7fb
    $ kubectl describe secret prometheus-token-wj7fb -n kube-mon
    Name:         prometheus-token-wj7fb
    Namespace:    kube-mon
    ......
    
    Data
    ====
    namespace:  8 bytes
    token:      <token string>
    ca.crt:     1025 bytes
    

    上面的 token 和 ca.crt 信息就是我们用于访问 APIServer 的数据,可以将 token 信息保存到一个名为 k8s.token 的文本文件中。

    第三步 创建prometheus的收集job

    现在我们添加一个 Prometheus 监控外部 Kubernetes 集群数据的任务,如下所示:

    # prometheus.yml
    global:
      scrape_interval: 15s
      scrape_timeout: 15s
    scrape_configs:
    - job_name: k8s-cadvisor
      honor_timestamps: true
      metrics_path: /metrics
      scheme: https
      kubernetes_sd_configs:  # kubernetes 自动发现
      - api_server: https://10.151.30.11:6443  # apiserver 地址
        role: node  # node 类型的自动发现
        bearer_token_file: k8s.token
        tls_config:
          insecure_skip_verify: true
      bearer_token_file: k8s.token
      tls_config:
        insecure_skip_verify: true
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - separator: ;
        regex: (.*)
        target_label: __address__
        replacement: 10.151.30.11:6443
        action: replace
      - source_labels: [__meta_kubernetes_node_name]
        separator: ;
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
        action: replace
    

    这里 bearer_token_file 就是上面生成的 k8s.token 文件,当然我们也可以直接用 bearer_token 直接将对应的字符串放置在这里,另外要记得将 api_server 替换成你 Prometheus 所在的节点能访问到的 APIServer 地址。

    pod的收集配置

    - job_name: kubernetes-pods
      honor_timestamps: true
      scrape_interval: 1m
      scrape_timeout: 10s
      metrics_path: /metrics
      scheme: http
      kubernetes_sd_configs:
      - api_server: https://apiserver.k8s.local:6443
        role: pod
        bearer_token_file: /etc/prometheus/k8s/k8s.token
        tls_config:
          insecure_skip_verify: true
      bearer_token_file: /etc/prometheus/k8s/k8s.token
      tls_config:
        insecure_skip_verify: true
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        separator: ;
        regex: "true"
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        separator: ;
        regex: (.+)
        target_label: __metrics_path__
        replacement: $1
        action: replace
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        separator: ;
        regex: ([^:]+)(?::\d+)?;(\d+)
        target_label: __address__
        replacement: $1:$2
        action: replace
      - separator: ;
        regex: __meta_kubernetes_pod_label_(.+)
        replacement: $1
        action: labelmap
      - source_labels: [__meta_kubernetes_namespace]
        separator: ;
        regex: (.*)
        target_label: namespace
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_pod_name]
        separator: ;
        regex: (.*)
        target_label: pod_name
        replacement: $1
        action: replace
    

    对应pod的自动收集需要在deploy的部署文件中增加metadata

    在deployment中的 template->metadata->annotations 增加
    prometheus.io/scrape: "true"
    prometheus.io/port: "8081"
    prometheus.io/path: "/actuator/prometheus"

    kubernetes会查找prometheus.io/scrape=true注释的pod 。如果可以使用此注释,则Prometheus会自动获取指标。

    relabel_configs简单说明

    Prometheus允许用户在采集任务设置中通过relabel_configs来添加自定义的Relabeling过程。

    完整的relabel_config配置如下所示:

    • address:当前Target实例的访问地址<host>:<port>

    • scheme:采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS

    • metrics_path:采集目标服务访问地址的访问路径

    • _param<name>:采集任务目标服务的中包含的请求参数

    其中action定义了当前relabel_config对Metadata标签的处理方式,默认的action行为为replace。

    replace是根据regex的配置匹配source_labels标签的值(多个source_label的值会按照separator进行拼接),并且将匹配到的值写入到target_label当中,如果有多个匹配组,则可以使用'{1},{2}'确定写入的内容。如果没匹配到任何内容则不对target_label进行修改。

    当action设置为keep时,Prometheus会丢弃source_labels的值中没有匹配到regex正则表达式内容的Target实例,而当action设置为drop时,则会丢弃那些source_labels的值匹配到regex正则表达式内容的Target实例。

    相关文章

      网友评论

          本文标题:物理机或虚机安装prometheus监控k8s集群的正确配置姿势

          本文链接:https://www.haomeiwen.com/subject/hhxmgktx.html