目錄
Replication Controller(RC)
概念
關鍵字段
Replica Set(RS)
概念
關鍵字段
RC 與 RS 的區別
無狀態應用管理Deployment
無狀態應用(Stateless Application)
什么是無狀態?
無狀態服務的特點
典型無狀態應用
Kubernetes Deployment 管理無狀態應用
實例:用 Deployment 部署 Nginx
有狀態應用(Stateful Application)
什么是有狀態?
有狀態服務的特點
典型有狀態應用
Kubernetes StatefulSet 管理有狀態應用
?實例:用 StatefulSet 部署 MySQL
?無狀態 vs 有狀態:關鍵區別
守護進程集DaemonSet
DaemonSet 的核心概念
什么是 DaemonSet?
DaemonSet 的工作原理
DaemonSet 的典型應用場景
日志收集
監控代理
網絡插件
存儲插件
DaemonSet 的關鍵配置
節點選擇(Node Selector)
污點容忍(Tolerations)
更新策略(Update Strategy)
資源限制
?DaemonSet vs Deployment vs StatefulSet區別
CronJob 的核心概念
什么是 CronJob?
CronJob 的工作原理
CronJob 的關鍵組成部分
Cron 表達式
Job 模板
并發策略
歷史記錄保留
CronJob 的典型應用場景
定時備份數據庫
?定期清理日志
定時發送通知?
CronJob 的常見問題與排查
任務未執行
任務并發沖突
任務失敗重試
CronJob vs Deployment vs DaemonSet區別
在 Kubernetes 中,Replication Controller(RC,復制控制器)和Replica Set(RS,復制集)是用于管理 Pod 副本數量的核心控制器,它們確保集群中始終運行指定數量的 Pod 副本,實現應用的高可用性和彈性伸縮。
Replication Controller(RC)
概念
- 核心功能:確保在任何時刻都有指定數量的 Pod 副本運行。如果實際 Pod 數量少于期望值,RC 會自動創建新的 Pod;如果多于期望值,RC 會終止多余的 Pod。
- 適用場景:適用于需要長期運行的服務(如 Web 服務器),確保服務始終可用。
- 歷史地位:RC 是 Kubernetes 早期版本中管理 Pod 副本的主要方式,現已逐漸被?Deployment?取代,但在舊版本或簡單場景中仍可能使用。
關鍵字段
replicas
:期望的 Pod 副本數量。selector
:通過標簽選擇器匹配需要管理的 Pod。template
:定義 Pod 的模板,包括容器鏡像、端口等。
實例
RC實例,確保始終運行 3 個?nginx
?Pod
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-rc
spec:replicas: 3selector:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
操作步驟:
創建 RC:kubectl apply -f rc.yaml
查看 RC 狀態:kubectl get rc
查看 Pod:kubectl get pods --selector=app=nginx
驗證高可用性:
- 手動刪除一個 Pod:
kubectl delete pod <pod-name>
- 觀察 RC 是否自動創建新的 Pod 以維持 3 個副本。
Replica Set(RS)
概念
- 核心功能:與 RC 類似,但支持更靈活的標簽選擇器(基于集合的匹配規則),是 RC 的升級版。
- 適用場景:通常與?Deployment?配合使用,實現 Pod 的滾動更新和回滾。
- 現狀:RS 是 Kubernetes 推薦的管理 Pod 副本的方式,但直接使用 RS 的場景較少,更多是通過 Deployment 間接使用。
關鍵字段
replicas
:期望的 Pod 副本數量。selector
:支持基于集合的標簽選擇器(如?matchLabels
?或?matchExpressions
)。template
:定義 Pod 的模板。
實例
?RS實例,確保始終運行 3 個?nginx
?Pod
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx-rs
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
操作步驟:
創建 RS:kubectl apply -f rs.yaml
查看 RS 狀態:kubectl get rs
查看 Pod:kubectl get pods --selector=app=nginx
驗證高可用性:
- 手動刪除一個 Pod:
kubectl delete pod <pod-name>
- 觀察 RS 是否自動創建新的 Pod 以維持 3 個副本。
RC 與 RS 的區別
特性 | Replication Controller(RC) | Replica Set(RS) |
---|---|---|
標簽選擇器 | 基于等式的簡單選擇器(如?app=nginx ) | 支持基于集合的選擇器(如?matchLabels 、matchExpressions ) |
靈活性 | 較低 | 更高,支持更復雜的標簽匹配規則 |
推薦使用場景 | 舊版本或簡單場景 | 推薦與 Deployment 配合使用 |
API 版本 | v1 | apps/v1 |
無狀態應用管理Deployment
在 Kubernetes 中,無狀態應用和有狀態應用的管理方式不同,Deployment?是管理無狀態應用的核心控制器,而?StatefulSet?則用于有狀態應用。
無狀態應用(Stateless Application)
什么是無狀態?
無狀態應用是指不依賴本地存儲或持久化數據的應用,每個請求的處理不依賴于之前的請求或會話狀態。所有實例(Pod)都是完全相同的,可以隨時被替換或擴展。
無狀態服務的特點
- 可擴展性:可以隨意增加或減少實例數量,不影響服務邏輯。
- 高可用性:單個實例崩潰不會影響整體服務,其他實例可以繼續處理請求。
- 無持久化需求:數據通常存儲在外部數據庫(如 MySQL、Redis)或對象存儲(如 S3)中,而非本地磁盤。
- 無順序依賴:實例之間沒有固定的啟動順序或依賴關系。
- 水平擴展簡單:通過增加副本(Replica)即可提升處理能力。
典型無狀態應用
- Web 服務器(如 Nginx、Apache)
- API 服務(如 RESTful 服務)
- 微服務(如用戶認證服務、訂單服務)
- 計算任務(如批處理、數據處理)
Kubernetes Deployment 管理無狀態應用
Deployment?是 Kubernetes 中管理無狀態應用的標準方式,它通過?ReplicaSet?控制 Pod 副本數量,支持滾動更新、回滾和自動擴縮容。
實例:用 Deployment 部署 Nginx
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3 # 3 個副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
操作步驟:
創建 Deployment:kubectl apply -f nginx-deployment.yaml
查看 Pod:kubectl get pods -l app=nginx
擴展副本:kubectl scale deployment nginx-deployment --replicas=5
滾動更新:修改鏡像版本后執行?kubectl rollout restart deployment/nginx-deployment
?
有狀態應用(Stateful Application)
什么是有狀態?
有狀態應用是指依賴本地存儲或持久化數據的應用,每個實例(Pod)可能有唯一的身份標識,并且數據、狀態或配置不能隨意丟失或替換。
有狀態服務的特點
- 持久化存儲:數據通常存儲在本地磁盤(如 PV/PVC),且需要保證數據不丟失。
- 固定身份標識:每個實例有唯一的名稱或 ID(如?
pod-0
、pod-1
),不能隨意替換。 - 啟動順序依賴:實例之間可能有固定的啟動順序(如主從架構)。
- 水平擴展復雜:不能簡單增加副本,需要考慮數據同步和一致性。
- 高可用性挑戰:單個實例崩潰可能導致數據不一致或服務中斷。
典型有狀態應用
- 數據庫(如 MySQL、PostgreSQL、MongoDB)
- 分布式存儲(如 Ceph、GlusterFS)
- 消息隊列(如 Kafka、RabbitMQ)
- 分布式計算框架(如 Spark、Flink)
Kubernetes StatefulSet 管理有狀態應用
StatefulSet?是 Kubernetes 中管理有狀態應用的核心控制器,它提供以下功能:
- 穩定的網絡標識:每個 Pod 有唯一的 DNS 名稱(如?
pod-0.nginx.default.svc.cluster.local
)。 - 持久化存儲:通過?PVC(PersistentVolumeClaim)?綁定存儲卷,確保數據不丟失。
- 有序部署和擴展:按順序啟動或終止 Pod(如?
pod-0
?→?pod-1
?→?pod-2
)。 - 有序滾動更新:支持分批更新,確保數據一致性。
?實例:用 StatefulSet 部署 MySQL
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql" # 用于 DNS 發現replicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalue: "password"ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumeClaimTemplates: # 自動創建 PVC- metadata:name: mysql-dataspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 10Gi
操作步驟:
創建 StatefulSet:kubectl apply -f mysql-statefulset.yaml
查看 Pod:kubectl get pods -l app=mysql
(會看到?mysql-0
、mysql-1
、mysql-2
)
查看 PVC:kubectl get pvc
(會自動創建 3 個 PVC)
測試數據持久化:刪除 Pod 后,數據仍然存在(因為 PVC 綁定到 PV)。
?無狀態 vs 有狀態:關鍵區別
數據存儲 | 數據存儲在外部(數據庫、對象存儲) | 數據存儲在本地(PV/PVC) |
實例標識 | 所有實例相同,可隨意替換 | 每個實例有唯一標識(如?pod-0 ) |
啟動順序 | 無順序依賴 | 可能有固定啟動順序(如主從) |
擴展方式 | 直接增加副本 | 需要考慮數據同步和一致性 |
Kubernetes 控制器 | Deployment | StatefulSet |
典型用例 | Web 服務、API 服務 | 數據庫、分布式存儲、消息隊列 |
守護進程集DaemonSet
DaemonSet?是 Kubernetes 中的一種核心控制器,用于在集群中的每個節點(Node)上運行一個指定的 Pod 副本(或特定節點上運行)。它確保所有(或部分)節點都運行一個特定的守護進程(如日志收集、監控代理、網絡插件等),通常用于管理節點級別的服務
DaemonSet 的核心概念
什么是 DaemonSet?
- 定義:DaemonSet 是一種 Kubernetes 工作負載資源,用于在集群中的每個節點(或符合條件的節點)上部署并運行一個 Pod 副本。
- 用途:運行節點級別的守護進程,例如:
- 日志收集(如 Fluentd、Filebeat)
- 監控代理(如 Prometheus Node Exporter、Datadog Agent)
- 網絡插件(如 Calico、Flannel、Cilium)
- 存儲插件(如 Ceph、NFS 客戶端)
- 設備管理(如 GPU 驅動、特殊硬件代理)
DaemonSet 的工作原理
- 自動部署:當新節點加入集群時,DaemonSet 會自動在該節點上創建對應的 Pod。
- 自動清理:當節點被移除時,DaemonSet 會自動刪除該節點上的 Pod。
- 節點選擇:可以通過?
nodeSelector
?或?tolerations
?控制 DaemonSet 在哪些節點上運行(例如,僅在特定標簽的節點上運行)。 - 更新策略:支持滾動更新(
RollingUpdate
)或靜態更新(OnDelete
)。
DaemonSet 的典型應用場景
日志收集
- 需求:每個節點上的容器日志需要集中收集到日志系統(如 ELK、Loki)。
- 實現:使用 DaemonSet 部署 Fluentd 或 Filebeat,確保每個節點都有一個日志收集器。
- 實例:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd
spec:selector:matchLabels:name: fluentdtemplate:metadata:labels:name: fluentdspec:containers:- name: fluentdimage: fluent/fluentd:latestvolumeMounts:- name: varlogmountPath: /var/logvolumes:- name: varloghostPath:path: /var/log # 掛載節點本地目錄
監控代理
- 需求:收集每個節點的資源指標(CPU、內存、磁盤等)。
- 實現:使用 DaemonSet 部署 Prometheus Node Exporter 或 Datadog Agent。
- 示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: node-exporter
spec:selector:matchLabels:app: node-exportertemplate:metadata:labels:app: node-exporterspec:containers:- name: node-exporterimage: prom/node-exporter:latestports:- containerPort: 9100
網絡插件
- 需求:為每個節點提供網絡功能(如 CNI 插件)。
- 實現:Calico、Flannel、Cilium 等網絡插件通常以 DaemonSet 形式部署。
- 示例(Calico):
apiVersion: apps/v1
kind: DaemonSet
metadata:name: calico-node
spec:selector:matchLabels:k8s-app: calico-nodetemplate:metadata:labels:k8s-app: calico-nodespec:containers:- name: calico-nodeimage: calico/node:latestenv:- name: CALICO_NETWORKING_BACKENDvalue: "bird"
存儲插件
- 需求:為節點提供本地存儲或分布式存儲訪問能力。
- 實現:Ceph CSI、NFS Client Provisioner 等存儲插件通常以 DaemonSet 形式部署。
- 示例(NFS Client):
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nfs-client
spec:selector:matchLabels:app: nfs-clienttemplate:metadata:labels:app: nfs-clientspec:containers:- name: nfs-clientimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesvolumes:- name: nfs-client-rootnfs:server: nfs-server.example.compath: /exports
DaemonSet 的關鍵配置
節點選擇(Node Selector)
- 通過?
nodeSelector
?指定 DaemonSet 在哪些節點上運行
spec:template:spec:nodeSelector:disktype: ssd # 僅在標簽為 disktype=ssd 的節點上運行
污點容忍(Tolerations)
- 如果節點有污點(Taint),DaemonSet 需要配置?
tolerations
?才能運行:
spec:template:spec:tolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule" # 允許在 Master 節點上運行
更新策略(Update Strategy)
- RollingUpdate(默認):自動滾動更新 Pod(逐個節點更新)。
- OnDelete:僅在手動刪除 Pod 后更新(適用于需要嚴格控制更新的場景)。
spec:updateStrategy:type: RollingUpdate # 或 OnDelete
資源限制
- 為 DaemonSet 的 Pod 設置 CPU/內存限制:
spec:template:spec:containers:- name: fluentdimage: fluent/fluentd:latestresources:limits:cpu: "500m"memory: "512Mi"
?DaemonSet vs Deployment vs StatefulSet區別
特性 | DaemonSet | Deployment | StatefulSet |
---|---|---|---|
部署目標 | 每個節點運行一個 Pod | 任意數量的 Pod(可擴展) | 每個 Pod 有唯一標識和持久化存儲 |
典型用例 | 日志收集、監控代理、網絡插件 | Web 服務、API 服務 | 數據庫、分布式存儲、消息隊列 |
節點綁定 | 強制綁定到節點 | 不綁定節點 | 不綁定節點(除非配合 PVC) |
更新策略 | RollingUpdate 或 OnDelete | RollingUpdate 或 Recreate | RollingUpdate(有序更新) |
擴展方式 | 不能直接擴展(每個節點一個) | 可隨意擴展副本數 | 可擴展,但需考慮數據一致性 |
- DaemonSet 適用于:需要在每個節點上運行一個守護進程的場景(如日志、監控、網絡、存儲)。
- 與 Deployment 的區別:DaemonSet 強制在每個節點運行一個 Pod,而 Deployment 可以任意擴展副本數。
- 與 StatefulSet 的區別:DaemonSet 不關心 Pod 的唯一標識或持久化存儲,而 StatefulSet 會為每個 Pod 分配唯一名稱并綁定 PVC。
CronJob 的核心概念
CronJob?是 Kubernetes 中的一種控制器資源,用于在預定的時間或周期性地運行任務(如備份、數據清理、日志輪轉等)。它基于 Unix/Linux 的?cron
?定時任務機制,但擴展到了 Kubernetes 集群環境中,支持容器化任務的調度。
什么是 CronJob?
- 定義:CronJob 是 Kubernetes 中用于管理定時任務的資源,它會在指定的時間或周期性觸發?Job(一次性任務),進而運行一個或多個 Pod。
- 用途:
- 定時備份數據庫(如每天凌晨 3 點執行)。
- 定期清理臨時文件或日志。
- 定時發送通知或報告。
- 執行批處理任務(如數據聚合、ETL)。
CronJob 的工作原理
Cron 表達式:定義任務的執行時間(如?0 3 * * *
?表示每天凌晨 3 點)。
Job 創建:CronJob 根據 Cron 表達式創建 Job,Job 再創建 Pod 執行任務。
歷史記錄:默認保留最近 3 次成功的 Job(可配置)。
并發控制:支持禁止并發執行(避免上次任務未完成時新任務啟動)。
CronJob 的關鍵組成部分
Cron 表達式
- 格式:
分鐘 小時 日 月 星期
(共 5 個字段,用空格分隔)。 - 示例:
0 3 * * *
:每天凌晨 3 點執行。*/15 * * * *
:每 15 分鐘執行一次。0 0 * * 0
:每周日午夜執行。0 2 1 * *
:每月 1 日凌晨 2 點執行。
- 時區支持:Kubernetes 1.25+ 支持通過?
spec.timeZone
?指定時區(如?Asia/Shanghai
)。
Job 模板
- CronJob 通過?
spec.jobTemplate
?定義要運行的 Job 配置,包括:- Pod 模板(鏡像、命令、環境變量等)。
- 重啟策略(默認?
Never
,即任務失敗不重試)。 - 資源限制(CPU/內存)。
并發策略
- Allow(默認):允許并發執行(上次任務未完成時新任務仍會啟動)。
- Forbid:禁止并發執行(上次任務未完成時跳過新任務)。
- Replace:替換當前任務(取消上次任務并啟動新任務)。
歷史記錄保留
successfulJobsHistoryLimit
:保留成功的 Job 數量(默認 3)。failedJobsHistoryLimit
:保留失敗的 Job 數量(默認 1)。
CronJob 的典型應用場景
定時備份數據庫
apiVersion: batch/v1
kind: CronJob
metadata:name: mysql-backup
spec:schedule: "0 3 * * *" # 每天凌晨 3 點jobTemplate:spec:template:spec:containers:- name: backupimage: mysql:5.7command: ["/bin/sh", "-c"]args: ["mysqldump -u root -ppassword mydb > /backup/mydb-$(date +\\%Y\\%m\\%d).sql"]volumeMounts:- name: backup-storagemountPath: /backupvolumes:- name: backup-storagepersistentVolumeClaim:claimName: backup-pvc # 綁定到 PVCrestartPolicy: Never # 任務失敗不重試
?定期清理日志
?
apiVersion: batch/v1
kind: CronJob
metadata:name: clean-logs
spec:schedule: "0 0 * * *" # 每天午夜jobTemplate:spec:template:spec:containers:- name: cleanerimage: busyboxcommand: ["/bin/sh", "-c"]args: ["find /var/log -name '*.log' -mtime +7 -delete"]volumeMounts:- name: varlogmountPath: /var/logvolumes:- name: varloghostPath:path: /var/log # 掛載節點本地日志目錄restartPolicy: Never
定時發送通知?
apiVersion: batch/v1
kind: CronJob
metadata:name: send-report
spec:schedule: "0 9 * * 1" # 每周一上午 9 點jobTemplate:spec:template:spec:containers:- name: senderimage: curlimages/curlcommand: ["/bin/sh", "-c"]args: ["curl -X POST -H 'Content-Type: application/json' -d '{\"message\":\"Weekly report\"}' https://api.example.com/notify"]restartPolicy: Never
CronJob 的常見問題與排查
任務未執行
- 檢查 Cron 表達式:確認時間格式正確(如?
0 3 * * *
?不是?3 0 * * *
)。 - 檢查時區:Kubernetes 1.25+ 支持?
spec.timeZone
,舊版本使用 UTC 時間。 - 檢查 Job 歷史:
kubectl get jobs --sort-by='.metadata.creationTimestamp'
。
任務并發沖突
- 如果任務執行時間超過間隔周期,需設置?
concurrencyPolicy: Forbid
?或?Replace
。
任務失敗重試
- CronJob 默認不重試失敗任務(
restartPolicy: Never
),如需重試需在 Job 模板中配置:
backoffLimit: 3 # 失敗后重試 3 次
查看任務日志
# 獲取最近一次 Job 的名稱
JOB_NAME=$(kubectl get jobs -l cronjob-name=hourly-task --sort-by='.metadata.creationTimestamp' -o jsonpath='{.items[-1].metadata.name}')# 查看 Pod 日志
kubectl logs -l job-name=$JOB_NAME
CronJob vs Deployment vs DaemonSet區別
特性 | CronJob | Deployment | DaemonSet |
---|---|---|---|
用途 | 定時任務(如備份、清理) | 長運行服務(如 Web 服務) | 節點級守護進程(如日志收集) |
執行方式 | 周期性創建 Job → Pod | 直接運行 Pod | 每個節點運行一個 Pod |
生命周期 | 任務完成后 Pod 終止 | Pod 持續運行 | Pod 持續運行 |
并發控制 | 支持禁止并發(Forbid ) | 無并發控制(可擴展副本) | 無并發控制(每個節點一個) |
典型用例 | 數據庫備份、日志輪轉 | API 服務、微服務 | Fluentd、Node Exporter |
- CronJob 適用于:需要在固定時間或周期性執行的任務(如備份、清理、通知)。
- 與 Deployment 的區別:CronJob 是臨時任務,而 Deployment 是長期運行的服務。
- 與 DaemonSet 的區別:CronJob 是定時任務,而 DaemonSet 是節點級守護進程。
?
?
?
?
?