Prometheus 外置基于k8s服务发现通过Cadvisor监控Kubernetes

Prometheus服务发现


Prometheus添加被监控端支持两种方式:

• 静态配置:手动配置

• 服务发现:动态发现需要监控的Target实例

支持服务发现的来源

• azure_sd_configs

• consul_sd_configs

• dns_sd_configs

• ec2_sd_configs

• openstack_sd_configs

• file_sd_configs

• gce_sd_configs

• kubernetes_sd_configs

• marathon_sd_configs

• nerve_sd_configs

• serverset_sd_configs

• triton_sd_configs

集成cAdvisor


集成方式

Kubernetes主要提供了如下5种服务发现模式和Prometheus进行集成:

  • Node
  • Pod
  • Endpoints
  • Service
  • Ingress

使用cAdvisor主要需要使用Node服务发现模式,配置方式如下所示

Node服务发现模式


        kubernetes_sd_configs:
        - role: node

监控方法


监控对象监控指标内容服务发现模式监控方式数据来源
集群各节点Kubelet组件各节点Kubelet的基本运行状态相关的监控指标node白盒监控Kubelet

监控Kubernetes


 基于k8s的监控使用基于k8s的服务发现来实现

监控指标

Kubernetes本身监控
Node资源利用率
Node数量
Pods数量(Node)
资源对象状态
Pod监控
Pod数量(项目)
容器资源利用率
应用程序

Cadvisor内置在kubelet当中,通过kubelet暴露的api去访问的

 监控Kubernetes


普罗米修斯通过Cadvisor监控k8s


 Kubernetes默认提供cAdvisor和特定节点的时间序列。我们可以创建一个作业来从每个节点的Kubernetes API中抓取这些时间序列。我们可以使用这些时间序列来监控节点,以及每个节点上的Docker守护进程和容器。

这里将作业命名为 kubernetes-cadvisor ,并使用服务发现来返回 node 角色的 Kubernetes 节点列表。我们使用https 来抓取指标,并指定证书颁发机构和一个本地令牌文件以对 Kubernetes 进行身份验证。
然后我们重新标记时间序列,以便从使用 labelmap 发现的元数据标签中创建标签,将 __address__ 标签替换为Kubernetes API 服务器的默认 DNS 名称。然后,我们使用其中一个元数据标签,一个带有节点名称的标签,在API 上创建一个新标签 __metrics_path__ ,它将节点名称传递给路径。

 监控K8s集群Pod步骤:

1、K8s RBAC授权

现在普罗米修斯要通过服务发现连接到k8s集群,k8s授权普罗米修斯可以访问如下地址

[root@k8s-master ~]# kubectl get ep
NAME         ENDPOINTS              AGE
kubernetes   192.168.179.102:6443   74d

Prometheus -> apiserver(192.168.179.102:6443)->kubelet(cadvisor) 

这个过程是需要授权的,所以第一步就是授权

[root@k8s-master ~]# cat rbac.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
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-system 


[root@k8s-master ~]# kubectl apply -f rbac.yaml 
serviceaccount/prometheus created

现在要拿到创建rbac产生的token,,这是非常关键的,让普罗米修斯拿着这个token去访问api那么就具有rbac里面授予的权限了 

怎么拿到这个token呢,产生的sa在kube-system上,怎么拿到这个token呢,产生的sa在kube-system上

[root@k8s-master ~]# kubectl get sa -n kube-system | grep prome
prometheus                           1         4m59s
[root@k8s-master ~]# kubectl describe sa prometheus -n kube-system 
Name:                prometheus
Namespace:           kube-system
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   prometheus-token-jq2kg
Tokens:              prometheus-token-jq2kg
Events:              <none>

Token保存在这个secret当中 prometheus-token-jq2kg

