promethus
1. promethus配置
1. 配置
--
2. 更新
热更新:
# 配置文件添加配置
--web.enable-lifecycle
reload:
curl -XPOST http://10.10.1.162:9090/-/reload
2. alertmanagers配置
告警配置参考
https://awesome-prometheus-alerts.grep.to
3. kube-state-metrics 配置
配置了自动发现 Endpoints 的监控,但是这些监控数据都是应用内部的监控,需要应用本身提供一个 /metrics
接口,或者对应的 exporter 来暴露对应的指标数据,但是在 Kubernetes 集群上 Pod、DaemonSet、Deployment、Job、CronJob 等各种资源对象的状态也需要监控,这也反映了使用这些资源部署的应用的状态。比如:
- 我调度了多少个副本?现在可用的有几个?
- 多少个 Pod 是
running/stopped/terminated
状态? - Pod重启了多少次?
- 我有多少 job 在运行中等等
通过查看前面从集群中拉取的指标(这些指标主要来自 apiserver 和 kubelet 中集成的 cAdvisor),并没有具体的各种资源对象的状态指标。对于 Prometheus 来说,当然是需要引入新的 exporter 来暴露这些指标,Kubernetes 提供了一个kube-state-metrics 就是我们需要的。
metric-server
是从 APIServer 中获取cpu、内存使用率这种监控指标,并把他们发送给存储后端,如 influxdb 或云厂商,当前的核心作用是为 HPA 等组件提供决策指标支持。kube-state-metrics
关注于获取 Kubernetes 各种资源的最新状态,如 deployment 或者 daemonset,metric-server仅仅是获取、格式化现有数据,写入特定的存储,实质上是一个监控系统。而 kube-state-metrics 是获取集群最新的指标。- 像 Prometheus 这种监控系统,并不会去用 metric-server 中的数据,他都是自己做指标收集、集成的,但 Prometheus 可以监控 metric-server 本身组件的监控状态并适时报警,这里的监控就可以通过
kube-state-metrics
来实现,如 metric-server pod 的运行状态。
1. 安装
kube-state-metrics 已经给出了在 Kubernetes 部署的 manifest 定义文件,我们直接将代码 Clone 到集群中(能用 kubectl 工具操作就行),不过需要注意兼容的版本:
git clone https://github.com/kubernetes/kube-state-metrics.git cd kube-state-metrics/examples/standard
默认的镜像为 gcr 的,这里我们可以将 deployment.yaml
下面的镜像替换成 cnych/kube-state-metrics:v2.0.0-rc.0
,此外我们上面为 Prometheus 配置了 Endpoints 的自动发现,所以我们可以给 kube-state-metrics 的 Service 配置上对应的 annotations 来自动被发现,然后直接创建即可:
➜ cat service.yaml apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/version: 2.0.0-rc.0 annotations: prometheus.io/scrape: "true" prometheus.io/port: "8080" # 8081是kube-state-metrics应用本身指标的端口 name: kube-state-metrics namespace: kube-system ...... ➜ kubectl apply -f . clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created clusterrole.rbac.authorization.k8s.io/kube-state-metrics created deployment.apps/kube-state-metrics created serviceaccount/kube-state-metrics created service/kube-state-metrics created
部署完成后正常就可以被 Prometheus 采集到指标了:
2. 水平缩放(分片)
kube-state-metrics
已经内置实现了一些自动分片功能,可以通过 --shard
和 --total-shards
参数进行配置。现在还有一个实验性功能,如果将 kube-state-metrics
部署在 StatefulSet 中,它可以自动发现其命名位置,以便自动配置分片,这是一项实验性功能,可能以后会被移除。
要启用自动分片,必须运行一个 kube-state-metrics 的 StatefulSet,并且必须通过 --pod
和 --pod-namespace
标志将 pod 名称和名称空间传递给 kube-state-metrics
进程。可以参考 /examples/autosharding
目录下面的示例清单文件进行说明。
使用
使用 kube-state-metrics 的一些典型场景:
- 存在执行失败的Job:
kube_job_status_failed
- 集群节点状态错误:
kube_node_status_condition{condition="Ready", status!="true"}==1
- 集群中存在启动失败的 Pod:
kube_pod_status_phase{phase=~"Failed|Unknown"}==1
- 最近30分钟内有 Pod 容器重启:
changes(kube_pod_container_status_restarts_total[30m])>0
现在有一个问题是前面我们做 endpoints
类型的服务发现的时候做了一次 labelmap,将 namespace 和 pod 标签映射到了指标中,但是由于 kube-state-metrics
暴露的指标中本身就包含 namespace 和 pod 标签,这就会产生冲突,这种情况会将映射的标签变成 exported_namespace
和 exported_pod
,这变会对指标的查询产生影响,如下所示:
4. promethus高可用