iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
Cloud Native

駕馭商用容器叢集,汪洋漂流術系列 第 15

【Day 15】 DaemonSet / StatefulSet / PVC - 在叢集中部署監控、有狀態容器所需的工作負載

  • 分享至 

  • xImage
  •  

前言

在規劃叢集內部資源要怎麼部署的時候,比起衡量服務需要的算力、記憶體、網路等,更核心要探討的部分,是這些容器要做什麼事情、解決什麼問題
依照部署出來的特性,通常要用來監控叢集的,或者是作為 CNI插件 (CNI Plugins),必須要部署在每個節點上。
然而在早期使用 Docker Container 建立的觀念,資料庫不適合用容器運行,因為 Docker container 是 暫態(ephemeral) 的。 雖然技術上可行,若沒有妥善掛載 volume(如 Docker Volume、Bind mount、PVC),container 一重啟資料就沒了; 可以用但如果有叢集幫忙管理 永久儲存 (Persistent Volume) 的話,那麼也是可以拿容器來作為資料庫使用。

DaemonSet

  • 顧名思義,拿來作為 Daemon (守護程序)
  • 是 Kubernetes 的一種工作負載(Workload)資源,用來確保 「每一個 Node 上都會執行一份指定的 Pod」
  • 在叢集中,如果加入了「新的節點」,那麼叢集會自動、在這些節點中長出新的守程 Pod,刪除節點時自動移除。

常見的 DaemonSet

用途 說明 範例
📋 日誌收集 在每台機器收集 container logs Fluentd, Filebeat, Logstash
📊 監控代理 安裝監控 agent 到每個 Node Prometheus Node Exporter, Datadog Agent
🔐 安全守衛 防火牆、容器安全工具 Falco, Sysdig
🌐 網路管理 管理 CNI、設定 overlay network Cilium, Weave Net
🧪 節點健診 定時檢查 Node 健康狀況 Node Problem Detector

避免 Node 被植入 DaemonSet 的方法

  • 這個需求是因為,加入新的節點時,DaemonSet 慢慢地長出來的過程時,Pod 狀態肯定不會瞬間開好。 如果有一些監控告警機制,便有可能在這時候發出告警。 會嚇到人喔!
  • 所以使用 Taints + Tolerations 機制,並改寫 DaemonSet 來避免直接被植入,是個好方法。

    之後再補充。

Stateless 和 Stateful 的比較

Stateless

  • 前面提到,容器因為是 ephemeral 的關係,所以每次生成容器運行容器直到 關閉容器;再次用相同的參數重啟後,還是回得到一模一樣的結果。 我們可以把它當成 無狀態(Stateless)

Stateful

  • 如果要把容器拿來作為 有狀態(Stateful) 的應用,那需要克服容器中斷後資料揮發掉的情況。 他需要一個適當管理的永久儲存。
  • 在 K8s 叢集,透過 StatefulSet 來管理,因為並不是把它當作「免洗筷」來使用,所以在命名上,理當依照使用目的,按照有序的方式將 Pod 取名,方便後續維運人員操作及管理。

Pod 命名方式

資源類型 Pod 命名規則 範例 是否包含隨機字串
Deployment / ReplicaSet <deployment-name>-<replicaset-hash>-<pod-id> nginx-7d8b9c6f8b-4m2xl ✅ 是(hash + 隨機)
StatefulSet <statefulset-name>-<ordinal> mysql-0, mysql-1 ❌ 否(固定、有序)
Job <job-name>-<random-suffix> batch-job-5z2kp ✅ 是(為避免重複)
CronJob <cronjob-name>-<timestamp> backup-1689253040 ✅ 是(根據時間戳)
DaemonSet <daemonset-name>-<pod-template-hash>-<random> log-agent-fd89s ✅ 是(帶 hash)
Pod(手動建立) 自己定義 my-pod ❌ 否(自己命名)

PVC / PV

  • PVCPersistentVolumeClaim 的縮寫,用來向叢集申請儲存空間的資源,具有「請求者(Claim)」的概念,它代表 Pod 向儲存系統提出的「我要空間」的需求。
  • PV 則是 PersistentVolume,由叢集管理的永久儲存。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

存取模式

模式 說明
ReadWriteOnce (RWO) 單一 Node 可讀寫,常見於 AWS EBS 等
ReadOnlyMany (ROX) 多個 Node 可唯讀
ReadWriteMany (RWX) 多個 Node 可同時讀寫,如 NFS、CephFS

PVC 的生命週期管理

  1. PVC 先建立 → Kubernetes 尋找符合的 PV(或用 StorageClass 建)
  2. 綁定後,Pod 可以使用 volumeMounts 掛載
  3. 刪除 Pod 不會刪 PVC
  4. 如果 StorageClass 有 reclaimPolicy: Delete,刪 PVC 也會刪 PV

小結 PVC 的特色

類別 特點
抽象性 與儲存設備解耦,Pod 只認 PVC
安全性 資料與應用分離,不因重建 Pod 而遺失
可配置性 支援多種儲存後端與自動配置
彈性擴展 可搭配 StatefulSet、自動擴容(某些 CSI 支援)
適用場景 DB、ElasticSearch、持久型快取、備份空間等

StatefulSet 的特色

  • 每個 Pod 有穩定的名稱與儲存(例如 db-0, db-1)
  • 每個 Pod 有獨立 PVC
  • Pod 的啟動與停止順序(有序)
  • 但是它 不會處理資料同步、複寫、選主(leader election)、failover。 這些都必須由你部署的資料庫來負責。

結論

先確認情境,選擇合適的做法吧!

情境 建議資源
每台 Node 都要跑一個守護程式(Log、Agent) DaemonSet
系統級背景任務或 CNI 插件 DaemonSet
每個 Pod 都有獨立儲存與固定身份 StatefulSet
想確保有序升級 / 移轉 / 故障恢復 StatefulSet

上一篇
【Day 14】 Cert Manager / 懶人必學自動更新憑證
系列文
駕馭商用容器叢集,汪洋漂流術15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言