集群外部Prometheus 监控Kubernetes 集群
很多都是通过在k8s集群内部安装prometheus来进行k8s的集群监控,但是在企业的云原生过程中,往往会出现多种类型(容器化与非容器化)的服务并存的情况,一般会将prometheus部署在k8s集群外部,但是最终还是希望可以将prometheus部署在k8s集群内,这样不仅可以充分运用服务器的资源,还避免授权相关的问题。但是还是会有大量的使用prometheus监控外部的k8s集群的需求。
一、概述
很多都是通过在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 集群的数据了:
四、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
更多推荐
所有评论(0)