跳到內容
開源

把叢集警示送到通知管道

新增通知管道、選擇事件並傳送測試,讓節點與叢集異常能送達管理員。

打開 叢集 → 通知,按 新增管道,選擇接收位置和事件。套用後按 傳送測試,到 Slack、信箱或其他接收位置確認有收到。

叢集的管道接收節點、Falco 執行期安全事件和系統 Namespace 的警示。個別專案的建置、部署或資料庫事件,要在該專案的 設定 → 通知 另外新增管道。

  • 叢集裝了指標元件(VictoriaMetrics)。畫面顯示 通知需要先安裝警示功能 時,按 安裝指標元件,裝好再回來。
  • 準備好接收服務的 Webhook 網址、權杖或 SMTP 設定。
  • 新增管道需要在通知所在的 Namespace 建立 VMAlertmanagerConfig 和 Secret 的權限。傳送測試還要能建立 Job。管理員帳號都有這些權限。

在 叢集 → 通知 按 新增管道。名稱 最多 30 個字元,只能用小寫字母、數字和連字號,並以字母開頭。

在 送到 選擇類型,填入對應設定:

類型需要準備
Slack、DiscordWebhook 網址。
TelegramBot 權杖、數字格式的 聊天 ID。
電子郵件收件人、寄件人,以及含連接埠的 SMTP 伺服器,例如 smtp.example.com:587。SMTP 伺服器必須支援 TLS,SMTP 帳號 和 SMTP 密碼 選填。
Webhook網址,Bearer 權杖 選填。
ntfy主題。伺服器 留白時使用 ntfy.sh,存取權杖 選填。

在 事件 至少勾一項,例如 節點沒有就緒 或 執行期安全(Falco)。

按 檢查變更,確認要建立的管道和存放網址、權杖的機密(內容不會顯示),再按 新增管道。

等管道不再標示 等待中,在管道列按 傳送測試,檢查要建立的測試用 Job,再按 傳送測試。

測試是一個最多執行兩分鐘的 Job,警示規則看到它後,會送一則測試警示到這個管道。畫面顯示已傳送後,大約一兩分鐘內,到接收位置確認有收到訊息。

在管道列按 編輯,可以改事件和接收設定,再按 檢查變更 和 儲存管道。

表單會帶入不屬於機密的設定。網址、權杖和密碼欄位會留空,標示 不變更。留空就保留已儲存的值,填了才會換掉那一項。Zeabur 不會讀出已儲存的機密。

類型不能改。要從 Slack 改送到電子郵件這類不同的類型,先新增另一個管道、傳送測試並確認收到,再移除舊的管道。

一個管道是兩個名為 zeabur-notify-<名稱> 的物件,都帶 label zeabur.com/notification-channel: <名稱>:Secret 放網址、權杖和密碼,VMAlertmanagerConfig 寫路由和接收設定。叢集的管道放在 observability Namespace,專案的管道放在專案自己的 Namespace。

下面是專案 shop 的 Slack 管道,收當機重啟和部署失敗:

apiVersion: v1
kind: Secret
metadata:
name: zeabur-notify-ops
namespace: shop
labels:
zeabur.com/notification-channel: ops
type: Opaque
stringData:
url: https://hooks.slack.com/services/T000/B000/XXXX
---
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMAlertmanagerConfig
metadata:
name: zeabur-notify-ops
namespace: shop
labels:
zeabur.com/notification-channel: ops
annotations:
zeabur.com/notification-kind: slack
spec:
route:
receiver: events
matchers:
- zeabur_event=~"crash-loop|deploy-failed|test"
- zeabur_channel=~"|ops"
group_by: ["..."]
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
routes:
- receiver: states
matchers:
- zeabur_kind="state"
group_by: [alertname]
receivers:
- name: events
slack_configs:
- api_url: {name: zeabur-notify-ops, key: url}
title: '{{ if eq .Status "resolved" }}Resolved: {{ end }}{{ (index .Alerts 0).Annotations.summary }}'
text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
send_resolved: false
- name: states
slack_configs:
- api_url: {name: zeabur-notify-ops, key: url}
title: '{{ if eq .Status "resolved" }}Resolved: {{ end }}{{ (index .Alerts 0).Annotations.summary }}'
text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
send_resolved: true

