prometheus-operator 创建了 4 个 CRD:
-
Prometheus
由 Operator 依据一个自定义资源 kind: Prometheus 类型中,所描述的内容而部署的 Prometheus Server 集群,可以将这个自定义资源看作是一种特别用来管理 Prometheus Server 的 StatefulSets 资源。 -
ServiceMonitor
一个 Kubernetes 自定义资源(和 kind: Prometheus 一样是 CRD),该资源描述了 Prometheus Server 的 Target 列表,Operator 会监听这个资源的变化来动态的更新 Prometheus Server 的 Scrape targets 并让 prometheus server 去 reload 配置(prometheus 有对应 reload 的 http 接口 /-/reload )。而该资源主要通过 Selector 来依据 Labels 选取对应的 Service 的 endpoints,并让 Prometheus Server 通过 Service 进行拉取(拉)指标资料(也就是 metrics 信息),metrics 信息要在 http 的 url 输出符合 metrics 格式的信息,ServiceMonitor 也可以定义目标的 metrics 的 url. -
Alertmanager
Prometheus Operator 不只是提供 Prometheus Server 管理与部署,也包含了 AlertManager,并且一样通过一个 kind: Alertmanager 自定义资源来描述信息,再由 Operator 依据描述内容部署 Alertmanager 集群。 -
PrometheusRule
对于 Prometheus 而言,在原生的管理方式上,我们需要手动创建 Prometheus 的告警文件,并且通过在 Prometheus 配置中声明式的加载。而在 Prometheus Operator 模式中,告警规则也编程一个通过 Kubernetes API 声明式创建的一个资源.告警规则创建成功后,通过在 Prometheus 中使用想 servicemonitor 那样用 ruleSelector 通过 label 匹配选择需要关联的 PrometheusRule 即可
部署
git clone https://github.com/coreos/kube-prometheus.git
修改 kube-prometheus/manifests/grafana-service.yaml 和 prometheus-service.yaml,在 spec 下添加 type: NodePort 用于暴露服务
kubectl apply -f kube-prometheus/manifests
首次执行会报错,过一会再执行一遍 kubectl apply,应该是一些依赖的资源还没创建完,后面依赖它的资源先创建了,所以过一会儿再执行一遍就可以了
[root@k8s03 kube-prometheus]# kubectl get crd |grep coreos
alertmanagers.monitoring.coreos.com 2019-07-31T05:50:57Z
podmonitors.monitoring.coreos.com 2019-07-31T05:50:57Z
prometheuses.monitoring.coreos.com 2019-07-31T05:50:58Z
prometheusrules.monitoring.coreos.com 2019-07-31T05:50:59Z
servicemonitors.monitoring.coreos.com 2019-07-31T05:51:00Z
[root@k8s03 kube-prometheus]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 10m
alertmanager-main-1 2/2 Running 0 7m38s
alertmanager-main-2 2/2 Running 0 4m1s
grafana-7dc5f8f9f6-ghtk5 1/1 Running 0 19m
kube-state-metrics-58b66579dc-cm7g8 3/4 ImagePullBackOff 0 19m
node-exporter-kb2j9 2/2 Running 0 19m
node-exporter-lqs5d 2/2 Running 0 19m
node-exporter-tf6f6 2/2 Running 0 19m
prometheus-adapter-668748ddbd-z9lbv 1/1 Running 0 19m
prometheus-k8s-0 3/3 Running 1 10m
prometheus-k8s-1 3/3 Running 1 10m
prometheus-operator-7447bf4dcb-7d4t4 1/1 Running 0 19m
[root@k8s03 manifests]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main ClusterIP 10.100.176.121 <none> 9093/TCP 32m
alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 23m
grafana NodePort 10.100.48.63 <none> 3000:31493/TCP 32m
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 32m
node-exporter ClusterIP None <none> 9100/TCP 32m
prometheus-adapter ClusterIP 10.102.205.39 <none> 443/TCP 32m
prometheus-k8s NodePort 10.102.176.248 <none> 9090:31782/TCP 32m
prometheus-operated ClusterIP None <none> 9090/TCP 23m
prometheus-operator ClusterIP None <none> 8080/TCP 32m
打开 prometheus 的 targets 页面,可以看到有 2 个组件监控不到
monitoring/kube-controller-manager/0 (0/0 up)
monitoring/kube-scheduler/0 (0/0 up)
查看 prometheus-serviceMonitorKubeScheduler.yaml 和 prometheus-serviceMonitorKubeControllerManager.yaml 可以看到 servicemonitor 通过 k8s-app=kube-scheduler 和 k8s-app: kube-controller-manager 进行匹配的,
使用命令 kubectl get svc -n kube-system 可以看到并没有这两个 service,所以需要手动创建这两个 service,注意 labels 和 selector 部分的配置必须和 ServiceMonitor 对象中的保持一致。
10251 是 kube-scheduler 组件 metrics 数据所在的端口,10252 是 kube-controller-manager 组件的监控数据所在端口。
cat prometheus-kubeSchedulerService.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-scheduler
labels:
k8s-app: kube-scheduler
spec:
selector:
component: kube-scheduler
ports:
- name: http-metrics
port: 10251
targetPort: 10251
protocol: TCP
cat prometheus-kubeControllerManagerService.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-controller-manager
labels:
k8s-app: kube-controller-manager
spec:
selector:
component: kube-controller-manager
ports:
- name: http-metrics
port: 10252
targetPort: 10252
protocol: TCP
kubectl apply -f prometheus-kubeSchedulerService.yaml
kubectl apply -f prometheus-kubeControllerManagerService.yaml
查看 prometheus-operator 状态
kubectl get pod -n monitoring -o wide | grep prometheus-operator
kubectl get service -n monitoring | grep prometheus-operator
kubectl get ServiceMonitor -n monitoring | grep prometheus-operator
kubectl api-versions| grep monitoring
kubectl get --raw "/apis/monitoring.coreos.com/v1"|jq .
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于