目錄
- 背景
- 邊緣集群限制
- 關鍵需求
- 方案
- 架構圖
- 技術方案規劃
- 實施步驟
- 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 << _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_