目錄
- 背景
- 邊緣集群限制
- 關鍵需求
- 方案
- 架構圖
- 技術方案規(guī)劃
- 實施步驟
- 1. 創(chuàng)建 roles
- 2. 創(chuàng)建 kubernetes-event-exporter config
- 3. 創(chuàng)建 Deployment
- 自動化部署
- 最終效果
背景
邊緣集群(基于 樹莓派 + K3S) 需要實現基本的告警功能。
邊緣集群限制
CPU/內存/存儲 資源緊張,無法支撐至少需要 2GB 以上內存和大量存儲的基于 Prometheus 的完整監(jiān)控體系方案(即使是基于 Prometheus Agent, 也無法支撐) (需要避免額外的存儲和計算資源消耗)
網絡條件,無法支撐監(jiān)控體系,因為監(jiān)控體系一般都需要每 1min 定時(或每時每刻)傳輸數據,且數據量不小;
存在 5G 收費網絡的情況,且訪問的目的端地址需要開通權限,且按照流量收費,且因為 5G 網絡條件,網絡傳輸能力受限,且不穩(wěn)定(可能會在一段時間內離線);
關鍵需求
總結下來,關鍵需求如下:
- 實現對邊緣集群異常的及時告警,需要知道邊緣集群正在發(fā)生的異常情況;
- 網絡:網絡條件情況較差,網絡流量少,只只能開通極少數目的端地址,可以容忍網絡不穩(wěn)定(一段時間內離線)的情況;
- 資源:需要盡量避免額外的存儲和計算資源消耗
方案
綜上所訴,采用如下方案實現:
基于 Kubernetes Events 的告警通知
架構圖

技術方案規(guī)劃
- 從 Kubernetes 的各項資源收集 Events, 如:
pod
node
kubelet
crd
…
- 通過 kubernetes-event-exporter 組件來實現對 Kubernetes Events 的收集;
- 只篩選
Warning級別 Events 供告警通知(后續(xù),條件可以進一步定義) - 告警通過 飛書 webhook 等通信工具進行發(fā)送(后續(xù),發(fā)送渠道可以增加)
實施步驟
手動方式:
在邊緣集群上,執(zhí)行如下操作:
1. 創(chuàng)建 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. 創(chuàng)建 kubernetes-event-exporter config
如下:
cat << _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_






