• 第15章: Prometheus监控Kubernetes资源与应用


     

     

     

     

     

     

    Prometheus监控Kubernetes资源与应用

     

     

     

     

     

     

    目录

    1 监控方案 2

    2 监控指标 4

    3 实现思路 4

    4 在K8S中部署Prometheus 4

    5 在K8S中部署Grafana与可视化 4

    6 监控K8S集群Node与Pod 4

    7 监控K8S资源对象 5

    8 在K8S中部署Alertmanager 6

    9 Prometheus告警 6

    10 实验 7

     

     

     

     

     

     

     

     

     

     

     

    1 监控方案

    老的监控系统无法感知这些动态创建的服务,已经不适合容器化的场景

     

    cAdvisor+Heapster+InfluxDB+Grafana

    Y

    简单

    容器监控

    cAdvisor/exporter+Prometheus+Grafana

    Y

    扩展性

    容器,应用,主机全方面监控

     

    对于非容器化业务来说Zabbix,open-falcon已经在企业深入使用。

    Prometheus新型的监控系统的兴起来源容器领域,所以重点是放在怎么监控容器。

    随着容器化大势所趋,如果传统技术不随着改变,将会被淘汰,基础架构也会发生新的技术栈组合。

     

    cAdvisor+InfluxDB+Grafana

    wps1 

     

    cAdvisor:是谷歌开源的一个容器监控工具,采集主机上容器相关的性能指标数据。比如CPU、内存、网络、文件系统等。

    Heapster是谷歌开源的集群监控数据收集工具,收集所有节点监控数据Heapster作为一个pod在集群中运行,通过API获得集群中的所有节点,然后从节点kubelet暴露10255汇总数据。目前社区用Metrics Server 取代 Heapster。

    InfluxDB:时序数据库,存储监控数据。

    Grafana:可视化展示。Grafana提供一个易于配置的仪表盘UI,可以轻松定制和扩展。

    不足

    l 功能单一,无法做到对K8S资源对象监控

    l 告警单一利用Grafana基本告警

    l 依赖InfluxdbInfluxdb单点(高可用商业才支持,缺少开源精神

    l heapster1.8+弃用,metrics-server取代

    cAdvisor/exporter+Prometheus+Grafana

    Prometheus+Grafana是监控告警解决方案里的后起之秀

    通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。

     

    wps2 

    # Kubernetes的API SERVER会暴露API服务,Promethues集成了对Kubernetes的自动发现,它有# 5种模式:Node、Service、Pod、Endpoints、ingress。

    wps3 

    n 通过cadvisor采集容器、Pod相关的性能指标数据,并通过暴露的/metrics接口用prometheus抓取

    n 通过prometheus-node-exporter采集主机的性能指标数据,并通过暴露的/metrics接口用prometheus抓取

    n 应用侧自己采集容器中进程主动暴露的指标数据(暴露指标的功能由应用自己实现,并添加平台侧约定的annotation,平台侧负责根据annotation实现通过Prometheus的抓取)

    n 通过kube-state-metrics采集k8s资源对象的状态指标数据,并通过暴露的/metrics接口用prometheus抓取

    n 通过etcd、kubelet、kube-apiserver、kube-controller-manager、kube-scheduler自身暴露的/metrics获取节点上与k8s集群相关的一些特征指标数据。

     

    2 监控指标

    Kubernetes本身监控

     Node资源利用率

     Node数量

     Pods数量(Node)

     资源对象状态

    Pod监控

     Pod数量(项目)

     容器资源利用率

     应用程序

    3 实现思路

    监控指标

    具体实现

    举例

    Pod性能(k8s集群资源监控)

    cAdvisor

    容器CPU,内存利用率 prometheus->apiserver(masterip:6443)->kubelet(cadvisor)

    Node性能(k8s工作节点监控)

    node-exporter

    节点CPU,内存利用率

    K8S资源对象(k8s资源对象状态监控)

    kube-state-metrics

    Pod/Deployment/Service

    4 K8S中部署Prometheus

    https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/prometheus

    源码目录kubernetes/cluster/addons/prometheus

    5 K8S中部署Grafana与可视化

    grafana 是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源,比 Prometheus 自带的图表展示功能强大太多,更加灵活,有丰富的插件,功能更加强大。

     

    https://grafana.com/grafana/download

    推荐模板:

     集群资源监控:3119

     资源状态监控 6417

     Node监控 :9276

    6 监控K8S集群NodePod

    (1) Node

    Prometheus社区提供的NodeExporter项目可以对主机的关键度量指标进行监控,通过Kubernetes的DeamonSet可以在各个主机节点上部署有且仅有一个NodeExporter实例,实现对主机性能指标数据的监控但由于容器隔离原因,使用容器NodeExporter并不能正确获取到宿主机磁盘信息,NodeExporter部署到宿主机。

     

    使用文档:https://prometheus.io/docs/guides/node-exporter/

    GitHub  https://github.com/prometheus/node_exporter

    exporter列表:https://prometheus.io/docs/instrumenting/exporters/

     

    node-exporter所采集的指标主要有:

    node_cpu_*

    node_disk_*

    node_entropy_*

    node_filefd_*

    node_filesystem_*

    node_forks_*

    node_intr_total_*

    node_ipvs_*

    node_load_*

    node_memory_*

    node_netstat_*

    node_network_*

    node_nf_conntrack_*

    node_scrape_*

    node_sockstat_*

    node_time_seconds_*

    node_timex _*

    node_xfs_*

     

    (2) pod

    目前cAdvisor集成到了kubelet组件内,可以在kubernetes集群中每个启动了kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有容器相关的性能指标数据。

    暴露API接口地址:https://NodeIP:10250/metrics/cadvisor

    7 监控K8S资源对象

    https://github.com/kubernetes/kube-state-metrics

     

    kube-state-metrics是一个简单的服务,它监听Kubernetes API服务器并生成有关对象状态的指标。它不关注单个Kubernetes组件的运行状况,而是关注内部各种对象的运行状况,例如部署,节点和容器。

     

    kube-state-metrics采集了k8s中各种资源对象的状态信息:

    kube_daemonset_*

    kube_deployment_*

    kube_job_*

    kube_namespace_*

    kube_node_*

    kube_persistentvolumeclaim_*

    kube_pod_container_*

    kube_pod_*

    kube_replicaset_*

    kube_service_*

    kube_statefulset_*

    8 K8S中部署Alertmanager

    wps4 

    设置告警和通知的主要步骤如下:

    1. 部署Alertmanager

    2. 配置Prometheus与Alertmanager通信

    3. 配置告警

    1. prometheus指定rules目录

    2. configmap存储告警规则

    3. configmap挂载到容器rules目录

    4. 增加alertmanager告警配置

    9 Prometheus告警

    (1) Prometheus告警状态

    Inactive: 这里什么都没有发生。

    Pending:  已触发阈值,但未满足告警持续时间

    Firing:   已触发阈值且满足告警持续时间。警报发送给接受者。

    wps5 

     

     

     

     

    (2) 告警收敛

    分组(group): 将类似性质的警报分类为单个通知

    抑制(Inhibition): 当警报发出后,停止重复发送由此警报引发的其他警报

    静默(Silences): 是一种简单的特定时间静音提醒的机制

     

    (3) Prometheus发告警流程

     

    wps6 

    默认大约4分钟能收到报警(prometheus收集间隔1m,prometheus评估1m,报警等待1m,报警分组1m),重复发送大约2分钟(报警分组1m,重复报警间隔1m)

    10 实验

    主机名

    ip

    用途

    备注

    k8s_nfs

    172.16.1.60

    nfs存储

    存储目录/ifs/kubernetes/

    k8s-admin

    172.16.1.70

    k8s主节点

     

    k8s-node1

    172.16.1.71

    k8s从节点1

     

    k8s-node2

    172.16.1.72

    k8s从节点2

     

    # 创建名称为ops的命名空间

    [root@k8s-admin prometheus]# kubectl create namespace ops

    namespace/ops created

     

    (1) 安装managed-nfs-storage

    这里省略安装步骤,可以参考之前的文章完成安装。

    [root@k8s-admin nfs-client]# kubectl get deploy,svc,pod,sc -o wide

    wps7 

     

    (2) 部署prometheus

    1) yaml文件说明

    [root@k8s-admin prometheus]# ls -l prometheus-*

    -rw-r--r-- 1 root root 4965 Jul 24  2020 prometheus-configmap.yaml

    # prometheus的主配置文件,采用ConfigMap方式挂载卷,通过kubernetes_sd_configs配置连接

    # api-server自动发现被监控项。配置了连接alertmanager的参数。

    [root@k8s-admin prometheus]# cat prometheus-configmap.yaml | grep job_name

        - job_name: prometheus

        - job_name: kubernetes-apiservers

        - job_name: kubernetes-nodes-kubelet

        - job_name: kubernetes-nodes-cadvisor

        - job_name: kubernetes-service-endpoints

        - job_name: kubernetes-services

        - job_name: kubernetes-pods

     

    -rw-r--r-- 1 root root 1064 Jul 24  2020 prometheus-rbac.yaml

    # prometheus的权限,ServiceAccount方式,名称prometheus

    -rw-r--r-- 1 root root 4840 Jul 24  2020 prometheus-rules.yaml

    # prometheus的告警规则,采用ConfigMap方式挂载卷

    -rw-r--r-- 1 root root  384 Jul 24  2020 prometheus-service.yaml

    # prometheusSVCNodePort方式暴露30090端口

    -rw-r--r-- 1 root root 3253 Jul 24  2020 prometheus-statefulset.yaml

    # 部署prometheus的配置文件,采用statefulset方式部署prometheus

    # 配置serviceAccountName: prometheusrbac配置用于连接api-server

    # /data目录挂载到nfs动态pvcprometheus-data

     

    2) 应用yaml文件

    [root@k8s-admin prometheus]# ls prometheus-* | xargs -i kubectl apply -f {}

    configmap/prometheus-config created

    serviceaccount/prometheus created

    clusterrole.rbac.authorization.k8s.io/prometheus created

    clusterrolebinding.rbac.authorization.k8s.io/prometheus created

    configmap/prometheus-rules created

    service/prometheus created

    statefulset.apps/prometheus created

     

    3) 查看部署信息

    [root@k8s-admin prometheus]# kubectl get statefulset,pod,svc,configmap,ServiceAccount,pvc,pv -n ops -o wide

    wps8 

     

    补充:如何获取serviceaccount

    # 获取serviceaccountsecrets中的名称

    [root@k8s-admin prometheus]# kubectl get serviceaccount prometheus -n ops -o yaml

    ……

    secrets:

    - name: prometheus-token-zljjr

    # 根据secrets的名称获取token

    [root@k8s-admin prometheus]# kubectl describe secret prometheus-token-zljjr -n ops > /root/token.k8s

    # 只保留token.k8s文件最下面的token字符串,其余的全部删除掉。

     

    4) 访问prometheus

    http://172.16.1.71:30090/targets

    wps9 

     

    wps10 

    [root@k8s-admin prometheus]# kubectl get svc -n kube-system

    wps11 

    [root@k8s-admin prometheus]# kubectl get ep/kube-dns -n kube-system

    wps12 

    [root@k8s-admin prometheus]# kubectl get svc -n kube-system -o yaml | head -10

    wps13 

     

    (3) node节点利用率监控

    node节点上部署exporter导出器

    1) 配置文件说明

    [root@k8s-admin prometheus]# ls -l node-exporter-*

    -rw-r--r-- 1 root root 1633 Jul 25  2020 node-exporter-ds.yml

    # node导出器部署文件,采用DaemonSet方式部署,临时文件存储采用hostPath方式

    -rw-r--r-- 1 root root  417 Jul 24  2020 node-exporter-service.yaml

    # node导出器svc配置文件,clusterIPNone,暴露内部端口为9100

    # 注解annotations下的prometheus.io/scrape: "true"参数表示service node-exporter可以被prometheus抓取到

     

    2) 应用yaml文件

    [root@k8s-admin prometheus]# ls node-exporter-* | xargs -i kubectl apply -f {}

    daemonset.apps/node-exporter created

    service/node-exporter created

     

    3) 查看部署信息

    [root@k8s-admin prometheus]# kubectl get daemonset,pod,svc,ep -o wide -n ops

    wps14 

     

    4) 访问prometheus

    http://172.16.1.71:30090/targets

    wps15 

    # kubernetes-service-endpoints中增加了如下内容

    wps16 

     

    (4) k8s资源信息监控

    1) 配置文件说明

    [root@k8s-admin prometheus]# ls -l kube-state-metrics-*

    -rw-r--r-- 1 root root 2362 Jul 24  2020 kube-state-metrics-deployment.yaml

    #  kube-state-metrics 部署文件,Deployment方式,

    #  连接api-serverservice的授权配置为AccountName: kube-state-metrics

    -rw-r--r-- 1 root root 2536 Jul 24  2020 kube-state-metrics-rbac.yaml

    #  授权文件,ServiceAccount方式,名称kube-state-metrics

    -rw-r--r-- 1 root root  498 Jul 24  2020 kube-state-metrics-service.yaml

    #  kube-state-metrics svc配置文件,内部暴露端口为80808081

    #  注解annotations下的prometheus.io/scrape: "true"参数表示service node-exporter可以被prometheus抓取到

     

    2) 应用yaml文件

    [root@k8s-admin prometheus]# ls kube-state-metrics-* | xargs -i kubectl apply -f {}

    deployment.apps/kube-state-metrics created

    configmap/kube-state-metrics-config created

    serviceaccount/kube-state-metrics created

    clusterrole.rbac.authorization.k8s.io/kube-state-metrics created

    role.rbac.authorization.k8s.io/kube-state-metrics-resizer created

    clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created

    rolebinding.rbac.authorization.k8s.io/kube-state-metrics created

    service/kube-state-metrics created

     

    3) 查看部署信息

    [root@k8s-admin prometheus]# kubectl get deployment,pod,svc,ep -o wide -n ops

    wps17 

     

    4) 访问prometheus

    http://172.16.1.71:30090/targets

    wps18 

     

    wps19 

     

    (5) 安装grafana

    1) 配置文件说明

    [root@k8s-admin prometheus]# ls -l grafana.yaml

    -rw-r--r-- 1 root root 1266 Jul 24  2020 grafana.yaml

    #  该配置文件包含Deploymentservice配置。

    #  grafana版本为grafana:7.1.0/var/lib/grafana挂载到nfs动态pvcgrafana

    #  service类型为NodePort,暴露外部端口为30030

     

    2) 应用yaml文件

    [root@k8s-admin prometheus]# kubectl apply -f grafana.yaml

    deployment.apps/grafana created

    persistentvolumeclaim/grafana created

    service/grafana created

     

    3) 查看部署信息

    [root@k8s-admin prometheus]# kubectl get deployment,pod,svc,pvc,pv,ep -n ops -o wide

    wps20 

    # 查看存储

    wps21 

     

    4) 登录grafana

    http://172.16.1.71:30030/

    wps22 

     

     

     

    (6) grafana中导入dashboard

    1) 配置grafana连接prometheus

    # 获取svc

    [root@k8s-admin ~]# kubectl get svc -n ops

    prometheus           NodePort    10.96.111.132   <none>        9090:30090/TCP      47h

     

    Address 1: 10.96.111.132 prometheus.ops.svc.cluster.local

     

    # 连接prometheus

    wps23 

    wps24 

     

    2) 导入"K8S工作节点监控"(node性能)

    wps25 

     

    wps26 

     

    3) 导入K8S集群资源监控(pod性能)

    wps27 

    wps28 

     

    4) 导入"K8S资源对象状态监控"(kube-state-metrics)

    wps29 

    wps30 

     

    (7) 告警

    1) 配置文件说明

    [root@k8s-admin prometheus]# ls -l alertmanager-*

    -rw-r--r-- 1 root root  652 Jul 24  2020 alertmanager-configmap.yaml

    # alertmanager报警邮箱配置文件,根据需要修改,采用ConfigMap方式挂载

    -rw-r--r-- 1 root root 2175 Jul 24  2020 alertmanager-deployment.yaml

    # altermanager部署配置,deployment方式部署,nfs动态卷pvc alertmanager挂载到/data

    -rw-r--r-- 1 root root  323 Jul 24  2020 alertmanager-pvc.yaml

    # nfs动态卷pvc alertmanager配置文件

    -rw-r--r-- 1 root root  384 Jul 24  2020 alertmanager-service.yaml

    # alertmanager svc配置文件,NodePort方式暴露30093端口

     

    2) 应用yaml文件

    [root@k8s-admin prometheus]# ls alertmanager-* | xargs -i kubectl apply -f {}

    configmap/alertmanager-config created

    deployment.apps/alertmanager created

    persistentvolumeclaim/alertmanager created

    service/alertmanager created

     

    3) 查看部署信息

    [root@k8s-admin prometheus]# kubectl get deployment,pod,svc,pvc,pv -o wide

    wps31 

     

    4) 访问alertmanager

    http://172.16.1.71:30093/#/alerts

    wps32 

     

    5) 查看报警规则

    wps33 

     

    6) 查看报警邮件

    wps34 

     

    (8) 修改PrometheusAlertmanager配置文件后重启方法

    以上的配置中PrometheusAlertmanager分别在各自的pod中又启动了一个镜像为

    jimmidyson/configmap-reload:v0.1的容器,用于监控配置文件的更改,然后重启pod

    中的PrometheusAlertmanager容器,但有时不太起作用,这时需要采用手动的方

    法重启pod中的PrometheusAlertmanager

     

    [root@k8s-admin prometheus]# kubectl get pod -n ops -o wide | egrep "prometheus|alertmanager"wps35

    Prometheus: curl -XPOST http://10.244.1.13:9090/-/reload

    Alertmanager: curl -XPOST http://10.244.1.17:9093/-/reload

     

     

  • 相关阅读:
    Confluence 6 从一个备份中获得文件附件
    Confluence 6 从其他备份中恢复数据
    Confluence 6 从生产环境中恢复一个测试实例
    从 Confluence 5.3 及其早期版本中恢复空间
    Confluence 6 恢复一个空间的问题解决
    Confluence 6 从一个 XML 备份中导入一个空间
    Confluence 6 恢复一个空间
    Confluence 6 恢复一个站点有关使用站点导出为备份的说明
    网易蜂巢(云计算基础服务)MongoDB服务重磅来袭
    pdfjs viewer 开发小结
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/14929573.html
Copyright © 2020-2023  润新知