当前位置 : 主页 > 操作系统 > centos >

IoT边缘集群Kubernetes Events告警通知实现示例

来源:互联网 收集:自由互联 发布时间:2023-03-17
目录 背景 边缘集群限制 关键需求 方案 架构图 技术方案规划 实施步骤 1. 创建 roles 2. 创建 kubernetes-event-exporter config 3. 创建 Deployment 自动化部署 最终效果 背景 边缘集群(基于 树莓派
目录
  • 背景
    • 边缘集群限制
    • 关键需求
  • 方案
    • 架构图
    • 技术方案规划
  • 实施步骤
    • 1. 创建 roles
    • 2. 创建 kubernetes-event-exporter config
    • 3. 创建 Deployment
  • 自动化部署
    • 最终效果

      背景

      边缘集群(基于 树莓派 + K3S) 需要实现基本的告警功能。

      边缘集群限制

      CPU/内存/存储 资源紧张,无法支撑至少需要 2GB 以上内存和大量存储的基于 Prometheus 的完整监控体系方案(即使是基于 Prometheus Agent, 也无法支撑) (需要避免额外的存储和计算资源消耗)

      网络条件,无法支撑监控体系,因为监控体系一般都需要每 1min 定时(或每时每刻)传输数据,且数据量不小;

      存在 5G 收费网络的情况,且访问的目的端地址需要开通权限,且按照流量收费,且因为 5G 网络条件,网络传输能力受限,且不稳定(可能会在一段时间内离线);

      关键需求

      总结下来,关键需求如下:

      • 实现对边缘集群异常的及时告警,需要知道边缘集群正在发生的异常情况;
      • 网络:网络条件情况较差,网络流量少,只只能开通极少数目的端地址,可以容忍网络不稳定(一段时间内离线)的情况;
      • 资源:需要尽量避免额外的存储和计算资源消耗

      方案

      综上所诉,采用如下方案实现:

      基于 Kubernetes Events 的告警通知

      架构图

      技术方案规划

      • 从 Kubernetes 的各项资源收集 Events, 如:

        pod

        node

        kubelet

        crd

        ...

      • 通过 kubernetes-event-exporter 组件来实现对 Kubernetes Events 的收集;
      • 只筛选 Warning 级别 Events 供告警通知(后续,条件可以进一步定义)
      • 告警通过 飞书 webhook 等通信工具进行发送(后续,发送渠道可以增加)

      实施步骤

      手动方式:

      在边缘集群上,执行如下操作:

      1. 创建 roles

      如下:

      cat << _EOF_ | kubectl apply -f -
      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: monitoring
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: event-exporter-extra
      rules:
        - apiGroups:
            - ""
          resources:
            - nodes
          verbs:
            - get
            - list
            - watch
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        namespace: monitoring
        name: event-exporter
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: event-exporter
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: view
      subjects:
        - kind: ServiceAccount
          namespace: monitoring
          name: event-exporter
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: event-exporter-extra
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: event-exporter-extra
      subjects:
        - kind: ServiceAccount
          namespace: kube-event-export
          name: event-exporter
      _EOF_
      

      2. 创建 kubernetes-event-exporter config

      如下:

      cat &lt;&lt; _EOF_ | kubectl apply -f -
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: event-exporter-cfg
        namespace: monitoring
      data:
        config.yaml: |
          logLevel: error
          logFormat: json
          route:
            routes:
              - match:
                  - receiver: "dump"      
              - drop:
                  - type: "Normal"
                match:
                  - receiver: "feishu"                     
          receivers:
            - name: "dump"
              stdout: {}
            - name: "feishu"
              webhook:
                endpoint: "https://open.feishu.cn/open-apis/bot/v2/hook/..."
                headers:
                  Content-Type: application/json
                layout:
                  msg_type: interactive
                  card:
                    config:
                      wide_screen_mode: true
                      enable_forward: true
                    header:
                      title:
                        tag: plain_text
                        content: XXX IoT K3S 集群告警
                      template: red
                    elements:
                      - tag: div
                        text: 
                          tag: lark_md
                          content: "**EventType:**  {{ .Type }}\n**EventKind:**  {{ .InvolvedObject.Kind }}\n**EventReason:**  {{ .Reason }}\n**EventTime:**  {{ .LastTimestamp }}\n**EventMessage:**  {{ .Message }}"
      _EOF_
      

      网友评论