• Traefik SRE 之使用 Prometheus 进行监控报警


    当我们使用 Traefik 作为 Kubernetes 的 Ingress 控制器的时候,我们自然也非常有必要对其进行监控。本文我们将探讨如何使用 Prometheus 和 Grafana 从 Traefik 提供的 metrics 指标中进行监控报警。

    安装

    首先你需要一个可以访问的 Kubernetes 集群。

    部署 Traefik

    这里我们使用更加简单的 Helm 方式来安装部署 Traefik。首先使用以下命令将 Traefik 添加到 Helm 的仓库中:

    $ helm repo add traefik https://helm.traefik.io/
    $ helm repo update
    

    然后我们可以在 kube-system 命名空间下来部署最新版本的 Traefik,在我们这个示例中,我们还需要确保在集群中启用了 Prometheus 指标,可以通过给 Helm 传递 --metrics.prometheus=true 标志来实现,这里我们将所有配置都放置到下面的 traefik-values.yaml 文件中:

    # traefik-values.yaml
    
    # 简单使用 hostPort 模式
    ports:
      web:
        port: 8000
        hostPort: 80
      websecure:
        port: 8443
        hostPort: 443
       
    service:
      enabled: false
    # 不暴露 dashboard
    ingressRoute:
      dashboard:
        enabled: false
    
    # 开启 prometheus 监控指标
    additionalArguments:
    - --api.debug=true
    - --metrics.prometheus=true
    
    # kubeadm 安装的集群默认情况下master是有污点,需要容忍这个污点才可以部署
    # 这里我们将 traefik 固定在 master 节点
    tolerations:   
    - key: "node-role.kubernetes.io/master"
      operator: "Equal"
      effect: "NoSchedule"
    
    nodeSelector: 
      kubernetes.io/hostname: "master1"
    

    直接使用如下所示的命令安装:

    $ helm install traefik traefik/traefik -n kube-system -f ./traefik-values.yaml
    NAME: traefik
    LAST DEPLOYED: Mon Apr  5 11:49:22 2021
    NAMESPACE: kube-system
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    

    由于我们默认没有为 Traefik 的 Dashboard 创建 IngressRoute 对象,这里我们使用 port-forward 来临时访问即可,当然首先需要为 Traefik Dashboard 创建一个 Service:

    # traefik-dashboard-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: traefik-dashboard
      namespace: kube-system
      labels:
        app.kubernetes.io/instance: traefik
        app.kubernetes.io/name: traefik-dashboard
    spec:
      type: ClusterIP
      ports:
      - name: traefik
        port: 9000
        targetPort: traefik
        protocol: TCP
      selector:
        app.kubernetes.io/instance: traefik
        app.kubernetes.io/name: traefik
    

    直接创建,然后使用端口转发来访问:

    $ kubectl apply -f traefik-dashboard-service.yaml
    $ kubectl port-forward service/traefik-dashboard 9000:9000 -n kube-system
    Forwarding from 127.0.0.1:9000 -> 9000
    Forwarding from [::1]:9000 -> 9000
    

    接下来我们就可以通过浏览器 http://localhost:9000/dashboard/(注意 URL 中的尾部斜杠,这是必须的)访问 Traefik Dashboard 了,现在应该可以看到在仪表板的 Features 部分启用了 Prometheus 指标。

    此外我们还可以访问 http://localhost:9000/metrics 端点来查看 Traefik 提供的一些 metrics 指标:

    部署 Prometheus Stack

    Prometheus 完整的工具链由许多组件组成,如果要完全手动去安装配置需要较长时间,感兴趣的朋友可以参考前面我们的文章相关介绍。同样这里我们直接使用 Prometheus 的 Helm Charts 来部署:

    $ helm repo add prometheus-community https://github.com/prometheus-community/helm-charts
    $ helm repo update
    

    上述资源库提供了许多 Chart,要查看完整的列表,你可以使用搜索命令:

    $ helm search repo prometheus-community
    

    这里我们需要安装的是 kube-prometheus-stack 这个 Chart,它会部署所需要的相关组件:

    $ helm install prometheus-stack prometheus-community/kube-prometheus-stack
    NAME: prometheus-stack
    LAST DEPLOYED: Mon Apr  5 12:25:22 2021
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    NOTES:
    kube-prometheus-stack has been installed. Check its status by running:
      kubectl --namespace default get pods -l "release=prometheus-stack"
    
    Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
    

    配置 Traefik 监控

    Prometheus Operator 提供了 ServiceMonitor 这个 CRD 来配置监控指标的采集,这里我们定义一个如下所示的对象:

    # traefik-service-monitor.yaml
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name:  traefik
      namespace: default
      labels:
        app: traefik
        release: prometheus-stack
    spec:
      jobLabel: traefik-metrics
      selector:
        matchLabels:
          app.kubernetes.io/instance: traefik
          app.kubernetes.io/name: traefik-dashboard
      namespaceSelector:
        matchNames:
        - kube-system
      endpoints:
      - port: traefik
        path: /metrics
    

    根据上面的配置,Prometheus 将获取 traefik-dashboard 服务的 /metrics 端点。主要注意的是 traefik-dashboard 服务是在 kube-system 命名空间中创建的,而 ServiceMonitor 则部署在默认的 default 命名空间中,所以这里面我们使用了 namespaceSelector 进行命名空间匹配。

    $ kubectl apply -f traefik-service-monitor.yaml
    

    接下来我们可以来验证一下 Prometheus 是否已经开始抓取 Traefik 的指标了。

    配置 Traefik 报警

    接下来我们还可以添加一个报警规则,当条件匹配的时候会触发报警,同样 Prometheus Operator 也提供了一个名为 PrometheusRule 的 CRD 对象来配置报警规则:

    # traefik-rules.yaml
    apiVersion: monitoring.coreos.com/v1
    kind: PrometheusRule
    metadata:
      annotations:
        meta.helm.sh/release-name: prometheus-stack
        meta.helm.sh/release-namespace: default
      labels:
        app: kube-prometheus-stack
        release: prometheus-stack
      name: traefik-alert-rules
      namespace: default
    spec:
      groups:
      - name: Traefik
        rules:
        - alert: TooManyRequest
          expr: avg(traefik_entrypoint_open_connections{job="traefik-dashboard",namespace="kube-system"}) > 5
          for: 1m
          labels:
            severity: critical
    

    这里我们定义了一个规则:如果1分钟内有超过5个 open connections 机会触发一个 TooManyRequest 报警,直接创建这个对象即可:

    $ kubectl apply -f traefik-rules.yaml
    

    创建完成后正常在 Promethues 的 Dashboard 下的 Status > Rules 页面就可以看到对应的报警规则:

    Grafana 配置

    前面使用 kube-prometheus-stack 这个 Helm Chart 部署的时候就已经部署上了 Grafana,接下来我们可以为 Traefik 的监控指标配置一个 Dashboard,同样首先我们使用端口转发的方式来访问 Grafana:

    $ kubectl port-forward service/rometheus-stack-grafana 10080:80
    

    然后访问 Grafana GUI(http://localhost:10080)时,它会要求输入登录名和密码,默认的登录用户名是 admin,密码是 prom-operator,密码可以从名为 prometheus-operator-grafana 的 Kubernetes Secret 对象中获取。

    当然我们可以自己为 Traefik 自定义一个 Dashboard,也可以从 Grafana 的官方社区中导入一个合适的即可,点击左侧导航栏上的四方形图标,导航到 Dashboards > Manage,即可添加仪表盘。

    点击右上角的 Import 按钮,输入 11462 作为 Dashboard 的 ID,对应用户 timoreymann 贡献的 Traefik 2 仪表盘。

    点击 Load 后,你应该看到导入的仪表盘的相关信息。

    在最下面有一个下拉菜单,选择 Prometheus 数据源,然后点击 Import,即可生成如下所示的 Dashboard。

    测试

    现在,Traefik 已经开始工作了,并且指标也被 Prometheus 和 Grafana 获取到了,接下来我们需要使用一个应用程序来测试。这里我们部署 HTTPBin 服务,它提供了许多端点,可用于模拟不同类型的用户流量。对应的资源清单文件如下所示:

    # httpbin.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      labels:
        app: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
        spec:
          containers:
          - image: kennethreitz/httpbin
            name: httpbin
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: httpbin
    spec:
      entryPoints:
        - web
      routes:
      - match: Host(`httpbin.local`)
        kind: Rule
        services:
        - name: httpbin
          port: 8000
    

    直接创建上面的资源清单:

    $ kubectl apply -f httpbin.yaml
    deployment.apps/httpbin created
    service/httpbin created
    ingressroute.traefik.containo.us/httpbin created
    

    httpbin 路由会匹配 httpbin.local 的主机名,然后将请求转发给 httpbin Service:

    $ curl -I http://192.168.31.75  -H "host:httpbin.local"
    HTTP/1.1 200 OK
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Origin: *
    Content-Length: 9593
    Content-Type: text/html; charset=utf-8
    Date: Mon, 05 Apr 2021 05:43:16 GMT
    Server: gunicorn/19.9.0
    

    我们这里部署的 Traefik 使用的是 hostPort 模式,固定到 master 节点上面的,这里的 IP 地址 192.168.31.75 就是 master 节点的 IP 地址。

    接下来我们使用 ab 来访问 HTTPBin 服务模拟一些流量,这些请求会产生对应的指标,执行以下脚本:

    $ ab -c 5 -n 10000  -m PATCH -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/patch
    $ ab -c 5 -n 10000  -m GET -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/get
    $ ab -c 5 -n 10000  -m POST -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/post
    

    正常一段时间后再去查看 Grafana 的 Dashboard 可以看到显示了更多的信息:

    包括:正常运行的时间、平均响应时间、请求总数、基于 HTTP 方法和服务的请求计数等。

    最后,当我们测试应用流量时,Prometheus 可能会触发报警,之前创建的 TooManyRequest 报警将显示在 Alertmanager 仪表板上,然后可以自己根据需要配置接收报警信息的 Receiver 即可。

    $ kubectl port-forward service/prometheus-stack-kube-prom-alertmanager 9093:9093
    Forwarding from 127.0.0.1:9093 -> 9093
    

    总结

    在本文中,我们已经看到了将 Traefik 连接到 Prometheus 和 Grafana 以从 Traefik 指标中创建可视化的过程是非常简单的。当熟悉这些工具后,我们也可以根据实际需求创建一些 Dashboard,暴露你的环境的一些关键数据。

    实际操作

    k8s版本:1.20.12
    traefik版本:2.4.8

    已经安装好k8s和traefik了,Prometheus ,Alertmanager 和Grafana采用传统方式进行安装的

    按照上面文章的讲述,traefik开启Prometheus监控需要加参数:--metrics.prometheus=true,有两种办法,yaml文件或使用kubeapi

    yaml文件

    使用kubeapi

    通过浏览器访问traefik的dashboard, http://www.daniel.com/dashboard/(注意 URL 中的尾部斜杠,这是必须的)访问 Traefik Dashboard 了,现在应该可以看到在仪表板的 Features 部分启用了 Prometheus 指标。

    浏览器访问traefik的dashboard,查看文章:https://www.cnblogs.com/sanduzxcvbnm/p/15741429.html

    此外我们还可以访问 http://www.daniel.com/metrics 端点来查看 Traefik 提供的一些 metrics 指标:

    访问报错404

    使用地址 http://www.daniel.com:18443/metrics 就可以

    刚才的404,可以查看接口信息获取http://www.daniel.com/api/rawdata

    可以看到默认的PathPrefix(/metrics)用的entryPoints是traefik,而不是web,因此才需要加上端口号

    想使用域名不加端口号的形式进行访问,可以使用其他域名新加一条

    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      labels:
        app.kubernetes.io/name: traefik
        kubernetes.io/ingress.class: traefik
      name: traefik-dashboard
      namespace: kube-system
      resourceVersion: '2897779'
    spec:
      entryPoints:
        - web
      routes:
        - kind: Rule
          match: Host(`www.daniel.com`) && PathPrefix(`/dashboard`) || PathPrefix(`/api`)
          services:
            - kind: TraefikService
              name: api@internal
        # 以下内容是新加的
        - kind: Rule
          match: Host(`www.aaa.com`) && PathPrefix(`/metric`)
          services:
            - kind: TraefikService
              name: prometheus@internal
    

    部署 Prometheus ,略过
    使用Prometheus 配置 Traefik 监控,收集数据,配置文件增加如下内容:

    k8s集群安装有traefik的节点都写上,这里仍使用端口号进行获取数据

      - job_name: 'traefik'
        static_configs:
        - targets: ['192.168.2.163:18443','192.168.2.164:18443','192.168.2.165:18443','192.168.2.167:18443']
    

    Grafana 配置
    先添加Prometheus数据源,然后再输入 11462 作为 Dashboard 的 ID



    一堆报错的,换了多个模板,还是报错,应该是从Prometheus获取数据的时候有问题,或者是模板有点老的缘故,这个问题先暂时放下,以后再解决

  • 相关阅读:
    一个页面从输入url到页面加载显示完成,中间都经历了什么
    获取鼠标点击的是那个键位、阻止鼠标点击的默认事件
    获取鼠标的位置
    图片上传
    jQuery实现瀑布流(pc、移动通用)
    怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.
    js商城倒计时
    页面跳转前动画加载,页面跳转后记住滚动位置
    乐观锁与悲观锁
    过滤器、监听器、拦截器的区别
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/15749905.html
Copyright © 2020-2023  润新知