监控 Kubernetes 集群应用

Prometheus的数据指标是经过一个公开的 HTTP(S) 数据接口获取到的,咱们不须要单独安装监控的 agent,只须要暴露一个 metrics 接口,Prometheus 就会按期去拉取数据;对于一些普通的 HTTP 服务,咱们彻底能够直接重用这个服务,添加一个/metrics接口暴露给 Prometheus;并且获取到的指标数据格式是很是易懂的。node

如今不少服务从一开始就内置了一个/metrics接口,好比 Kubernetes 的各个组件、istio 服务网格都直接提供了数据指标接口。有一些服务即便没有原生集成该接口,也彻底可使用一些 exporter 来获取到指标数据,好比 mysqld_exporter、node_exporter,这些 exporter 就有点相似于传统监控服务中的 agent,做为一直服务存在,用来收集目标服务的指标数据而后直接暴露给 Prometheus。mysql

普通应用监控

 ingress 的使用,咱们采用的是Traefik做为咱们的 ingress-controller,是咱们 Kubernetes 集群内部服务和外部用户之间的桥梁。Traefik 自己内置了一个/metrics的接口,可是须要咱们在参数中配置开启:git

[metrics] [metrics.prometheus] entryPoint = "traefik" buckets = [0.1, 0.3, 1.2, 5.0] 

以前的版本中是经过--web--web.metrics.prometheus两个参数进行开启的,要注意查看对应版本的文档。github

咱们须要在traefik.toml的配置文件中添加上上面的配置信息,而后更新 ConfigMap 和 Pod 资源对象便可,Traefik Pod 运行后,咱们能够看到咱们的服务 IP:web

$ kubectl get svc -n kube-system
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S) AGE ...... traefik-ingress-service NodePort 10.101.33.56 <none> 80:31692/TCP,8080:32115/TCP 63d 

而后咱们可使用curl检查是否开启了 Prometheus 指标数据接口,或者经过 NodePort 访问也能够:redis

$ curl 10.101.33.56:8080/metrics # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0.000121036 go_gc_duration_seconds{quantile="0.25"} 0.000210328 go_gc_duration_seconds{quantile="0.5"} 0.000279974 go_gc_duration_seconds{quantile="0.75"} 0.000420738 go_gc_duration_seconds{quantile="1"} 0.001191494 go_gc_duration_seconds_sum 0.004353914 go_gc_duration_seconds_count 12 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 63 ...... 

从这里能够看到 Traefik 的监控数据接口已经开启成功了,而后咱们就能够将这个/metrics接口配置到prometheus.yml中去了,直接加到默认的prometheus这个 job 下面:(prome-cm.yaml)sql

apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: kube-ops data: prometheus.yml: | global: scrape_interval: 30s scrape_timeout: 30s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'traefik' static_configs: - targets: ['traefik-ingress-service.kube-system.svc.cluster.local:8080'] 

固然,咱们这里只是一个很简单的配置,scrape_configs 下面能够支持不少参数,例如:shell

  • basic_auth 和 bearer_token:好比咱们提供的/metrics接口须要 basic 认证的时候,经过传统的用户名/密码或者在请求的header中添加对应的 token 均可以支持
  • kubernetes_sd_configs 或 consul_sd_configs:能够用来自动发现一些应用的监控数据

因为咱们这里 Traefik 对应的 servicename 是traefik-ingress-service,而且在 kube-system 这个 namespace 下面,因此咱们这里的targets的路径配置则须要使用FQDN的形式:traefik-ingress-service.kube-system.svc.cluster.local,固然若是你的 Traefik 和 Prometheus 都部署在同一个命名空间的话,则直接填 servicename:serviceport便可。而后咱们从新更新这个 ConfigMap 资源对象:api

$ kubectl delete -f prome-cm.yaml
configmap "prometheus-config" deleted $ kubectl create -f prome-cm.yaml configmap "prometheus-config" created 

如今 Prometheus 的配置文件内容已经更改了,隔一下子被挂载到 Pod 中的 prometheus.yml 文件也会更新,因为咱们以前的 Prometheus 启动参数中添加了--web.enable-lifecycle参数,因此如今咱们只须要执行一个 reload 命令便可让配置生效:app

$ kubectl get svc -n kube-ops
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S) AGE prometheus NodePort 10.102.74.90 <none> 9090:30358/TCP 3d $ curl -X POST "http://10.102.74.90:9090/-/reload" 

