k8s-mon 部署整理

时间:2021-07-21
本文章向大家介绍k8s-mon 部署整理,主要包括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_NID label,假设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 下 
# 刷新页面,在对应的节点选择导入内置大盘即可

原文地址:https://www.cnblogs.com/opsdemo/p/15038563.html