Pod是Kubernetes集群中最小的可管理单元。根据创建方式,Pod可以分为两类:
- 自主式Pod:由用户直接创建,删除后不会重建。
- 控制器创建的Pod:通过Pod控制器创建,此类Pod在删除后能够根据预期状态自动重建。
Pod控制器扮演着Pod资源管理的中间层角色。用户只需向控制器声明期望的Pod数量和状态,控制器便会负责创建并持续维护这些Pod,确保其始终符合预期。当Pod在运行中出现故障时,控制器会根据预定义的策略自动重新调度或重建。Kubernetes提供了多种控制器,以适应不同的应用场景:
- ReplicationController:早期控制器,已被ReplicaSet取代。
- ReplicaSet (RS):确保指定数量的Pod副本持续运行,支持扩缩容和镜像升级。
- Deployment:通过管理ReplicaSet间接管理Pod,支持声明式更新、滚动升级和版本回滚。
- Horizontal Pod Autoscaler (HPA):根据监控指标自动水平调整Pod副本数,实现集群负载的动态平衡。
- DaemonSet:确保集群中每个(或指定)节点上都运行一个Pod副本,常用于日志收集、节点监控等守护进程。
- Job:用于执行一次性任务,任务完成后Pod即退出。
- CronJob:基于时间调度,用于执行周期性的任务。
- StatefulSet:用于管理有状态应用。
ReplicaSet (RS)
ReplicaSet的核心职责是确保指定数量的Pod副本持续处于运行状态。它会持续监听所管理Pod的健康状况,一旦发现Pod故障,便自动重启或重建。同时,它也支持Pod数量的手动扩缩容以及容器镜像版本的升级或回退。

ReplicaSet的资源清单(YAML)结构如下:
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 资源类型
metadata: # 元数据
name: rs-name # RS名称
namespace: dev # 所属命名空间
labels: # 标签
controller: rs
spec: # 规格详情
replicas: 3 # 期望的Pod副本数量
selector: # 标签选择器,用于筛选被管理的Pod
matchLabels: # 标签匹配规则
app: nginx-pod
matchExpressions: # 表达式匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # Pod模板,用于创建新的Pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80

关键配置项说明:
replicas:定义期望的Pod副本数。
selector:标签选择器,通过匹配Pod模板中定义的标签(template.metadata.labels),建立起控制器与Pod之间的管理关系。
template:Pod模板,定义了当副本数不足时,新Pod的创建规格。
创建与操作ReplicaSet
-
创建RS:编写资源文件pc-replicaset.yaml并应用。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: pc-replicaset
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
# 创建RS
kubectl create -f pc-replicaset.yaml
# 查看RS详情
kubectl get rs pc-replicaset -n dev -o wide
# 查看由RS创建的Pod
kubectl get pod -n dev

-
扩缩容:可以通过编辑YAML文件或使用kubectl scale命令动态调整副本数。
# 方法一:编辑YAML,修改 `spec.replicas` 字段
kubectl edit rs pc-replicaset -n dev
# 方法二:使用scale命令
kubectl scale rs pc-replicaset --replicas=2 -n dev
# 查看Pod变化
kubectl get pods -n dev
-
镜像升级:更新Pod模板中的镜像版本。
# 方法一:编辑YAML,修改 `spec.template.spec.containers.image` 字段
kubectl edit rs pc-replicaset -n dev
# 方法二:使用set image命令
kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev
# 查看更新后的RS
kubectl get rs -n dev -o wide
-
删除RS:默认删除操作会同时删除其管理的所有Pod。
# 删除RS及其Pod(推荐)
kubectl delete -f pc-replicaset.yaml
# 或
kubectl delete rs pc-replicaset -n dev
# 仅删除RS对象,保留Pod(不推荐,Pod将变为自主式)
kubectl delete rs pc-replicaset -n dev --cascade=false
Deployment (Deploy)
Deployment是比ReplicaSet更高级的抽象,它通过管理ReplicaSet来间接管理Pod(Deployment -> ReplicaSet -> Pod),提供了更强大的发布和回滚能力,是现代Kubernetes中进行无状态应用部署的首选控制器。

Deployment在ReplicaSet功能基础上,新增了以下核心能力:
- 支持发布过程的暂停(
pause)与继续(resume)。
- 支持滚动更新(RollingUpdate)和版本回滚(rollback)。