因为 ConfigMap 经过 Volume 的形式挂载到 Pod 中去的热更新须要必定的间隔时间才会生效,因此须要稍微等一小会儿。

reload 这个 url 是一个 POST 请求,因此这里咱们经过 service 的 CLUSTER-IP:PORT 就能够访问到这个重载的接口,这个时候咱们再去看 Prometheus 的 Dashboard 中查看采集的目标数据: prometheus dashboard targets

能够看到咱们刚刚添加的traefik这个任务已经出现了,而后一样的咱们能够切换到 Graph 下面去,咱们能够找到一些 Traefik 的指标数据,至于这些指标数据表明什么意义,通常状况下,咱们能够去查看对应的/metrics接口,里面通常状况下都会有对应的注释。

到这里咱们就在 Prometheus 上配置了第一个 Kubernetes 应用。

使用 exporter 监控应用

上面咱们也说过有一些应用可能没有自带/metrics接口供 Prometheus 使用,在这种状况下,咱们就须要利用 exporter 服务来为 Prometheus 提供指标数据了。Prometheus 官方为许多应用就提供了对应的 exporter 应用,也有许多第三方的实现,咱们能够前往官方网站进行查看:exporters

好比咱们这里经过一个redis-exporter的服务来监控 redis 服务,对于这类应用,咱们通常会以 sidecar 的形式和主应用部署在同一个 Pod 中,好比咱们这里来部署一个 redis 应用,并用 redis-exporter 的方式来采集监控数据供 Prometheus 使用,以下资源清单文件:(prome-redis.yaml)

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis namespace: kube-ops spec: template: metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "9121" labels: app: redis spec: containers: - name: redis image: redis:4 resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379 - name: redis-exporter image: oliver006/redis_exporter:latest resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 9121 --- kind: Service apiVersion: v1 metadata: name: redis namespace: kube-ops spec: selector: app: redis ports: - name: redis port: 6379 targetPort: 6379 - name: prom port: 9121 targetPort: 9121 

能够看到上面咱们在 redis 这个 Pod 中包含了两个容器,一个就是 redis 自己的主应用,另一个容器就是 redis_exporter。如今直接建立上面的应用:

$ kubectl create -f prome-redis.yaml
deployment.extensions "redis" created service "redis" created 

建立完成后,咱们能够看到 redis 的 Pod 里面包含有两个容器:

$ kubectl get pods -n kube-ops
NAME                          READY     STATUS    RESTARTS   AGE
prometheus-8566cd9699-gt9wh   1/1       Running   0          3d
redis-544b6c8c54-8xd2g        2/2       Running   0          3m
$ kubectl get svc -n kube-ops
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S) AGE prometheus NodePort 10.102.74.90 <none> 9090:30358/TCP 3d redis ClusterIP 10.104.131.44 <none> 6379/TCP,9121/TCP 5m 

咱们能够经过 9121 端口来校验是否可以采集到数据:

$ curl 10.104.131.44:9121/metrics # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0 go_gc_duration_seconds{quantile="0.25"} 0 go_gc_duration_seconds{quantile="0.5"} 0 go_gc_duration_seconds{quantile="0.75"} 0 go_gc_duration_seconds{quantile="1"} 0 go_gc_duration_seconds_sum 0 go_gc_duration_seconds_count 0 ...... # HELP redis_used_cpu_user_children used_cpu_user_childrenmetric # TYPE redis_used_cpu_user_children gauge redis_used_cpu_user_children{addr="redis://localhost:6379",alias=""} 0 

一样的,如今咱们只须要更新 Prometheus 的配置文件:

- job_name: 'redis' static_configs: - targets: ['redis:9121'] 

因为咱们这里的 redis 服务和 Prometheus 处于同一个 namespace,因此咱们直接使用 servicename 便可。

配置文件更新后,从新加载:

$ kubectl delete -f prome-cm.yaml
configmap "prometheus-config" deleted $ kubectl create -f prome-cm.yaml configmap "prometheus-config" created # 隔一下子执行reload操做 $ curl -X POST "http://10.102.74.90:9090/-/reload" 

这个时候咱们再去看 Prometheus 的 Dashboard 中查看采集的目标数据: prometheus targets redis

能够看到配置的 redis 这个 job 已经生效了。切换到 Graph 下面能够看到不少关于 redis 的指标数据: redis metrics

咱们选择任意一个指标,好比redis_exporter_scrapes_total,而后点击执行就能够看到对应的数据图表了: redis scrapes total

相关文章
相关标签/搜索