k8s-mon 部署整理
k8s-mon是滴滴夜莺监控k8s的组件,原理上和prometheus类似把,都是基于ksm和k8s内置的指标接口来抓取数据的,根据我实际部署情况和github官方文档进行了整理
| 指标类型 | 采集源 | 应用举例 | 部署方式 |
| 容器基础指标 | kubelet内置cadvisor | 查看容器cpu,mem等 | deamonset |
| k8s资源指标 | kube-stats-metrics(ksm) | 查看pod状态,查看deployment信息 | deployment(依赖ksm) |
| k8s服务组件指标 | 各服务组件的metrics接口(多实例自动发现) | 查看请求延迟/QPS等 | deployment集成至ksm |
| 业务指标(暂不支持) | pod暴露的metrics接口 | 暂时无需采集 |
一、准备工作
1、准备k8s环境,确保每个node节点都部署了夜莺agent
2、创建命名空间
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
3、直接使用阿里公共源的镜像
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
cd k8s-mon && docker build -t k8s-mon:v1 .
# 使用docker 命令,或者ci工具,将镜像同步到仓库中
# 如需修改镜像名字,需要同步修改daemonset 和deployment yaml文件中的image字段
# 镜像需要同步到所有node,最好上传到仓库中
二、修改配置
1、修改对接夜莺nid标签的名字
- 对应配置为配置文件中的
n9e_nid_label_name - 默认为:
N9E_NID,与之前k8s-mon采集cadvisor指标要求容器环境变量名一致 - 如需修改则需要改
k8s-config/configMap_deployment.yaml和k8s-config/configMap_daemonset.yaml中的n9e_nid_label_name字段
2、pod yaml文件中传入上述的nid标签,例如:N9E_NID
- 举例:deployment中定义pod的
N9E_NIDlabel,假设test-server01这个模块对应的服务树节点nid为5 - 后续该pod的容器的基础指标出现在nid=5的节点下: 如 cpu.user
- 后续该pod的k8s的基础指标出现在nid=5的节点下: 如 kube_deployment_status_replicas_available
- 其余自定义标签不采集,如:
region: Acluster: B
3、修改配置文件
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"
4、服务组件监控需要指定server_side_nid
- 修改
k8s-config/configMap_deployment.yaml将 server_side_nid: 字段改为指定的服务组件监控叶子节点的nid - 举例:server_side_nid: "6":代表6为k8s集群的服务树叶子节点,k8s控制平面的指标都会上报到这里
5、k8s服务组件指标(master),如果不是部署在pod中,需要指定采集地址
apiserver 、kube-scheduler、coredns、etcd等 k8s-mon默认认这些组件部署在pod中,通过getpod获取地址列表 如果不是部署在pod中,需要指定采集地址(将user_specified设置为true,并指定addr,其余配置保持不变即可),举例如下 apiserver: user_specified: true addrs: - "https://1.1.1.1:6443/metrics" - "https://2.2.2.2:6443/metrics"
三、可以调整的配置(维持默认值可跳过此配置)
1、如果不想采集某类指标可以去掉配置
- 举例:不想采集
apiserver的指标 - 则去掉/注释掉
k8s-config/configMap_deployment.yaml中apiserver段即可 - deployment中需要采集每node的
kube-proxy和kubelet(node量大的时候)不需要可以去掉
2、每个node的kube-proxy和kubelet静态分片采集
- 默认采集所有node的指标,在node数量大时会导致性能问题,则需要开启分片采集
- 举例有1万个node需要采集kube-proxy,则部署3个k8s-mon,配置值开启kube-proxy段
- 其中
hash_mod_num代表总分片数量hash_mod_shard代表本实例取模后的index(取值范围是0 ~ hash_mod_num-1) - 那么这三个实例则会将1万个node分片采集
# 实例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
3、想给某个采集项指定采集地址
举例:想设置kube-scheduler的采集地址为 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"
4、如需给采集的指标添加自定义tag
则修改 k8s-config/configMap_deployment.yaml k8s-config/configMap_daemonset.yaml中的append_tags字段即可
append_tags:
key1: value1
key2: value2
5、如需修改采集周期
- 修改
k8s-config/configMap_deployment.yamlk8s-config/configMap_daemonset.yaml中的collect_step字段
7、如需修改某个项目的采集并发
- 修改
k8s-config/configMap_deployment.yaml中的指定项目的concurrency_limit字段,默认10
8、如需服务组件采集多实例时的特征标签
- 修改
k8s-config/configMap_deployment.yaml中的multi_server_instance_unique_label字段
9、调整日志级别
修改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 获取pod耗时 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
四、启动服务
1、启动ksm服务(部署在kube-system命名空间中,需要采集才启动)
kubectl apply -f k8s-config/kube-stats-metrics
2、启动k8s-mon的deployment和daemonset(部署在kube-admin命名空间中,按需启动)
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 下 # 刷新页面,在对应的节点选择导入内置大盘即可
浙公网安备 33010602011771号