一、概述

很多都是通过在k8s集群内部安装prometheus来进行k8s的集群监控,但是在企业的云原生过程中,往往会出现多种类型(容器化与非容器化)的服务并存的情况,一般会将prometheus部署在k8s集群外部,但是最终还是希望可以将prometheus部署在k8s集群内,这样不仅可以充分运用服务器的资源,还避免授权相关的问题。但是还是会有大量的使用prometheus监控外部的k8s集群的需求。

二、采集数据

在容器化时代,cAdvisor 是一款广泛用于容器监控资源占用以及性能特性的工具,可以用来收集,聚合,导出容器相关信息

由于自Kubernetes版本1.12开始,cAdvisor已经集成到kubelet中,因此在Kubernetes 1.12或更高版本中,cAdvisor已经成为kubelet二进制文件的一部分,不再需要单独安装cAdvisor。

三、详细配置

当我们想通过cadvisor采集容器信息,可以通过apiserver的形式kubernetes_sd_configs做服务发现,也就是我们需要在集群外提供有相关权限的serviceaccount的tonken,已及apiserver的访问地址,就可以获取到容器信息了

1、创建RBAC

#创建服务账号
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
---
###因为我的k8s版本为1.24,所以需要手动将secret与service-account绑定
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: prometheus
  namespace: kube-mon
  annotations:
    kubernetes.io/service-account.name: "prometheus"

创建服务账号等信息

[root@iZbp1igh8gtzjj9sgk4cykZ monitor]# kubectl apply -f external-prometheus-clusterroles.yaml 
serviceaccount/prometheus unchanged
clusterrole.rbac.authorization.k8s.io/prometheus unchanged
clusterrolebinding.rbac.authorization.k8s.io/prometheus unchanged
secret/prometheus unchanged

检查服务账号信息

[root@iZbp1igh8gtzjj9sgk4cykZ monitor]# kubectl -n kube-mon get serviceaccounts 
NAME         SECRETS   AGE
default      0         5h35m
prometheus   0         3h24m

2、获取token

打印出token

[root@iZbp1igh8gtzjj9sgk4cykZ monitor]# kubectl -n kube-mon describe secrets prometheus 
Name:         prometheus
Namespace:    kube-mon
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: prometheus
              kubernetes.io/service-account.uid: 66ea9b92-be5c-4403-9e5a-1bb623816190

Type:  kubernetes.io/service-account-token

Data
====
namespace:  8 bytes
token:      <token信息>
ca.crt:     1310 bytes

通过 token 信息用于访问 APIServer 的数据,可以将 token 信息保存到一个名为 k8s.token 的文本文件中,需要和prometheus的配置文件prometheus.yml在同一目录下。

3、prometheus配置

现在我们添加一个 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://192.168.1.10: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: 192.168.1.10: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 地址。

这里监控 cAdvisor,同样可以通过 relabel_configs 来配置,将 __metrics_path__ 转换为 /api/v1/nodes/${1}/proxy/metrics/cadvisor,相当于通过 APIServer 代理到 Kubelet 上获取数据,当然如果你的 Prometheus 能够直接访问到 kubelet,也可以配置成直接请求,这样就相当于服务发现使用 APIServer,采集直接走 Kubelet。

现在去 Prometheus web页面就可以看到采集的外部 Kubernetes 集群的数据了:

1716287283010)

四、Grafana展示

Grafana导入k8s集群资源对象监控仪表盘 6417、3119

在这里插入图片描述

有一些需要进行修改,比如内存相关信息

promQL语句需要修改为以下信息,其他无法正确显示的也需要进行修改

sum (container_memory_working_set_bytes{image!="",container!="",kubernetes_io_hostname=~"^$Node$"}) by (container, pod)

在这里插入图片描述

参考:https://blog.csdn.net/qq_34556414/article/details/138846952

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