
ที่มาภาพ: Unknown Source
วิธีตั้งค่า Prometheus Alertmanager ให้ส่งการแจ้งเตือนไปยัง Slack บนคลัสเตอร์ Kubernetes อย่างปลอดภัย
⚡ สรุป 30 วิ
การทำ **Monitoring** บน Kubernetes ไม่ได้จบแค่การเก็บข้อมูลเท่านั้น การแจ้งเตือน (Alert) ให้ทีมรับรู้เหตุการณ์สำคัญก็เป็นสิ่งจำเป็น บทความนี้จะสอนวิธีตั้งค่า **Prometheus Alertmanager** เพื่อส่งข้อควา…
บทนำ
การทำ Monitoring บน Kubernetes ไม่ได้จบแค่การเก็บข้อมูลเท่านั้น การแจ้งเตือน (Alert) ให้ทีมรับรู้เหตุการณ์สำคัญก็เป็นสิ่งจำเป็น บทความนี้จะสอนวิธีตั้งค่า Prometheus Alertmanager เพื่อส่งข้อความไปยัง Slack อย่างปลอดภัย ทั้งขั้นตอนติดตั้ง คำสั่งสำคัญ และแนวทางปฏิบัติด้านความปลอดภัย
Overview — Overview
Alertmanager ทำหน้าที่รับแจ้งเตือนจาก Prometheus แล้วจัดการ routing, grouping, inhibition ก่อนส่งต่อไปยังช่องทางที่กำหนด เช่น Slack การทำงานแบบนี้ช่วยให้ทีมได้รับข้อมูลสำคัญในเวลาจริงโดยไม่ต้องตรวจสอบ UI ของ Prometheus ทุกครั้ง
- Prometheus – เก็บเมตริกจากแอปพลิเคชันและคลัสเตอร์
- Alertmanager – จัดการ rule, routing และส่งออก (output) ไปยัง Slack ผ่าน webhook
- Slack Webhook – URL ปลอดภัยที่รับ POST request จาก Alertmanager แล้วโพสต์ข้อความลงช่องทางที่ระบุ
- Kubernetes – โฮสต์คอนเทนเนอร์ Prometheus + Alertmanager พร้อมจัดการ Secret, ConfigMap และ RBAC
Prerequisites — Prerequisites
ก่อนเริ่มทำตามขั้นตอนต่อไปนี้ ควรตรวจสอบว่าได้เตรียมสภาพแวดล้อมครบถ้วนแล้วหรือยัง
- คลัสเตอร์ Kubernetes ที่เข้าถึงได้ (เวอร์ชัน 1.20+)
- `kubectl` ตั้งค่าเชื่อมต่อกับคลัสเตอร์เรียบร้อย
- Helm 3.x ติดตั้งบนเครื่องของคุณ (ใช้สำหรับติดตั้ง Prometheus)
- Slack Workspace มีสิทธิ์สร้าง Incoming Webhook และช่องทางที่ต้องการรับแจ้งเตือน
Install Prometheus — Install Prometheus
เราจะใช้ Helm chart ของ `kube-prometheus-stack` ซึ่งรวม Prometheus, Alertmanager, Grafana ไว้ในแพคเกจเดียว
- **ขั้นตอนที่ 1: เพิ่ม Helm repository
```bash helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update ```
- **ขั้นตอนที่ 2: สร้าง namespace `monitoring` เพื่อแยกทรัพยากร
```bash kubectl create ns monitoring ```
- **ขั้นตอนที่ 3: ติดตั้ง chart พร้อมกำหนดค่าเริ่มต้น (ยังไม่เปิด Slack)
```bash helm install prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set alertmanager.enabled=true \ --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false ```
- **ขั้นตอนที่ 4: ตรวจสอบ Pods ทั้งหมดอยู่ในสถานะ `Running`
```bash kubectl get pods -n monitoring ```
Create Secret for Slack Webhook — Create Secret
เพื่อไม่ให้ URL ของ webhook ปรากฏเป็นข้อความธรรมดา เราจะเก็บไว้ใน Kubernetes Secret
- **ขั้นตอนที่ 1: สร้างไฟล์ `slack-webhook.yaml`
```yaml apiVersion: v1 kind: Secret metadata: name: alertmanager-slack-secret namespace: monitoring type: Opaque stringData: webhook_url: https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ ```
- **ขั้นตอนที่ 2: นำเข้า Secret เข้าคลัสเตอร์
```bash kubectl apply -f slack-webhook.yaml ```
- **ขั้นตอนที่ 3: ตรวจสอบว่า Secret ถูกสร้างเรียบร้อยโดยไม่แสดงค่า plaintext
```bash kubectl get secret alertmanager-slack-secret -n monitoring -o yaml ```
Deploy Alertmanager with Secure Config — Deploy Alertmanager
ต่อไปเราจะกำหนดไฟล์ `alertmanager.yaml` ให้ดึง webhook จาก Secret และเปิดใช้ TLS
- **ขั้นตอนที่ 1: สร้าง ConfigMap สำหรับ Alertmanager configuration
```yaml apiVersion: v1 kind: ConfigMap metadata: name: alertmanager-config namespace: monitoring data: alertmanager.yml: | global: resolve_timeout: 5m route: receiver: slack-notifications group_wait: 30s group_interval: 5m repeat_interval: 12h receivers:
- name: slack-notifications
slack_configs:
- api_url: "{{ .Secret.webhook_url }}"
channel: "#alerts" send_resolved: true inhibit_rules:
- source_match:
severity: critical target_match: severity: warning equal: ["alertname", "namespace"] ```
- **ขั้นตอนที่ 2: แก้ไข Helm values เพื่อใช้ ConfigMap & Secret นี้
```yaml alertmanager: configMapOverrideName: alertmanager-config secretMountPath: /etc/alertmanager/secrets extraSecretMounts:
- name: slack-webhook-secret
mountPath: /etc/alertmanager/secrets readOnly: true serviceAccount: create: true podSecurityContext: fsGroup: 2000 securityContext: runAsUser: 1000 capabilities: drop: ["ALL"] resources: limits: cpu: 200m memory: 128Mi ```
- **ขั้นตอนที่ 3: อัปเดต release ด้วยค่าใหม่
```bash helm upgrade prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring -f values.yaml ```
Configure Routing & Inhibition Rules — Routing Rules
Alertmanager สามารถกรองและจัดกลุ่มแจ้งเตือนได้ตามเงื่อนไข
- ใช้ `severity` เพื่อแยกระดับความสำคัญ (critical, warning)
- กำหนด inhibit_rules เพื่อลดการซ้ำซ้อน: หากมี alert ระดับ critical แล้วก็ไม่ต้องส่ง warning ของเดียวกัน
- ตั้งค่า `group_wait`, `group_interval`, `repeat_interval` ให้เหมาะกับปริมาณแจ้งเตือนของระบบ
Test Notification — Testing
หลังตั้งค่าทุกอย่างแล้ว ควรตรวจสอบว่า Alertmanager สามารถส่งข้อความไปยัง Slack ได้จริง
- **ขั้นตอนที่ 1: สร้างไฟล์ rule ชั่วคราว `test-alert.yaml`
```yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: test-alert namespace: monitoring spec: groups:
- name: test.rules
rules:
- alert: TestAlert
expr: vector(1) for: 10s labels: severity: warning annotations: summary: "Test alert from Prometheus" ```
- **ขั้นตอนที่ 2: นำ rule ไปใช้
```bash kubectl apply -f test-alert.yaml ```
- **ขั้นตอนที่ 3: ตรวจสอบ Slack channel ที่กำหนด หากพบข้อความ “TestAlert” แสดงว่าตั้งค่าเสร็จสมบูรณ์
**Tip: ควรใช้ช่อง Slack ทดสอบ (เช่น `#alerts-test`) ก่อนเปลี่ยนไปใช้ production channel เพื่อลดความเสี่ยงจากการสแปม
Security Best Practices — Security
เพื่อให้ระบบแจ้งเตือนทำงานได้อย่างปลอดภัย ควรปฏิบัติตามข้อแนะนำต่อไปนี้
- เปิดใช้งาน TLS บน Alertmanager Service (ใช้ cert-manager หรือ secret ที่มีใบรับรอง)
- กำหนด RBAC ให้เฉพาะ ServiceAccount ของ Alertmanager สามารถอ่าน Secret เท่านั้น
```yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: monitoring name: alertmanager-secret-reader rules:
- apiGroups: []
resources: ["secrets"] verbs: ["get"] ```
- ใช้ NetworkPolicy จำกัดการเข้าถึง Alertmanager จาก Pods ภายนอกที่ไม่ได้รับอนุญาต
- ตั้งค่า resource limits (CPU, Memory) เพื่อป้องกันการโจมตีแบบ DoS
Common Pitfalls & Troubleshooting — Troubleshooting
เมื่อแจ้งเตือนไม่ถึง Slack หรือมีข้อผิดพลาด ควรตรวจสอบตามรายการต่อไปนี้
- Secret ชื่อหรือคีย์ (`webhook_url`) ผิดพลาด ตรวจสอบ `kubectl describe secret`
- Alertmanager ไม่ได้โหลด ConfigMap ใหม่ รีสตาร์ท Pod ด้วย `kubectl rollout restart deployment alertmanager-main -n monitoring`
- Webhook URL ถูกบล็อกโดย firewall หรือ NetworkPolicy ตรวจสอบการเชื่อมต่อจากคลัสเตอร์ออกไปยัง `hooks.slack.com`
- Slack channel มีการตั้งค่า rate limiting ลดจำนวน alert ที่ส่งพร้อมกันหรือเพิ่ม `group_interval`
Summary — Summary
สรุปขั้นตอนสำคัญที่ควรจำเมื่อทำ Prometheus Alertmanager + Slack บน Kubernetes อย่างปลอดภัย
- สร้าง Secret เก็บ Slack webhook URL แทนการใช้ plaintext
- ใช้ ConfigMap เพื่อกำหนด `alertmanager.yml` และเชื่อมกับ Secret ผ่าน Helm values
- เปิดใช้งาน TLS, RBAC, NetworkPolicy เพื่อลดพื้นผิวโจมตี
- ทดสอบด้วย alert จำลองก่อนใช้งานจริงและตรวจสอบการทำงานผ่าน Slack channel ที่กำหนด
เมื่อทำตามแนวทางเหล่านี้ ระบบแจ้งเตือนของคุณจะมีความน่าเชื่อถือ ปลอดภัย และพร้อมสนับสนุนทีมให้ตอบสนองต่อเหตุการณ์ได้อย่างทันท่วงที.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธีตั้งค่า Prometheus Alertmanager ให้ส่งการแจ้งเตือนไปยัง Slack บนคลัสเตอร์ Kubernetes อย่างปลอดภัย
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 12 สิงหาคม 2569 เวลา 17:51



