K8S环境下的监控体系搭建与使用
概述
对于一套成熟的K8S环境,需要对其云原生资源、底层主机信息、网络环境有一个整体的监控功能。在这里,我们假定已经能够完成了整体的K8S部署,拥有健全的k8s环境。K8S的安装在这里不再赘述,推荐使用kubeadm或者是开源二进制脚本工具K8S脚本链接
Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。
部署
在这里我们使用官方提供的一套K8s环境下的解决方案kube-prometheus 进行部署,其是一整套监控解决方案,它使用 Prometheus 采集集群指标,Grafana 做展示,包含如下组件
-
The Prometheus Operator
-
Highly available Prometheus
-
Highly available Alertmanager
-
Prometheus node-exporter
-
Prometheus Adapter for Kubernetes Metrics APIs (k8s-prometheus-adapter)
-
kube-state-metrics
-
Grafana
该解决方案中,对Prometheus中不同的组件适配上了不同的K8S资源,使得各个组件能各司其职,稳定运行。其高效的脚本化部署方式大幅度地减少了人工成本,实现一键部署。最终地,其各个运行组件如下图所示。
kube-prometheus用于集群监控,因此它被预先配置为从所有Kubernetes组件收集度量。除此之外,它还提供了一组默认的仪表板和警报规则。许多有用的仪表板和警报来自kubernetes mixin项目,与此项目类似,它提供了可组合的jsonnet库,供用户根据自己的需求进行自定义。
选择源码
使用的代码如下,首先去官方github中拉取代码。由于本文使用的K8S版本为1.23.1版本,我选择的kube-prometheus版本为release-0.10。
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
git branch -r # 查看当前分支有哪些
git checkout release-0.10 # 切换到自己 Kubernetes 兼容的版本
注意,这里选择不同分支需要适配对应的Kubernetes版本,其对应版本信息如下所示:
kube-prometheus stack | Kubernetes 1.21 | Kubernetes 1.22 | Kubernetes 1.23 | Kubernetes 1.24 | Kubernetes 1.25 |
---|---|---|---|---|---|
release-0.9 |
✔ | ✔ | ✗ | ✗ | ✗ |
release-0.10 |
✗ | ✔ | ✔ | ✗ | ✗ |
release-0.11 |
✗ | ✗ | ✔ | ✔ | ✗ |
release-0.12 |
✗ | ✗ | ✗ | ✔ | ✔ |
main |
✗ | ✗ | ✗ | ✗ | ✔ |
当完成源码下载后,直接打包上传至k8s集群中即可。注意上传的节点要求必须拥有k8s的访问权限、能够使用kubectl工具进行操作。
解决镜像问题(国内无法访问的问题)
在国内一些环境中,官方提供的镜像仓一般无法访问,在这里需要手动将代码进行修改,将国外的镜像仓改成国内的镜像仓。具体需要修改的,可参照如下表格找到对应文件进行修改
文件 | 原镜像地址 | 国内镜像地址 |
---|---|---|
manifests/* | quay.io开头的镜像仓 | quay.mirrors.ustc.edu.cn改为如此 |
manifests/kubeStateMetrics-deployment.yaml | k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.3.0 | willdockerhub/kube-state-metrics:v2.3.0 |
manifests/prometheusAdapter-deployment.yaml | k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1 | willdockerhub/prometheus-adapter:v0.9.1 |
添加外网访问方式
在这里需要将grafana端口暴露出来供使用,需要修改grafana-service.yaml资源文件,将其修改为如下:
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 8.3.3
name: grafana
namespace: monitoring
spec:
type: NodePort
ports:
- name: http
port: 3000
nodePort: 32000
targetPort: http
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
其他组件不推荐将端口进行暴露,因为grafana具有鉴权功能,其他组件目前不涉及鉴权。
k8s环境中部署
将修改好的代码上传至服务器后,可以执行如下命令
kubectl apply -f setup/
# 下载prometheus-operator镜像需要花费几分钟,这里等待几分钟,直到prometheus-operator变成running状态
kubectl apply -f .
watch kubectl get po -n monitoring # 等待所有镜像变成Running状态
成功部署后,可以发现所有的pod都正在运行,即部署成功
使用Prometheus
使用prometheus时,可以通过以下命令找到grafana的nodeport端口,之后通过浏览器访问即可。
kubectl -n monitoring get svc
基本模板面盘
在本集合的grafana中,已经事先提供了一些dashbord供使用,在这里像本文作者这样的初学者可以学习其设计思路以构建自己的面板。具体的点击路径如下。其提供的模板均为适配K8S环境的dashbord。一般可以直接进行使用。