幾個要照著寫的地方:

  • 第一個 matcher 列出要收的事件,最後要加上 test,傳送測試 才收得到。專案可用的事件有 build-failed、build-succeeded、deploy-failed、deploy-succeeded、crash-loop、out-of-memory、database-unhealthy、backup-failed、volume-almost-full、certificate。叢集的管道可用 node-not-ready、runtime-security、crash-loop、volume-almost-full、certificate、backup-failed。
  • 第二個 matcher 的 |ops 讓這個管道收一般警示,也收指名給 ops 的測試。
  • events 和 states 兩個接收設定內容相同,只差 send_resolved。狀態類的警示恢復時會再通知一次。

其他類型的 Secret 鍵和接收設定:

類型Secret 的鍵接收設定
Discordurldiscord_configs,webhook_url_secret 指向 url
Telegramtokentelegram_configs,bot_token 指向 token,chat_id 寫數字
電子郵件password(有填才有)email_configs,to、from、smarthost、require_tls: true,auth_username、auth_password 選填
Webhookurl,token 選填webhook_configs,url_secret 指向 url;有權杖時加 http_config.authorization(type: Bearer,credentials 指向 token)
ntfyurl,token 選填同 Webhook。url 寫 https://ntfy.sh/<主題>?template=alertmanager,自架伺服器就換掉網域

傳送測試是建立一個帶 zeabur.com/notification-test: <名稱> 的 Job。指標元件的警示規則看到它,就送出一則指名給這個管道的測試警示:

apiVersion: batch/v1
kind: Job
metadata:
name: zeabur-notify-test-ops-1761456000
namespace: shop
labels:
zeabur.com/notification-test: ops
spec:
activeDeadlineSeconds: 120
ttlSecondsAfterFinished: 300
backoffLimit: 0
template:
metadata:
labels:
zeabur.com/notification-test: ops
spec:
restartPolicy: Never
automountServiceAccountToken: false
enableServiceLinks: false
securityContext:
runAsNonRoot: true
runAsUser: 65535
seccompProfile: {type: RuntimeDefault}
containers:
- name: wait
image: registry.k8s.io/pause:3.10
resources:
requests: {cpu: 1m, memory: 4Mi}
limits: {cpu: 10m, memory: 8Mi}
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities: {drop: [ALL]}

移除管道就是刪掉這兩個物件:

kubectl -n shop delete vmalertmanagerconfig,secret zeabur-notify-ops
  • 管道列不再顯示 等待中,也沒有 被拒絕。
  • kubectl -n shop get vmalertmanagerconfig zeabur-notify-ops -o jsonpath='{.status.updateStatus}' 印出 operational。印出 failed 時,把路徑換成 {.status.reason} 看原因。
  • 傳送測試後一兩分鐘內,接收位置收到一則測試訊息。
  • 等待中:Alertmanager 還沒載入這個管道,稍後再看。
  • 被拒絕:該列會寫出原因,例如網址不完整、儲存的網址或權杖不見了、SMTP 伺服器沒有連接埠。按 編輯 修正後儲存。
  • 收不到測試:核對接收服務的網址和權杖。畫面說 Zeabur 的警示規則沒有安裝時,重新安裝指標元件。
  • 能新增管道卻不能測試:傳送測試要能建立 Job,請管理員確認這項權限。
  • 不是在 Zeabur 建立的,請到原本建立的地方修改:回到原本的 Helm 或 GitOps 設定修改。

在管道的操作選單選 移除,確認要刪除的管道和機密後按 移除管道。之後的警示只會送到其他有勾選該事件的管道。

測試用的 Job 結束五分鐘後,Kubernetes 會自動刪除它,不用另外清理。