目錄
一、Replication Controller&ReplicaSet
?一、Replication Controller (RC)?
?原理?
?特性?
?意義?
?示例與逐行解釋?
?二、ReplicaSet (RS)?
?原理?
?特性?
?意義?
?示例與逐行解釋?
?三、RC 與 RS 的對比?
?四、總結?
二、DeamonSet
?一、核心原理?
?二、顯著特性?
?三、核心意義與應用場景?
?四、與其他控制器的對比?
?總結?
三、CronJob
一、Replication Controller&ReplicaSet
?一、Replication Controller (RC)?
?原理?
-
?核心功能?:
- 確保指定數量的 Pod 副本?始終運行?。若 Pod 因故障或節點問題終止,RC 會自動創建新副本。
- 通過 ?標簽選擇器(Label Selector)? 匹配并管理 Pod。
-
?工作流程?:
- ?監聽機制?:RC 持續監控集群中與其標簽匹配的 Pod 數量。
- ?擴縮容?:當實際 Pod 數量與?
replicas
?字段不符時,RC 會通過創建或刪除 Pod 來修正差異。
?特性?
- ?簡單擴縮容?:通過修改?
replicas
?值直接調整副本數。 - ?滾動更新支持?:需配合手動操作(如逐步修改 RC 配置)實現。
- ?局限性?:
- 標簽選擇器僅支持?等式匹配?(如?
app=nginx
),無法實現復雜條件(如集合匹配)。 - 已被更現代的 ?ReplicaSet? 取代(但仍兼容)。
- 標簽選擇器僅支持?等式匹配?(如?
?意義?
- 為 Kubernetes 早期版本提供基礎的 Pod 高可用保障,是?無狀態服務?的核心管理工具。
?示例與逐行解釋?
rc-example.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-rc
spec:replicas: 3selector:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
?逐行解釋?:
apiVersion: v1
:使用 Kubernetes 核心 API 版本。kind: ReplicationController
:聲明資源類型為 RC。replicas: 3
:指定維持 3 個 Pod 副本。selector: app: nginx
:通過標簽?app=nginx
?選擇管理的 Pod。template
:定義 Pod 模板,所有副本均按此配置創建。containers
:指定運行 Nginx 容器,監聽 80 端口。
?二、ReplicaSet (RS)?
?原理?
-
?核心改進?:
- 繼承 RC 功能,但引入更強大的 ?集合型標簽選擇器?(支持?
matchLabels
?和?matchExpressions
)。 - 通常由 ?Deployment? 管理,實現聲明式更新和版本控制。
- 繼承 RC 功能,但引入更強大的 ?集合型標簽選擇器?(支持?
-
?工作流程?:
- 與 RC 類似,但支持更靈活的 Pod 選擇邏輯(如?
environment in (prod, staging)
)。
- 與 RC 類似,但支持更靈活的 Pod 選擇邏輯(如?
?特性?
- ?增強的選擇器?:支持多條件匹配(如?
AND
?邏輯)。 - ?與 Deployment 集成?:作為 Deployment 的底層組件,負責 Pod 副本管理,而 Deployment 處理滾動更新和回滾。
- ?資源版本?:屬于?
apps/v1
?API 組,是 RC 的替代品。
?意義?
- 為現代 Kubernetes 提供更精細的 Pod 管理能力,是 ?Deployment 的基石?,支撐無狀態應用的自動化運維。
?示例與逐行解釋?
rs-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx-rs
spec:replicas: 3selector:matchLabels:app: nginxmatchExpressions:- {key: environment, operator: In, values: [prod]}template:metadata:labels:app: nginxenvironment: prodspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
?逐行解釋?:
apiVersion: apps/v1
:使用?apps
?組的 API 版本。kind: ReplicaSet
:聲明資源類型為 RS。selector.matchLabels
:必須匹配?app=nginx
。selector.matchExpressions
:額外要求 Pod 的?environment
?標簽值為?prod
。template
:定義 Pod 模板,包含復合標簽(app
?和?environment
)。
?三、RC 與 RS 的對比?
?特性? | Replication Controller | ReplicaSet |
---|---|---|
?API 版本? | v1 (核心組) | apps/v1 (擴展組) |
?標簽選擇器? | 僅等式匹配(key=value ) | 支持集合匹配(In ,?Exists ) |
?推薦使用場景? | 舊版本兼容 | 現代集群(通常由 Deployment 管理) |
?更新策略? | 需手動操作 | 與 Deployment 協作支持滾動更新 |
?四、總結?
- ?Replication Controller?:Kubernetes 早期用于保障 Pod 副本數的基礎控制器,功能簡單但已過時。
- ?ReplicaSet?:RC 的升級版,提供更強大的標簽選擇能力,是 ?Deployment 的底層核心?,支撐現代無狀態應用的自動化管理。
- ?最佳實踐?:直接使用 ?Deployment? 管理 RS,而非手動創建 RS 或 RC。
二、DeamonSet
DaemonSet 是 Kubernetes 中的核心控制器之一,用于確保集群中的每個節點(或符合特定條件的節點)上都運行一個?相同且唯一?的 Pod 副本。以下是其原理、特性及意義的詳細解析:
?一、核心原理?
-
?節點級守護?
- 當創建 DaemonSet 時,它會?自動為每個符合條件的節點創建并維護一個 Pod?。新節點加入集群后,DaemonSet 會立即在新節點上部署 Pod;節點被移除時,該節點上的 Pod 會被自動回收。
- 調度機制:通過 ?NodeAffinity? 和 Kubernetes 調度器協同工作(Kubernetes 1.12 后),確保 Pod 綁定到目標節點。
-
?污點容忍(Tolerations)?
- 支持為 Pod 配置容忍度,使其能在帶有污點(Taints)的特殊節點(如 Master 節點、GPU 節點)上運行。
- 示例:允許在 Master 節點運行?
kube-proxy
:tolerations - key: node-role.kubernetes.io/mastereffect: NoSchedule
?二、顯著特性?
-
?節點全覆蓋與動態伸縮?
- 默認覆蓋所有節點,也可通過 ?
nodeSelector
?或?nodeAffinity
? 限定目標節點(如僅 GPU 節點)。 - 集群擴容時自動在新節點部署 Pod,縮容時自動清理。
- 默認覆蓋所有節點,也可通過 ?
-
?更新策略?
- ?滾動更新(RollingUpdate)?:逐步替換舊 Pod(可設置?
maxUnavailable
?控制并發數),減少服務中斷。 - ?按需更新(OnDelete)?:手動刪除舊 Pod 后才創建新版本,適用于需嚴格控制的場景(如網絡插件)。
- ?滾動更新(RollingUpdate)?:逐步替換舊 Pod(可設置?
-
?資源與健康管理?
- 支持為 Pod 配置資源限制(CPU/內存)及優先級,防止資源耗盡。
- 可通過 ?Liveness/Readiness 探針? 監控 Pod 健康狀態,實現自動重啟。
?三、核心意義與應用場景?
?意義?:
- ?標準化節點服務?:統一管理集群中所有節點的基礎設施組件,避免手動部署的復雜性。
- ?高可用與自愈?:節點故障時自動遷移 Pod,守護進程崩潰時自動重啟。
- ?資源高效利用?:按需部署,避免為臨時任務預留專用資源。
?典型應用場景?:
?場景? | ?組件示例? | ?作用? |
---|---|---|
?日志收集? | Fluentd、Filebeat | 從每個節點的?/var/log ?采集日志 |
?監控代理? | Prometheus Node Exporter、cAdvisor | 采集節點級 CPU/內存等指標 |
?網絡插件? | Calico、Cilium、kube-proxy | 為節點提供網絡策略及服務代理 |
?存儲服務? | Ceph、GlusterFS 客戶端 | 節點級分布式存儲掛載 |
?安全運維? | Falco(安全審計)、運維Agent | 實時檢測異常或執行批量維護任務 |
?四、與其他控制器的對比?
?特性? | DaemonSet | Deployment/ReplicaSet |
---|---|---|
?調度目標? | 每個節點運行 ?1 個 Pod? | 集群內運行 ?指定數量的 Pod? |
?擴縮容觸發? | 節點變化時自動調整 | 手動調整副本數 |
?適用場景? | 節點級基礎服務(日志/網絡) | 無狀態應用(Web 服務) |
?總結?
DaemonSet 是 Kubernetes 管理?節點級守護進程?的核心工具,通過自動化部署、動態擴縮容和靈活的策略配置,為集群提供日志收集、網絡代理、監控等基礎設施能力。其設計確保了服務的全局覆蓋與高可用性,是生產環境中不可或缺的組件。
三、CronJob
簡單來說,CronJob 是 Kubernetes 中用于在特定時間點或按計劃周期性地運行 Job 的對象。? 它借鑒了類 Unix 系統(如 Linux)中?cron
?守護進程的概念,將定時任務的管理帶入了容器化和集群化的世界。
?核心原理:?
-
?聲明式配置:?
- 用戶通過 YAML 清單文件定義一個?
CronJob
?資源。 - 核心字段包括:
schedule
: 使用 ?Cron 表達式? 定義任務運行的時間表(何時運行)。格式為?分 時 日 月 周
(例如?"0 * * * *"
?表示每小時的第 0 分鐘運行)。jobTemplate
: 定義要運行的?Job
?模板。這個?Job
?描述了真正要執行的任務(在 Pod 中運行的容器命令或腳本)。concurrencyPolicy
: 控制當前正在運行的 Job 尚未完成時,新計劃的 Job 是否允許啟動 (Allow
,?Forbid
,?Replace
)。解決并發沖突。startingDeadlineSeconds
: Job 必須在預定時間后多少秒內開始運行,否則被標記為失敗(考慮調度延遲)。successfulJobsHistoryLimit
?/?failedJobsHistoryLimit
: 保留多少已完成(成功/失敗)的 Job 記錄歷史(便于查看日志和排錯)。suspend
: 布爾值,用于暫停 (true
) 或恢復 (false
) CronJob 的調度。
- 用戶通過 YAML 清單文件定義一個?
-
?Controller Manager 的 CronJob Controller:?
- Kubernetes 控制平面的?
kube-controller-manager
?組件內運行著一個專門的?CronJob Controller
。 - ?核心守護循環:?
- ?監視:? 持續監視集群中所有的 CronJob 對象。
- ?計算下一次運行時間:? 對于每個活躍的 CronJob(
suspend: false
),Controller 根據其?schedule
?字段計算在當前時間之后下一次應該運行的具體時間點。 - ?觸發 Job 創建:? 當系統時間到達計劃的下一次運行時間點時:
- Controller 檢查?
concurrencyPolicy
:Allow
?(默認):總是創建新的 Job。Forbid
:如果當前有任何該 CronJob 創建的 Job 還在運行(狀態?Running
),則跳過本次計劃,等到下一次計劃時間再檢查。Replace
:如果當前有舊的 Job 還在運行,則終止它(優雅終止期后強制終止),然后立即創建一個新的 Job。
- 檢查?
startingDeadlineSeconds
:如果當前時間已經超過了計劃時間加上這個閾值,則 Controller 認為這次運行“遲到太多”,不會創建 Job,并將這次錯過的運行記錄為事件(可通過?kubectl describe cronjob <name>
?查看)。 - ?創建 Job 對象:? 如果滿足策略和時間要求,Controller ?創建? 一個新的?
Job
?對象 (metadata.generateName
?基于 CronJob 名稱生成唯一 Job 名)。
- Controller 檢查?
- ?Job 的執行:? 一旦 Job 對象被創建,Kubernetes 的 ?Job Controller? 就會接管:
- 根據 Job 的?
template
?創建一個或多個 Pod。 - 監控 Pod 的執行狀態(成功完成、失敗)。
- 根據 Job 的配置(如?
completions
,?parallelism
)管理 Pod 的重試和并行執行。
- 根據 Job 的?
- ?歷史記錄管理:? CronJob Controller 會根據?
successfulJobsHistoryLimit
?和?failedJobsHistoryLimit
?的設置,自動清理舊的、已完成(成功或失敗)的 Job 對象及其關聯的 Pod(但 Pod 的日志通常需要獨立收集)。
- Kubernetes 控制平面的?
?關鍵特性:?
- ?基于 Cron 表達式的精確調度:? 提供強大的時間控制能力,滿足分鐘、小時、天、月、周級別的各種定時需求。
- ?Job 模板化:? 將“何時運行”(CronJob)和“運行什么”(Job)清晰分離。
jobTemplate
?定義了每次計劃執行時的具體任務邏輯。 - ?并發控制 (
concurrencyPolicy
):? 關鍵特性,防止因任務執行時間過長導致多個實例意外并行運行,引發資源爭用或邏輯沖突。Forbid
?和?Replace
?策略提供了靈活性。 - ?容錯與重試:?
- ?Job 級別的重試:? 由 Job Controller 負責。如果 Pod 運行失敗(退出碼非零),Job Controller 會根據 Job Spec 中配置的?
backoffLimit
?自動創建新的 Pod 重試任務。 - ?錯過的調度 (
startingDeadlineSeconds
):? 處理短暫的調度器繁忙或控制平面問題導致的延遲,避免大量積壓的 Job 同時啟動沖擊系統。
- ?Job 級別的重試:? 由 Job Controller 負責。如果 Pod 運行失敗(退出碼非零),Job Controller 會根據 Job Spec 中配置的?
- ?歷史記錄保留:? 保留一定數量的成功/失敗 Job 記錄,便于審計、日志查看和故障排查 (
kubectl get jobs
?/?kubectl logs <pod-name>
)。 - ?暫停與恢復 (
suspend
):? 無需刪除 CronJob 即可臨時停止其調度,方便維護或調試。 - ?資源管理與隔離:? 每個 Job/Pod 可以定義自己的資源請求 (
requests
) 和限制 (limits
),確保任務運行時獲得所需資源且不會耗盡節點資源。多個 CronJob 的任務在集群資源池中共享與隔離。 - ?聲明式 API:? 通過清單文件描述期望狀態,Kubernetes 負責使其達成并維持。
?核心意義與價值:?
- ?自動化運維任務:?
- ?數據庫備份/恢復:? 定時備份關鍵數據庫。
- ?日志輪轉/清理:? 清理舊日志文件,釋放存儲空間。
- ?證書輪換:? 自動更新服務證書。
- ?集群維護:? 定期運行集群健康檢查、資源報告生成。
- ?緩存預熱/刷新:? 在訪問高峰前預熱緩存。
- ?周期性數據處理與分析:?
- ?ETL 作業:? 按計劃(如每天凌晨)從源系統抽取數據、轉換、加載到數據倉庫。
- ?報告生成:? 定時生成業務或系統性能報告。
- ?機器學習模型訓練/再訓練:? 按計劃更新模型。
- ?微服務架構中的定時觸發:?
- 觸發批處理服務。
- 發送周期性通知或提醒。
- 執行定期的數據同步任務。
- ?提升可靠性與可管理性:?
- ?標準化:? 將原來分散在各服務器上的 crontab 任務集中到 Kubernetes 統一管理。
- ?彈性與自愈:? 任務運行在 Pod 中,Pod 故障時由 Job Controller 自動重啟(根據?
backoffLimit
)。節點故障時,任務會被調度到其他健康節點運行。 - ?資源利用率:? 集群資源池化,避免為偶爾運行的定時任務預留專用服務器。
- ?監控與日志:? 與 Kubernetes 的監控(Prometheus, Metrics Server)和日志(EFK, Loki)生態系統無縫集成,方便跟蹤任務執行狀態、性能和日志。
- ?版本控制與審計:? CronJob 定義作為 YAML 文件可納入 Git 進行版本控制,變更可追蹤。
- ?云原生實踐:? CronJob 是 Kubernetes 原生提供的定時任務解決方案,避免了在容器內運行 crond 或使用外部調度系統的復雜性,符合云原生理念。
?與傳統?cron
?的主要區別:?
特性 | 傳統?cron ?(單機) | Kubernetes CronJob (集群) |
---|---|---|
?運行環境? | 單個服務器/虛擬機 | Kubernetes 集群 (分布式) |
?調度單位? | 直接執行命令/腳本 | 創建 Job 對象,Job 再創建 Pod 執行容器 |
?資源管理? | 受限于單機資源 | 集群資源池,可調度到任意節點,資源隔離 |
?高可用/容錯? | 依賴服務器高可用,任務本身無自動重啟/轉移 | Pod 故障自動重啟 (Job),節點故障自動遷移任務 |
?并發控制? | 通常較弱,依賴腳本自身邏輯 (flock ?等) | 內置強大并發策略 (Allow ,?Forbid ,?Replace ) |
?聲明式管理? | 配置文件管理 (如?/etc/crontab ) | Kubernetes YAML 清單,API 驅動 |
?監控/日志? | 分散,需自行收集整合 | 與 K8s 監控/日志生態 (Prometheus, EFK) 集成 |
?歷史記錄? | 通常依賴日志文件 | 自動保留 Job 歷史記錄 |
?暫停/恢復? | 需注釋或移動 cron 條目 | 簡單設置?suspend: true/false |
?總結:?
Kubernetes 的 ?CronJob? 是一個強大的原生對象,它將經典的定時任務概念完美地融入了容器化、集群化的云原生環境。其核心原理是通過 Controller 監聽 CronJob 定義,基于 Cron 表達式計算計劃時間,并在滿足條件(并發策略、截止時間)時創建 Job 對象來執行具體任務。它的特性(精確調度、并發控制、容錯重試、歷史記錄、資源管理)和意義(自動化運維、數據處理、標準化、提升可靠性彈性、云原生集成)使其成為在 Kubernetes 上運行周期性、批處理作業的首選和標準方式。理解 CronJob 對于有效管理和自動化 Kubernetes 集群中的任務至關重要。
基本腳本?
apiVersion: batch/v1
kind: CronJob
metadata:name: log-cleanernamespace: default
spec:schedule: "0 * * * *" # 每小時的第0分鐘運行concurrencyPolicy: Forbid # 禁止并發執行startingDeadlineSeconds: 300 # 允許延遲5分鐘successfulJobsHistoryLimit: 3 # 保留3個成功記錄failedJobsHistoryLimit: 1 # 保留1個失敗記錄jobTemplate:spec:template:spec:containers:- name: log-cleanerimage: alpine:latestcommand: ["/bin/sh", "-c"]args: - echo "開始清理日志...";find /var/log/app -name "*.log" -mtime +7 -delete;echo "清理完成"volumeMounts:- name: log-volumemountPath: /var/log/apprestartPolicy: OnFailurevolumes:- name: log-volumehostPath:path: /var/log/app
逐行解釋:
-
apiVersion: batch/v1
?- 指定使用的Kubernetes API版本 -
kind: CronJob
?- 聲明這是一個CronJob資源 -
metadata
部分:name: log-cleaner
?- 給這個CronJob命名namespace: default
?- 指定部署到default命名空間
-
spec
部分(CronJob核心配置):schedule: "0 * * * *"
?- cron表達式,表示每小時的第0分鐘運行concurrencyPolicy: Forbid
?- 如果前一個任務還在運行,跳過本次執行startingDeadlineSeconds: 300
?- 允許任務延遲最多5分鐘啟動- 歷史記錄保留設置:成功3個,失敗1個
-
jobTemplate
部分(定義實際運行的Job):spec.template
?- Pod模板定義containers
配置:- 使用alpine鏡像
command
和args
組合相當于執行一個shell腳本- 腳本內容:查找并刪除/var/log/app目錄下7天前的.log文件
-
volumeMounts
和volumes
:- 將宿主機的/var/log/app目錄掛載到容器內
- 這樣容器內操作會直接影響宿主機上的日志文件
這個示例展示了完整的CronJob配置,包含了定時調度、任務定義、資源掛載等關鍵元素。實際使用時可以根據需求調整schedule、鏡像和command等內容