[root@k8s-master ~]# kubectl describe secret prometheus-token-jq2kg -n kube-system 
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InR0cTRHNDNQUGFMeUZ5Rnp1azZnSUEyRVU0WEY1dWdEMEYwd056ZnNkWWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJwcm9tZXRoZXVzLXRva2VuLWpxMmtnIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InByb21ldGhldXMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxNDYxYTU1Mi0xZWE0LTRjYWQtOTdhOC05YmE1Zjg2YjhkMmYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06cHJvbWV0aGV1cyJ9.FfRTfjE5ih9ZvCy0XFL1Trc00H7k1s6kkGmFvnkKJghswTLeATRPfziAJqrBYBYY0dA8IK52WEa0JR2TevtotnWOyIXZnv6KWcPb0RObvlL4dxp1ZJyZRAc01rliyukTU2HphgX2NlLnf_TZHMo1bapPf8crDdMlZHoEe42ukMtr1nZrPgChXJCtGoR383bAWDoDrq1nZ7e8xCQnoxEkq_khLO9ypHqAlFfMCG-w0x35uC1Wa06FdoeygW0gABDK_Ltgvz6_IuLM9wLl54SnPZJEPSMfiNpuvN8vDWNUcjqPj1Lqi3eSMKLf7b3zBvlTEcLQKoUQdXBdg-97pfeDVw

2、获取Token并保存到文件 

 拿到这个token,拷贝到普罗米修斯这个节点

[root@k8s-master ~]# kubectl describe secret prometheus-token-jq2kg -n kube-system > token.k8s
[root@k8s-master ~]# scp token.k8s root@192.168.179.99:/usr/local/prometheus

在普罗米修斯上只保存这token值,其余的全部去掉 

[root@localhost prometheus]# cat token.k8s 
eyJhbGciOiJSUzI1NiIsImtpZCI6InR0cTRHNDNQUGFMeUZ5Rnp1azZnSUEyRVU0WEY1dWdEMEYwd056ZnNkWWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJwcm9tZXRoZXVzLXRva2VuLWpxMmtnIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InByb21ldGhldXMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxNDYxYTU1Mi0xZWE0LTRjYWQtOTdhOC05YmE1Zjg2YjhkMmYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06cHJvbWV0aGV1cyJ9.FfRTfjE5ih9ZvCy0XFL1Trc00H7k1s6kkGmFvnkKJghswTLeATRPfziAJqrBYBYY0dA8IK52WEa0JR2TevtotnWOyIXZnv6KWcPb0RObvlL4dxp1ZJyZRAc01rliyukTU2HphgX2NlLnf_TZHMo1bapPf8crDdMlZHoEe42ukMtr1nZrPgChXJCtGoR383bAWDoDrq1nZ7e8xCQnoxEkq_khLO9ypHqAlFfMCG-w0x35uC1Wa06FdoeygW0gABDK_Ltgvz6_IuLM9wLl54SnPZJEPSMfiNpuvN8vDWNUcjqPj1Lqi3eSMKLf7b3zBvlTEcLQKoUQdXBdg-97pfeDVw

 现在可以让普罗米修斯拿着这个token访问api了

 3、创建Job和kubeconfig_sd_configs

现在可以让普罗米修斯拿着这个token访问api了,这里启用的是k8s服务发现的配置

[root@localhost ~]# vim /usr/local/prometheus/prometheus.yml 

- job_name: kubernetes-nodes-cadvisor
    metrics_path: /metrics
    scheme: https   #访问api使用https访问
    kubernetes_sd_configs:
    - role: node   #指定服务发现类型的角色为node
      api_server: https://192.168.179.102:6443
      bearer_token_file: /usr/local/prometheus/token.k8s
      tls_config:
        insecure_skip_verify: true #跳过https验证,因为自签发,不受信任,跳过证书校验
    bearer_token_file: /usr/local/prometheus/token.k8s
    tls_config:   
      insecure_skip_verify: true   #跳过证书
    relabel_configs:
    # 将标签(.*)作为新标签名,原有值不变
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.*)
    # 修改NodeIP:10250为APIServerIP:6443
    - action: replace
      regex: (.*)
      source_labels: ["__address__"]
      target_label: __address__
      replacement: 192.168.31.61:6443
    # 实际访问指标接口 https://NodeIP:10250/metrics/cadvisor 这个接口只能APISERVER访问,故此重新标记>标签使用APISERVER代理访问
    - action: replace
      source_labels: [__meta_kubernetes_node_name]
      target_label: __metrics_path__
      regex: (.*)
      replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

[root@localhost prometheus]# ./promtool check config prometheus.yml 
Checking prometheus.yml
  SUCCESS: 0 rule files found

https://192.168.179.102:6443/api/v1/nodes/k8s-node1/proxy/metrics/cadvisor

这些数据就是从这个地址下面拿到的 ,如果你将该段去掉,可以看到没有重新标记标签会采集不到数据

#    - action: replace
#      source_labels: [__meta_kubernetes_node_name]
#      target_label: __metrics_path__
#      regex: (.*)
#      replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值