Deployment资源清单文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-name
namespace: dev
labels:
controller: deploy
spec:
replicas: 3
revisionHistoryLimit: 3 # 保留的历史ReplicaSet版本数量,用于回滚
paused: false # 是否暂停部署
progressDeadlineSeconds: 600 # 部署超时时间(秒)
strategy: # 更新策略
type: RollingUpdate # 滚动更新
rollingUpdate:
maxSurge: 30% # 升级过程中可以额外创建的Pod数量比例(相对于`replicas`)
maxUnavailable: 30% # 升级过程中最大不可用Pod的比例
selector:
matchLabels:
app: nginx-pod
template: # Pod模板
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
创建与基础操作
-
创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
# 创建Deployment,--record记录命令以便在历史中查看
kubectl create -f pc-deployment.yaml --record=true
# 查看Deployment
kubectl get deploy pc-deployment -n dev
# 查看其管理的ReplicaSet
kubectl get rs -n dev
# 查看最终创建的Pod
kubectl get pods -n dev


-
扩缩容:与ReplicaSet操作类似。
# 使用scale命令
kubectl scale deploy pc-deployment --replicas=5 -n dev
# 或编辑YAML文件
kubectl edit deploy pc-deployment -n dev
更新策略与版本控制
Deployment支持两种更新策略,在spec.strategy.type中定义:
执行更新与回滚:
# 1. 更新镜像(触发滚动更新)
kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
# 观察更新过程
kubectl get pods -n dev -w
# 2. 查看更新状态和历史
kubectl rollout status deploy pc-deployment -n dev
kubectl rollout history deploy pc-deployment -n dev
# 3. 版本回滚
# 回滚到上一个版本
kubectl rollout undo deployment pc-deployment -n dev
# 回滚到指定历史版本(通过--to-revision指定)
kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev
金丝雀发布 (Canary Release)
利用Deployment的暂停(pause)功能,可以实现金丝雀发布:先让一小部分流量接入新版本,验证通过后再全量更新。
# 1. 更新镜像并立即暂停部署
kubectl set image deploy pc-deployment nginx=nginx:1.17.4 -n dev && \
kubectl rollout pause deployment pc-deployment -n dev
# 2. 观察,此时会创建部分新版本Pod,旧版本Pod仍在运行
kubectl get pods -n dev
# 3. 验证新版本无误后,继续完成更新
kubectl rollout resume deploy pc-deployment -n dev
删除Deployment
kubectl delete -f pc-deployment.yaml
DaemonSet (DS)
DaemonSet确保集群中每个节点(或通过节点选择器指定的节点)上都运行一个Pod副本。它非常适合运行节点级别的守护进程,如日志收集代理(Fluentd)、监控采集器(Node Exporter)或网络插件。

其特点如下:
- 向集群添加新节点时,自动在该节点上创建Pod副本。
- 节点被移除时,其上的Pod会被自动垃圾回收。
资源清单示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pc-daemonset
spec:
updateStrategy: # 更新策略
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
创建与查看:
# 创建DaemonSet
kubectl create -f pc-daemonset.yaml
# 查看DaemonSet,会显示在多少个节点上部署了Pod
kubectl get ds -n dev -o wide
# 查看Pod,每个节点一个
kubectl get pods -n dev -o wide
这种在每个节点部署一个实例的模式,是运维监控和日志采集的常见做法。
Job
Job用于执行一次性的批处理任务。它创建的一个或多个Pod会运行至任务成功完成(而非持续运行),完成后Pod状态变为Completed。

关键参数:
completions:指定Job需要成功运行多少次。例如设为6,则Job会运行Pod直到有6次成功记录。
parallelism:指定同时运行的Pod数量。
restartPolicy:只能为Never或OnFailure,不能是Always。
Job资源清单示例:
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: dev
spec:
completions: 6 # 总共需要成功6次
parallelism: 3 # 同时运行3个Pod
manualSelector: true
selector:
matchLabels:
app: counter-pod
template:
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 任务失败后创建新Pod,而不是重启容器
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
操作命令:
# 创建Job
kubectl create -f pc-job.yaml
# 查看Job执行状态
kubectl get job -n dev -w
# 查看Pod,完成后状态为Completed
kubectl get pods -n dev
CronJob (CJ)
CronJob基于时间调度来周期性地运行Job,类似于Linux系统的Crontab。它用于执行周期性的定时任务。

核心字段:
schedule:Cron格式的时间调度表达式,例如"*/1 * * * *"表示每分钟执行一次。
concurrencyPolicy:
Allow(默认):允许并发执行。
Forbid:禁止并发,如果上次任务未完成则跳过本次。
Replace:取消当前正在运行的任务,用新任务替换。
资源清单示例:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: pc-cronjob
namespace: dev
spec:
schedule: "*/1 * * * *" # 每分钟执行一次
jobTemplate: # Job模板
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
操作命令:
# 创建CronJob
kubectl create -f pc-cronjob.yaml
# 查看CronJob
kubectl get cronjobs -n dev
# CronJob会按计划创建Job,再通过Job创建Pod
kubectl get jobs -n dev
kubectl get pods -n dev
CronJob非常适合处理像数据库备份、定期报告生成、数据清理等批量任务处理场景。