滴滴夜莺Kubernetes monitor
cadvisor_plugin | kubelet_agent | server_side
三选一模式名称 | 部署运行方式 | collect_mode配置 | 说明 |
---|---|---|---|
夜莺插件形式采集cadvisor raw api | 可执行的插件由夜莺agent调用 | cadvisor_plugin | 文档在readme最下面 (原有cadvisor采集模式) |
容器基础资源指标采集 | k8s daemonset 部署在每一个node上 | kubelet_agent | 统称为新模式 (kubelet地址由对应metrics port listen地址决定) |
集中采集k8s服务组件 | k8s deployment 部署 | server_side | 统称为新模式 |
cadvisor
数据需要hold点做计算比率类指标,多用在百分比的情况,其余不需要counter
类型将有夜莺agent转换为gauge
型,即数值已经转为rate
了 ,所有counter
类型metric_name 加_rate
后缀
metrics-detail
文件夹里k8s-config
中kube-proxy
kubelet-node
指标时支持并发数配置和静态分片func_name
标签作为区分具体组件任务,类似prometheus
的job
标签node_ip
,node_name
作为宿主机标识标签server_side_nid
,例如kube_node_status_allocatable_cpu_cores
这种共享指标metrics-detail/preaggregation.md
metrics-detail/process-resource.md
指标类型 | 采集源 | 应用举例 | 部署方式 |
---|---|---|---|
容器基础资源指标 | kubelet 内置cadvisor | 查看容器cpu、mem等 | k8s daemonset |
k8s资源指标 | kube-stats-metrics (简称ksm) | 查看pod状态、查看deployment信息等 | k8s deployment (需要提前部署ksm) |
k8s服务组件指标 | 各个服务组件的metrics接口(多实例自动发现) apiserver kube-controller-manager kube-scheduler etcd coredns kube-proxy kubelet-node |
查看请求延迟/QPS等 | 和ksm同一套代码,部署在 k8s deployment |
业务指标(暂不支持) | pod暴露的metrics接口 | - | - |
user_specified
配置是否采用用户指定的地址,用来处理有些服务组件以裸进程形式部署无法从内部发现的caseuser_specified:true
时,对应的addrs
为采集地址url列表user_specified:false
时,则认为由内置的代码来进行动态发现,需要配置好对应的port
schema
metrics_path
等信息采集类型 | 采集地址说明 | 配置/发现说明 |
---|---|---|
容器基础资源指标 kubelet-cadvisor | kubelet 在node上listen分两种情况: listen 0.0.0.0 listen机器内网ip |
默认为k8s-mon 自动根据配置的port 找到对应的地址 |
k8s资源指标 kube-stats-metrics | 默认为通过coredns 访问service http://kube-state-metrics.kube-system:8080/metrics |
同时支持指定 |
k8s服务组件指标(master侧) apiserver kube-controller-manager kube-scheduler etcd coredns |
需要注意这些组件的部署方式 : 部署在pod 中 以裸进程部署 |
k8s-mon 默认认这些组件部署在pod中,通过getpod获取地址列表 |
k8s服务组件指标(每node部署) kube-proxy kubelet-node |
需要注意这些组件的部署方式 : 部署在pod 中 以裸进程部署 |
k8s-mon 默认认这些组件在每个node都可以以ip:port/metrics 访问到,通过getnode获取internal ip ,对应的服务需要listen 内网ip或0.0.0.0 |
业务指标(暂不支持) | pod暴露的metrics接口 | - |
准备k8s环境 ,确保每个node节点部署夜莺agent
n9e-agent
# 创建namespace kube-admin
kubectl create ns kube-admin
# 创建访问etcd所需secret,在master上执行(不采集etcd则不需要)
# 注意如果 不采集etcd,没有创建对应的证书(如k8s使用公有云托管的),默认 deployment中挂载证书那几行是注释掉的,开启etcd采集再打开
# etcd证书信息依据自己环境替换即可
kubectl create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crt -n kube-admin
直接使用公共源的镜像
# 公共源使用阿里云的
# registry.cn-beijing.aliyuncs.com/n9e/k8s-mon:v1
或者自己下载代码,打镜像
mkdir -pv $GOPATH/github.com/n9e
cd $GOPATH/github.com/n9e
git clone https://github.com/n9e/k8s-mon
# 使用docker 命令,或者ci工具,将镜像同步到仓库中
# 如需修改镜像名字,需要同步修改daemonset 和deployment yaml文件中的image字段
# 镜像需要同步到所有node,最好上传到仓库中
cd k8s-mon && docker build -t k8s-mon:v1 .
修改对接夜莺nid标签的名字
n9e_nid_label_name
N9E_NID
,与之前k8s-mon采集cadvisor指标要求容器环境变量名一致k8s-config/configMap_deployment.yaml
和 k8s-config/configMap_daemonset.yaml
中的 n9e_nid_label_name
字段pod yaml文件中传入上述 nid标签,例如:
N9E_NID
N9E_NID
label,假设test-server01这个模块对应的服务树节点nid为5region: A
cluster: B
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-server01-deployment
labels:
app: test-server01
# 这里表示此deployment的nid为5
N9E_NID: "5"
spec:
replicas: 1
selector:
matchLabels:
app: test-server01
template:
metadata:
labels:
app: test-server01
region: A
cluster: B
# 这里表示此deployment启动的容器nid为5
N9E_NID: "5"
服务组件监控需要指定server_side_nid
k8s-config/configMap_deployment.yaml
将 server_side_nid: 字段改为指定的服务组件监控叶子节点的nidk8s服务组件指标(master侧) 如果不是部署在pod中,需要指定采集地址
k8s-mon
默认认这些组件部署在pod中,通过getpod获取地址列表apiserver:
user_specified: true
addrs:
- "https://1.1.1.1:6443/metrics"
- "https://2.2.2.2:6443/metrics"
如果不想采集某类指标可以去掉其配置
apiserver
的指标k8s-config/configMap_deployment.yaml
中 apiserver
段即可kube-proxy
和kubelet
(node量大的时候)不需要可以去掉每node的
kube-proxy
和kubelet
静态分片采集
hash_mod_num
代表总分片数量 hash_mod_shard
代表本实例取模后的index(取值范围是0 ~ hash_mod_num-1)# 实例1
kube_proxy:
hash_mod_num: 3
hash_mod_shard: 0
# 实例2
kube_proxy:
hash_mod_num: 3
hash_mod_shard: 1
# 实例3
kube_proxy:
hash_mod_num: 3
hash_mod_shard: 2
想给某个采集项指定采集地址
https://1.1.1.1:1234/metrics
和 https://2.2.2.2:1234/metrics
k8s-config/configMap_deployment.yaml
中 user_specified
和addrs
即可kube_scheduler:
user_specified: true
addrs:
- "https://1.1.1.1:1234/metrics"
- "https://2.2.2.2:1234/metrics"
如需给采集的指标添加自定义tag
k8s-config/configMap_deployment.yaml
k8s-config/configMap_daemonset.yaml
中的append_tags
字段即可append_tags:
key1: value1
key2: value2
如需修改采集间隔
k8s-config/configMap_deployment.yaml
k8s-config/configMap_daemonset.yaml
中的 collect_step
字段如需修改某个项目的采集并发
k8s-config/configMap_deployment.yaml
中的指定项目的 concurrency_limit
字段,默认10如需服务组件采集多实例时的特征标签
k8s-config/configMap_deployment.yaml
中的 multi_server_instance_unique_label
字段调整日志级别
k8s-config/deployment.yaml
中的 spec.containers.command 加上--log.level=debug
即可看到debug日志,日志样例如下level=debug ts=2021-02-24T15:47:31.810+08:00 caller=kube_controller_manager.go:180 msg=DoCollectSuccessfullyReadyToPush funcName=kube-controller-manager metrics_num=621 time_took_seconds=0.307592776
level=debug ts=2021-02-24T15:47:31.863+08:00 caller=push.go:25 msg=PushWorkSuccess funcName=kube-controller-manager url=http://localhost:2080/api/collector/push metricsNum=621 time_took_seconds=0.053355322
level=debug ts=2021-02-24T15:50:01.523+08:00 caller=get_pod.go:99 msg=server_pod_ips_result num_kubeSchedulerIps=1 num_kubeControllerIps=1 num_apiServerIps=1 num_coreDnsIps=2 num_kubeProxyIps=2 num_etcdIps=1 time_took_seconds=0.020384107
启动ksm服务(部署在kube-system namespace中 ,需要采集才启动)
kubectl apply -f k8s-config/kube-stats-metrics
启动k8s-mon daemonset 和deployment (部署在kube-admin namespace中,按需启动daemonset 和deployment)
kubectl apply -f k8s-config
查看日志
kubectl logs -l app=k8s-mon-deployment -n kube-admin -f
kubectl logs -l app=k8s-mon-daemonset -n kube-admin -f
即时看图查看指标
# 浏览器访问及时看图path: http://<n9e_addr>/mon/dashboard?nid=<nid>
导入大盘图
# 大盘图在 metrics-detail/夜莺大盘-xxxjson中
# 将三个大盘json文件放到夜莺服务端机器 <n9e_home>/etc/screen 下
# 或者 克隆夜莺3.5+代码,内置大盘图json在 etc/screen 下
# 刷新页面,在对应的节点选择导入内置大盘即可
--housekeeping-interval duration Default: `10s`
模式采集是10秒,所以在默认配置
下无论prometheus还是k8s-mon采集间隔不应低于10squantile
50 90 95 99coredns_dns_request_duration_seconds_bucket --> coredns_dns_request_duration_seconds_quantile
代表coredns 解析平均延迟分位值coredns_dns_request_duration_seconds_bucket -->coredns_dns_request_duration_seconds_avg
作为Nightingale的插件,用于收集docker容器的监控指标
$ mkdir -p $GOPATH/src/github.com/n9e
$ cd $GOPATH/src/github.com/n9e
$ git clone https://github.com/n9e/k8s-mon.git
$ cd k8s-mon
$ make
$ ./k8s-mon
CPU
cpu.user
cpu.sys
cpu.idle
cpu.util
cpu.periods
cpu.throttled_periods
cpu.throttled_time
内存
mem.bytes.total
mem.bytes.used
mem.bytes.used.percent
mem.bytes.cached
mem.bytes.rss
mem.bytes.swap
磁盘
disk.io.read.bytes
disk.io.write.bytes
disk.bytes.total
disk.bytes.used
disk.bytes.used.percent
网络
net.sockets.tcp.timewait
net.in.bits
net.in.pps
net.in.errs
net.in.dropped
net.out.bits
net.out.pps
net.out.errs
net.out.dropped
net.tcp.established
系统
sys.ps.process.used
sys.ps.thread.used
sys.fd.count.used
sys.socket.count.used
sys.restart.count