Kind 簡易說明
以下是 DaemonSet、StatefulSet、ReplicaSet 和 Deployment 的詳細比較:
| 特性 |
|---|
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)。
- 用於需要在所有 Node 上部署的服務,例如:
- 網絡插件(如 Calico, Weave)。
StatefulSet:
- 適用於需要穩定標識和存儲的有狀態應用,例如:
- 資料庫(如 MySQL, PostgreSQL)。
- 分布式系統(如 Kafka, ZooKeeper)。
ReplicaSet:
- 用於確保固定數量的無狀態 Pod 副本運行,例如:
- 部署應用的核心部分,但一般由 Deployment 自動管理。
Deployment:
- 最常用於管理無狀態應用,支持滾動更新、版本控制和自動擴展,例如:
- Web 應用(如 Nginx, Node.js)。
- 微服務應用的部署。
這樣的比較有助於釐清這些資源的功能和適用情境,幫助在實際項目中選擇合適的解決方案。
以下是重新排列的表格與每種 kind 的範例 YAML 說明:
表格
| Kind | 說明 | 用途 |
|---|---|---|
| Pod |
將外部流量映射到指定節點端口。 將集群外部訪問直接映射到內部 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 將把進入集群內部的流量路由到標籤
kindapp: 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訪問服務。


