Prometheus Operator部署/管理Prometheus Server一、Prometheus Operator & Kube-Prometheus & Helm chart 部署区别二、Prometheus-Operator CRD资源2.1、CRD 全称是 Custom Resource Definition2.2、Prometheus-Operator CRD三、部署 Kube-Prometheus3.1、概述3.2、下载 Kube-Prometheus 代码3.3、修改 Kube-Prometheus 镜像源3.4、安装operator & kube-Prometheus3.5、配置Ingress资源对象四、访问验证4.1、prometheus4.2、granfana4.3、alertmanager五、总结
Prometheus Operator 是 Kubernetes 原生的工具,它通过将 Prometheus 资源定义为 Kubernetes 对象(CRD)来简化 Prometheus 集群的管理。它自动化了在 Kubernetes 中配置和扩展 Prometheus 实例时涉及的常见任务,并提供了在 Kubernetes 环境中部署、配置和管理 Prometheus 的简单方式。
官方安装文档: https://prometheus-operator.dev/docs/user-guides/getting-started/ 需要Kubernetes版本至少在v1.16.x以上。
官方Github地址:https://github.com/prometheus-operator/prometheus-operator
kube-prometheus 提供基于Prometheus & Prometheus Operator完整的集群监控配置示例,包括多实例Prometheus & Alertmanager部署与配置及node exporter的metrics采集,以及scrape Prometheus target各种不同的metrics endpoints,并提供Alerting rules一些示例,触发告警集群潜在的问题。
官方安装文档:https://prometheus-operator.dev/docs/prologue/quick-start/
安装要求:https://github.com/prometheus-operator/kube-prometheus#compatibility
官方Github地址:https://github.com/prometheus-operator/kube-prometheus
helm chart prometheus-community/kube-prometheus-stack 提供类似kube-prometheus的功能,但是该项目是由Prometheus-community来维护。
总结:三者部署 Prometheus 的区别
Kube-Prometheus:目前是k8s集群监控的主流项目,主要使用Prometheus做集群监控,使用Prometheus Operator做监控的运维管理,也就是以上二者的结合。
什么是 CRD?
以 Deployment 为实例,Deployment 没有直接创建 Pod,而是管理 RS,而 RS 管理 Pod,这就是控制器模式。控制器模式允许基于已有的资源定义更高阶的控制器,用来实现更复杂的能力。
特点:
CRD 本身是一种 Kubernetes 内置的资源类型,即自定义资源的定义,用于描述用户定义的资源是什么样子。
# kubectl get crd
NAME CREATED AT
applications.app.k8s.io 2022-08-12T10:01:21Z
authconfigs.enterprise.gloo.solo.io 2022-08-25T03:54:14Z
Prometheus Operator
的本职就是一组用户自定义的CRD
资源以及Controller
的实现,Prometheus Operator
负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server
自身以及配置的自动化管理工作。主要包括以下几个功能:
上面架构图中,各组件以不同的方式运行在 Kubernetes 集群中(之前都是用配置文件来配置,现在都是通过资源对象):
CRD 名称 | 作用 |
---|---|
Operator | 根据自定义资源(Custom Resource Definition / CRDs)来部署和管理 Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。 |
Prometheus | 最核心的一个CRD, 控制prometheus server的statefulset状态。该CRD用于部署、管理prometheus stateful实例,以及配置该prometheus实例与ServiceMonitor(通过serviceMonitorNamespaceSelector标签)、Altermanager(通过alertmanagers标签)、PromtheusRule(通过ruleSelector标签)之间的关联。 一个Prometheus crd 资源创建后,promtheus-operator会自动创建一个prometheus stateful实例。 |
Prometheus Server | Operator 根据自定义资源 Prometheus 类型中定义的内容而部署的 Prometheus Server 集群,这些自定义资源可以看作是用来管理 Prometheus Server 集群的 StatefulSets 资源。 |
ServiceMonitor | 纯配置,Operator告诉prometheus server , 要监控的 targets是基于k8s service动态发现。 Operator基于servicemonitor的配置生成promtheus的标准配置文件promtheus.yml。注意的是,ServiceMonitor中的endpoint被转换为prometheus.yml中的kubernetes_sd_configs标签,即服务发现仍然是通过prometheus的原生能力完成的,ServiceMonitor或prometheus-operator并不具备服务发现能力,仅仅是配置转换与应用能力。 |
Service | 简单的说就是 Prometheus 监控的对象。提供给ServiceMonitor选取,让Prometheus Server来获取信息。 |
Alertmanager | 用于部署和管理promtheus的Altermanager实例.一个Altermanager资源定义会对应于一个stateful实例,prometheus-opertaor会根据Alertmanager中指定replicas、image、RBAC等信息将promtheus的altermanager pod部署,prometheus实例会自动与该Alertmanager相关联,共同完成监控->告警的链路。 |
PrometheusRule | 用于生成promtheus的告警规则文件.纯配置项。promtheus-operator会将该资源转换为prometheus的rule文件,挂在于prometheus实例的文件系统中。 |
kube-prometheus 是一整套监控解决方案,它使用 Prometheus 采集集群指标,Grafana 做展示,包含如下组件:
注意:kube-promethues与kubernetes的版本对应关系如下:
方法一:
xxxxxxxxxx
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
git branch -r # 查看当前分支有哪些
git checkout release-0.9 # 切换到自己 Kubernetes 兼容的版本
xxxxxxxxxx
git clone -b release-0.9 https://github.com/prometheus-operator/kube-prometheus.git
注:在
release-0.11
版本之后新增了NetworkPolicy
;默认是允许自己访问,如果了解
NetworkPolicy
可以修改一下默认的规则,可以用查看ls *networkPolicy*
,如果不修改,则会影响到修改
NodePort
类型也无法访问;如果不会Networkpolicy可以直接删除就行;
国外镜像源某些镜像无法拉取,我们这里修改prometheus-operator,prometheus,alertmanager,kube-state-metrics,node-exporter,prometheus-adapter的镜像源为国内镜像源。这里使用的是中科大的镜像源。
xxxxxxxxxx
# 进入修改的目录
cd ./kube-prometheus/manifests/
# 镜像替换
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' setup/prometheus-operator-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-prometheus.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' alertmanager-alertmanager.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' kube-state-metrics-deployment.yaml
sed -i 's/k8s.gcr.io/lank8s.cn/g' kube-state-metrics-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' node-exporter-daemonset.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-adapter-deployment.yaml
sed -i 's/k8s.gcr.io/lank8s.cn/g' prometheus-adapter-deployment.yaml
# 确认一下是否还有国外镜像
grep "image: " * -r
创建namespace & CRD资源,如下:
setup
文件夹中包含所有自定义资源配置 CustomResourceDefinition
(一般不用修改,也不要轻易修改)
xxxxxxxxxx
# 下载prometheus-operator镜像需要花费几分钟,这里等待几分钟,直到prometheus-operator变成running状态
kubectl create -f manifests/setup
创建所有应用资源:
xkubectl create -f manifests/
# 等待所有镜像变成Running状态
watch kubectl get po -n monitoring
需要关注的几个控制器文件:
xxxxxxxxxx
prometheus-adapter-deployment.yaml:kubernetes自定义监控指标
blackbox-exporter-deployment.yaml:黑盒监控控制器
kube-state-metrics-deployment.yaml:监听API Server生成有关资源对象的状态指标
setup/prometheus-operator-deployment.yaml:prometheus-operator控制器文件
prometheus-prometheus.yaml:prometheus主控制器文件
alertmanager-alertmanager.yaml:alertmanager主控制器文件
grafana-deployment.yaml:grafana主控制器文件
删除所有资源:
xxxxxxxxxx
# kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
xxxxxxxxxx
cat > prometheus-all-ingress.yaml << 'EOF'
apiVersion networking.k8s.io/v1
kind Ingress
metadata
namespace monitoring
name prometheus-ingress
spec
ingressClassName nginx
rules
host grafana-opera.kubernets.cn # 访问 Grafana 域名
http
paths
pathType Prefix
backend
service
name grafana
port
number3000
path /
host prometheus-opera.kubernets.cn # 访问 Prometheus 域名
http
paths
pathType Prefix
backend
service
name prometheus-k8s
port
number9090
path /
host alertmanager-opera.kubernets.cn # 访问 alertmanager 域名
http
paths
pathType Prefix
backend
service
name alertmanager-main
port
number9093
path /
EOF
两个Prometheus实例的, Service 添加 sessionAffinity: ClientIP 属性,会根据 ClientIP 来做 session 亲和性,所以我们不用担心请求会到不同的副本上去。
xxxxxxxxxx
$ curl prometheus-opera.kubernets.cn
xxxxxxxxxx
$ curl grafana-opera.kubernets.cn
xxxxxxxxxx
$ curl alertmanager-opera.kubernets.cn