孙大伟 发表于 2023-2-25 11:41:17

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

背景

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

边缘集群限制

CPU/内存/存储 资源紧张,无法支撑至少需要 2GB 以上内存和大量存储的基于 Prometheus 的完整监控体系方案(即使是基于 Prometheus Agent, 也无法支撑) (需要避免额外的存储和计算资源消耗)
网络条件,无法支撑监控体系,因为监控体系一般都需要每 1min 定时(或每时每刻)传输数据,且数据量不小;
存在 5G 收费网络的情况,且访问的目的端地址需要开通权限,且按照流量收费,且因为 5G 网络条件,网络传输能力受限,且不稳定(可能会在一段时间内离线);

关键需求

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

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

方案

综上所诉,采用如下方案实现:
基于 Kubernetes Events 的告警通知

架构图

https://img.jbzj.com/file_images/article/202302/20230217083939022.jpg

技术方案规划


[*]从 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_

来源:https://www.jb51.net/article/275623.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: IoT边缘集群Kubernetes Events告警通知实现示例