Kind 簡易說明
以下是 DaemonSet、StatefulSet、ReplicaSet 和 Deployment 的詳細比較:
| 特性 | DaemonSet | StatefulSet | ReplicaSet | Deployment |
|---|---|---|---|---|
| 用途 | 確保每個 Node 上運行一個 Pod 副本。 | 部署有狀態的應用,每個 Pod 都有固定標識。 | 確保指定數量的 Pod 副本運行。 | 管理 Pod 和 ReplicaSet,提供滾動更新功能。 |
| 典型場景 | 日誌收集器、監控代理等需要全節點覆蓋。 | 資料庫、分佈式系統等需要穩定標識或存儲的應用。 | 確保無狀態應用的高可用性。 | 部署和管理無狀態應用,支持版本控制和更新。 |
| Pod 名稱 | 名稱可變,與 Node 關聯,無固定格式。 | 有固定名稱(如 db-0, db-1)。 |
無固定格式,與 Deployment 類似。 | 通常由 Deployment 自動生成,不直接管理 Pod。 |
| 存儲 | 不涉及持久化存儲,通常為臨時存儲。 | 每個 Pod 可關聯專屬持久存儲。 | 通常無需存儲,支持臨時存儲。 | 通常無需存儲,支持無狀態應用。 |
| 縮放(副本數) | 無法指定副本數,與 Node 數量相關。 | 支持指定副本數,且保證順序和標識穩定。 | 支持指定副本數,所有副本平等。 | 支持指定副本數,自動調整和滾動更新。 |
| 更新方式 | 滾動更新,逐一更新節點上的 Pod。 | 滾動更新,有序處理 Pod,確保依賴順序。 | 滾動更新,副本數量保持穩定。 | 滾動更新,支持回滾和藍綠部署策略。 |
| 依賴的資源 | 與 Node 關聯,不依賴其他資源。 | 通常依賴持久化存儲(如 PVC)。 | 通常不依賴其他資源。 | 自動創建和管理 ReplicaSet。 |
| 伸縮性 | 固定與 Node 數量匹配,無法手動調整。 | 可靈活擴展,並保證 Pod 的穩定標識。 | 手動指定副本數,無狀態,副本之間無區別。 | 自動管理副本數,支持水平和垂直擴展。 |
| 依賴順序 | Pod 啟動順序無依賴。 | Pod 啟動和刪除有順序,確保依賴關係。 | 無順序依賴,隨機啟動和刪除。 | 無順序依賴,通常關注應用級別的管理。 |
| 高可用性 | 和 Node 數量相關,通常與節點數一致。 | 通過固定標識和穩定的存儲保證高可用性。 | 通過多副本保證高可用性,但不管理應用版本。 | 提供高可用性並支持應用升級與版本回滾。 |
適用場景總結
-
DaemonSet:
- 用於需要在所有 Node 上部署的服務,例如:
- 日誌收集器(如 Fluentd)。
- 監控代理(如 Prometheus Node Exporter)。
- 網絡插件(如 Calico, Weave)。
- 用於需要在所有 Node 上部署的服務,例如:
-
StatefulSet:
- 適用於需要穩定標識和存儲的有狀態應用,例如:
- 資料庫(如 MySQL, PostgreSQL)。
- 分布式系統(如 Kafka, ZooKeeper)。
- 需要保持 Pod 順序的應用。
- 適用於需要穩定標識和存儲的有狀態應用,例如:
-
ReplicaSet:
- 用於確保固定數量的無狀態 Pod 副本運行,例如:
- 部署應用的核心部分,但一般由 Deployment 自動管理。
- 用於確保固定數量的無狀態 Pod 副本運行,例如:
-
Deployment:
- 最常用於管理無狀態應用,支持滾動更新、版本控制和自動擴展,例如:
- Web 應用(如 Nginx, Node.js)。
- 微服務應用的部署。
- 最常用於管理無狀態應用,支持滾動更新、版本控制和自動擴展,例如:
這樣的比較有助於釐清這些資源的功能和適用情境,幫助在實際項目中選擇合適的解決方案。
以下是重新排列的表格與每種 kind 的範例 YAML 說明:
表格
| Kind | 說明 | 用途 |
|---|---|---|
| Pod | Kubernetes 中最小的執行單位,包含容器。 | 部署單個應用程式容器。 |
| Job | 執行一次性任務,確保成功完成。 | 運行批處理任務。 |
| CronJob | 定期執行的任務。 | 排程任務(如每天備份數據)。 |
| StatefulSet | 管理有狀態的應用。 | 部署需固定標識或穩定存儲的 Pod。 |
| ReplicaSet | 確保指定數量的 Pod 始終運行。 | 通常由 Deployment 管理,用於維持 Pod 副本數。 |
| DaemonSet | 確保每個 Node 上運行一個 Pod 副本。 | 部署監控代理、日誌收集器等。 |
| Deployment | 管理 Pod 和 ReplicaSet,支持滾動更新。 | 部署無狀態應用,保持指定數量的 Pod 運行。 |
| Service | 定義 Pod 的網絡訪問規則。 | 將外部流量路由到 Pod,提供負載均衡。 |
| Ingress | 提供 HTTP/HTTPS 路由規則。 | 公開訪問服務,支持負載均衡和基於域名的路由。 |
| NodePort |
將外部流量映射到指定節點端口。 | 將集群外部訪問直接映射到內部 Service,通常為開發測試用途。 |
| ConfigMap | 存儲非機密配置數據。 | 將配置注入 Pod(環境變量或掛載文件)。 |
| Secret | 存儲機密數據(如密碼、API 密鑰)。 | 安全地將敏感信息注入 Pod。 |
| PersistentVolume (PV) | 定義持久化存儲。 | 提供存儲資源,獨立於 Pod 的生命週期。 |
| PersistentVolumeClaim (PVC) | 申請 PersistentVolume。 | Pod 使用 PVC 來請求持久存儲資源。 |
| Namespace | 將資源分隔成不同的邏輯組。 | 支持多租戶環境。 |
| Role 和 ClusterRole | 定義訪問權限。 | 管控資源的讀寫權限,Role 限於 Namespace,ClusterRole 全集群。 |
| RoleBinding 和 ClusterRoleBinding | 綁定訪問權限到用戶。 | 授權用戶或服務帳號訪問權限。 |
| HorizontalPodAutoscaler (HPA) | 根據指標自動調整 Pod 副本數量。 | 提高應用的彈性擴展能力。 |
範例 YAML 說明
1. CronJob
執行每天凌晨 12 點的數據備份:
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
args:
- /bin/sh
- -c
- "backup-script.sh"
restartPolicy: OnFailure
2. DaemonSet
在每個 Node 上部署日誌收集器:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector
spec:
selector:
matchLabels:
app: log-collector
template:
metadata:
labels:
app: log-collector
spec:
containers:
- name: log-collector
image: log-collector:latest
3. Deployment
部署一個無狀態 Web 應用,副本數為 3:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:latest
ports:
- containerPort: 80
4. Job
執行一次性任務:
apiVersion: batch/v1
kind: Job
metadata:
name: one-time-task
spec:
template:
spec:
containers:
- name: task-runner
image: busybox
args:
- /bin/sh
- -c
- "echo Hello, Kubernetes!"
restartPolicy: OnFailure
5. StatefulSet
部署有狀態的數據庫應用:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: database
spec:
serviceName: "database-service"
replicas: 3
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
spec:
containers:
- name: db
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
ports:
- containerPort: 3306
6. Pod
部署一個單一容器的應用:
apiVersion: v1
kind: Pod
metadata:
name: single-app
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- "echo Running a single pod!"
1. CronJob
執行每天凌晨 12 點的數據備份:
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
args:
- /bin/sh
- -c
- "backup-script.sh"
restartPolicy: OnFailure
2. Service
定義一個 Service,將流量路由到 Pod:
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
- 說明: 這個 Service 將把進入集群內部的流量路由到標籤
app: web-app的 Pod。
NodePort 範例
以下是一個簡單的 NodePort 配置範例,用於將集群外部的請求轉發到內部的 Pod:
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # ClusterIP 的服務端口
targetPort: 8080 # Pod 內部容器的端口
nodePort: 30007 # 節點上的固定外部端口(30000~32767 之間)
- 說明:
type: NodePort:指定此服務為 NodePort 類型。nodePort:設置固定的外部端口,供外部用戶通過<NodeIP>:30007訪問服務。- 適用場景:開發測試環境或簡單的外部訪問,不建議用於生產環境,因為其功能有限且缺乏靈活性。


