一、ReplicaSet 控制器
ReplicaSet 核心职责:保证集群中始终维持指定数量的 Pod 副本在运行。依靠标签选择器匹配 Pod,一旦副本数少于期望值就新建 Pod;多于期望值就删掉多余 Pod。
注意:日常几乎不会直接裸用 ReplicaSet,Deployment 底层就是封装了 ReplicaSet。
编写 ReplicaSet yaml
bash
apiVersion: apps/v1
kind: ReplicaSet
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: reg.timinglee.org/library/myapp:v1
name: myapp
执行创建:
bash
kubectl apply -f repset.yml
# 持续观察Pod以及标签变化
watch -n 1 kubectl get pods --show-labels
扩缩容操作
bash
# 副本扩到4个
kubectl scale replicaset webcluster --replicas 4
# 缩回到2个
kubectl scale replicaset webcluster --replicas 2
# 副本置0,所有Pod全部删除,控制器对象还保留
kubectl scale replicaset webcluster --replicas 0
修改 yaml 里面 replicas 的数值,再执行 kubectl apply -f repset.yml 同样可以完成扩缩容。
提醒:ReplicaSet不支持滚动升级。直接改镜像再 apply,不会触发 Pod 更新,只能手动删除 Pod,才会拉取新镜像重建。这也是生产不用它直接管理业务的主要原因。
二、Deployment 控制器
Deployment 是业务最常用控制器,基于 ReplicaSet 实现,增加滚动更新、版本回退、暂停 / 恢复发布能力。无状态业务优先选 Deployment。
编写 Deployment 配置
bash
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: reg.timinglee.org/library/myapp:v1
name: myapp
bash
# 通过--dry-run导出yaml模板
kubectl create deployment webcluster --image reg.timinglee.org/library/myapp:v1 --dry-run=client -o yaml > dep.yml
kubectl apply -f dep.yml
# 同时监控Pod和底层ReplicaSet
watch -n 1 " kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"
把 Deployment 暴露成 Service,提供集群访问:
bash
kubectl expose deployment webcluster --port 80 --target-port 80
kubectl describe services webcluster
# 使用ClusterIP访问测试
curl 10.107.142.60
版本升级与回滚
修改 yaml 中容器镜像版本,执行 apply,Deployment 会自动创建新 ReplicaSet,逐步销毁旧 Pod、拉起新 Pod。
bash
# 修改镜像为 v2
kubectl apply -f dep.yml
# 访问验证新版本
curl 10.107.142.60
如果新版本出问题,两种回退方式:
- 修改 yaml 镜像改回 v1,apply 重新发布
- 使用 kubectl rollout undo 直接回退历史版本
三、更新策略配置与发布优化
Deployment 默认滚动更新策略:maxSurge:25%、maxUnavailable:25%。
- maxSurge:升级过程中,允许最多比期望副本数多出多少 Pod
- maxUnavailable:升级过程中,允许最多多少个 Pod 处于不可用状态
查看当前更新策略:
bash
kubectl describe deployments.apps webcluster
自定义更新策略示例,业务零停机升级,不允许任何副本不可用:
bash
spec:
minReadySeconds: 5
replicas: 6
selector:
matchLabels:
app: webcluster
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: reg.timinglee.org/library/myapp:v1
name: myapp
maxUnavailable:0:升级时不会先杀掉旧 Pod,先启动新 Pod 就绪之后,再销毁旧 Pod,实现业务不断流。
发布暂停、恢复
有些场景,想批量修改多处配置,不想每改一次就触发一次滚动更新,可以先 pause,全部改完再 resume 一次性发布。
bash
# 暂停滚动更新,修改配置不会触发实际发布
kubectl rollout pause deployment webcluster
# 此时修改yaml镜像版本,apply不会执行滚动
kubectl apply -f dep.yml
# 恢复发布,此时才真正执行版本更新
kubectl rollout resume deployment webcluster
# 查看版本变更历史
kubectl rollout history deployment webcluster
四、DaemonSet 控制器
DaemonSet 的特点:集群每一个符合条件的 Node 上,都会运行一个副本 Pod。新增节点加入集群,会自动在新节点拉起 Pod;节点下线,对应 Pod 随之销毁。
典型使用场景:日志采集、监控 agent、网络插件(flannel、calico)这类节点级组件。
基础示例 yaml:
bash
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: daemonset
name: daemonset
spec:
selector:
matchLabels:
app: daemonset
template:
metadata:
labels:
app: daemonset
spec:
containers:
- image: reg.timinglee.org/library/myapp:v1
name: myapp
bash
kubectl apply -f daemonset.yml
实验现象:当新节点 node3 执行 kubeadm join 加入集群,节点就绪后立刻自动启动这个 DaemonSet 的 Pod,不需要人工干预。
补充:可以通过 nodeSelector /nodeAffinity 限制,只在部分节点部署 DaemonSet,而不是全部节点。
五、Job 控制器
Job 用来运行一次性任务。任务跑完就结束,Pod 状态变成 Completed,保证任务可以成功完成指定次数。
⚠️重要:Job 的重启策略只能是
Never或者OnFailure,禁止使用 Always,否则任务完成会无限重启。
字段说明
- completions:总共需要成功执行完成多少次任务
- parallelism:最多同时并行运行多少个 Pod
- backoffLimit:任务失败最大重试次数,超过直接放弃
bash
apiVersion: batch/v1
kind: Job
metadata:
name: pi-job
spec:
completions: 6
parallelism: 2
backoffLimit: 4
template:
spec:
containers:
- name: busybox
image: reg.timinglee.org/library/busybox:latest
command: ["/bin/sh","-c","echo task finish `date` ; head -c 16 /dev/urandom | od -An -t x1"]
restartPolicy: Never
bash
kubectl apply -f job.yml
# 查看job产生的pod
kubectl get pods |grep pi-job
# 查看任务输出日志
kubectl logs pi-job-qzhw9
观察:Pod 执行完业务命令,状态变为 Completed,不会自动删除,需要手动清理 Job 资源。
六、CronJob 定时任务控制器
CronJob 基于 Job,增加 cron 定时调度,相当于 k8s 内部的 crontab。按 cron 表达式周期性创建 Job,由 Job 去执行实际任务。
bash
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob
spec:
schedule: '* * * * *'
jobTemplate:
metadata:
name: cronjob
spec:
template:
spec:
containers:
- image: reg.timinglee.org/library/busybox:latest
name: cronjob
command:
- /bin/sh
- -c
- echo "hello timinglee"
restartPolicy: OnFailure
bash
kubectl apply -f cronjob.yml
# 查看定时任务状态
kubectl get cronjobs.batch
# 查看定时任务Pod日志
kubectl logs hello-cron-29792316-vsqct