添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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) 资源对象状态

普罗米修斯通过Cadvisor监控k8s

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

这里将作业命名为 kubernetes-cadvisor ,并使用服务发现来返回 Kubernetes 节点列表。我们使用https 来抓取指标,并指定证书颁发机构和一个本地令牌文件以对 Kubernetes 进行身份验证。 然后我们重新标记时间序列,以便从使用 labelmap 发现的元数据标签中创建标签,将 __address__ 标签替换为Kubernetes API 服务器的默认 名称。然后,我们使用其中一个元数据标签,一个带有节点名称的标签,在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 
摘要更高级一些,是对直方图的扩展。除了提供观察的总和和计数之外,它们还提供滑动窗口上的分位数度量。分位数是将概率密度划分为相等概率范围的方法。对比直方图:直方图随时间汇总值,给出总和和计数函数,使得易于查看给定指标的变化趋势。而摘要则给出了滑动窗口上的分位数(即随时间不断变化)。 Prometheus是由SoundCloud开发的开源监控系统的开源版本。2016年,由Google发起的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目。 高效:单一Prometheus可以处理数以百万的监控指标;每秒处理数十万的数据点。 易于伸缩:通过使用功能分区(sharing)+联邦集群(federation)可以对Prometheus进行扩展,形成一个逻辑集群;Prometheus提供多种语言的客户端SDK,这些SDK可以快速让应用程序纳入到Prometheus监控当中。 良好的可视化:Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的API还可以实现自己的监控可视化UI。 cadvisor守护程序集 这是cadvisor的守护程序集,该程序集将 Web界面部署到每个节点。 Pod的度量标准由cAdvisor每秒更新一次,并且可以通过编程方式获得。 这是Kubernetes中通常可用的更高的度量频率。 这种守护程序集是使Pod达到第二个指标的好方法。 externalTrafficPolicy: Local 服务配置设置为使用externalTrafficPolicy: Local ,这意味着发送到集群服务cadvisor.kube-system.svc.cluster.local )的查询不会路由到其他节点。 来自Pod或来自外部源的所有查询均由在处理请求的节点上运行的cAdvisor守护程序Pod处理。 另外,由于cAdvisor不支持群集,因此这意味着您无法从运行Pod的节点外部的源中查询Pod的统计信息。 这种设置是专为可快速(每秒)获取其 1. cAdvisor简介 ​ cAdvisor对Node机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况,cAdvisor集成在Kubelet中,当kubelet启动时会自动启动cAdvisor,即一个cAdvisor仅对一台Node机器进行监控。kubelet的启动参数–cadvisor-port可以定义cAdvisor对外提供服务的端口,默认为4194。可以通过浏览器访问。项目主页:http://github.com/google/cadvi 说到容器监控我们自然会想到 cAdvisor,因为 cAdvisor 已经内置在了 kubelet 组件之中,所以我们可以直接通过访问 kubelet 的 /metrics/cadvisor 这个路径来获取 cAdvisor 的数据, 同样我们这里使用 node 的服务发现模式,因为每一个节点下面都有 kubelet,自然都有 cAdvisor 采集到的数据指标,在Prometheus中添加如下配置: - job_name: "cadvisor" kubernetes_sd_conf 说到容器监控我们自然会想到cAdvisor,我们前面也说过cAdvisor已经内置在了 kubelet 组件之中,所以我们不需要单独去安装。 cAdvisor的数据路径为/api/v1/nodes/<node>/. 【prometheus】-05 Kubernetes云原生监控之节点性能监控2021-08-30 【prometheus】-04 轻松搞定Prometheus Eureka服务发现2021... 遍历imageRecords中的所有镜像,如果该镜像的最后使用时间小于执行第一步时的时间戳,且该镜像的存在时间大于MinAge,则删除该镜像,并且将删除Docker镜像计入释放的磁盘空间值,如果释放的空间总量大于等于前面公式计算得到的amountToFree值,则本轮镜像回收工作结束。首先,获取镜像信息。与容器的垃圾回收机制的目的一样,Docker镜像垃圾回收机制主要是为了防止长时间未使用的镜像占据大量的磁盘空间,而且过多的镜像还会拖慢很多Docker请求处理的速度(因为要load的graph太大了)。.. 默认情况下,当Prometheus加载Target实例完成后,这些Target时候都会包含一些默认的标签: 上面这些标签将会告诉Prometheus如何从该Target实例中获取监控数据。一般来说,Target以__作为前置的标签是在系统内部使用的,因此这些标签不会被写入到样本数据中。不过这里有一些例外,例如,我们会发现所有通过Prometheus采集的样本数据中都会包含一个名为instanc... Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机。更多详细操作和配置选项可以查看Github上的cAdvisor项目文档。 1. cAdvisor简介​ cAdvisor对Node机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况,cAdvisor集成在Kubelet中,当kubelet启动时会自动启动cAdvisor,即一个cAdvisor仅对一台Node机器进行监控。kubelet的启动参数–cadvisor-port可以定义cAdvisor对外提供服务