今天主要分享下,在 k8s 集群下,微服务的各种状态指标情况的监控,我们都知道 Prometheus 是做数据监控的,但说白点,其独特格式的数据,其实都是靠一些源来的,那么这些源有哪些呢?已经有了 cadvisor、heapster、metric-server,几乎容器运行的所有指标都能拿到,但是下面这种情况却无能为力:
调度了N个replicas?现在可用的有N个?
N个Pod是 running/stopped/terminated 状态?
Pod重启了N次?
我有N个服务在运行中
而这些则是 kube-state-metrics 提供的内容,它基于 client-go 开发,轮询 Kubernetes API,并将 Kubernetes 的结构化信息转换为 metrics。kube-state-metrics 是 kubernetes 开源的一个插件。
废话不多说,直接上教程。。。
部署教程
下载
在官网 https://github.com/kubernetes/kube-state-metrics 下载相应的源码以及部署脚本,本次使用 release1.9.7,即 v1.9.7 版本的 kube-state-metrics
执行 cd /kube-state-metrics/examples/standard,可以看到几个文件:
cluster-role-binding.yaml
cluster-role.yaml
deployment.yaml
prometheus-configmap.yaml
service-account.yaml
service.yaml
如果 Prometheus 已经部署,且部署在 kube-system 空间下,则源码中的 namespace 不需更改,否则可自定义为 monitoring。
更新
首先修改 service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/name: kube-state-metrics
app.kubernetes.io/version: v1.9.7
name: kube-state-metrics
namespace: kube-system
spec:
clusterIP: None
ports:
- name: http-metrics
port: 8080
targetPort: http-metrics
- name: telemetry
port: 8081
targetPort: telemetry
selector:
app.kubernetes.io/name: kube-state-metrics
很简单,增加了注解方便后面使用
坑:源码中的角色授权绑定的是其写的 kind 为 ClusterRole 的资源,但后来发现部署 kube-state-metrics 服务时,其无法成功访问 k8s 的 api-server,故需要修改,弃用其 ClusterRole,使用 k8s 系统最高权限 cluster-admin。
更改访问权限
vi cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/name: kube-state-metrics
app.kubernetes.io/version: v1.9.7
name: kube-state-metrics
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin #kube-state-metrics
subjects:
- kind: ServiceAccount
name: kube-state-metrics
namespace: kube-system
部署
cd /kube-state-metrics/examples/standard
kubectl create -f .
此时还需要更新 Prometheus 的挂载的 configMap,因为前面说了只抓取带有 prometheus.io/scrape: "true"注解的 endpoint
vi prometheus-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-system
data:
prometheus.yaml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'kubernetes-apiservers