Deployment 无状态部署
掌握 Deployment 的作用与原理
熟练进行扩缩容、滚动更新、回滚操作
理解副本控制器的工作机制
核心讲解
Deployment 是管理无状态应用的标准控制器,管理 Pod 的副本数、滚动更新、版本回滚,是最常用的工作负载控制器。
(1)核心作用
保证副本数:持续监控,Pod 少了自动补,多了自动删
滚动更新:平滑升级版本,不中断业务
版本回滚:出问题一键回退到上一版本
水平扩缩容:一键增减副本数
(2)核心结构
replicas:副本数量selector:选择器,匹配 Pod 标签,必须和 template 里的 labels 一致template:Pod 模板,Deployment 根据这个模板创建 Podstrategy:更新策略,默认滚动更新
(3)滚动更新
升级时,先启动新版本 Pod,正常了再删旧版本
滚动进行,业务不中断
可配置最大不可用、最大超出数量
(4)版本与回滚
每次 apply 都会记录版本
kubectl rollout history查看历史版本kubectl rollout undo回滚到上一版本
操作示例
# nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 100m
memory: 128Mi
# 部署
kubectl apply -f nginx-deploy.yaml
# 查看部署
kubectl get deploy
kubectl get pods -o wide
# 扩缩容到 5 副本
kubectl scale deploy nginx --replicas=5
# 滚动更新版本,镜像改成 1.25
kubectl set image deploy nginx nginx=nginx:1.25
# 查看更新状态
kubectl rollout status deploy nginx
# 查看历史版本
kubectl rollout history deploy nginx
# 回滚到上一版本
kubectl rollout undo deploy nginx
# 暂停/恢复更新
kubectl rollout pause deploy nginx
kubectl rollout resume deploy nginx
常见误区
selector 和 Pod 标签可以不一致:必须完全一致,不一致会导致创建 Pod 失控
更新就是删了重建:滚动更新是先启新的,正常了再删旧的,零中断
回滚就是退版本:回滚本质也是滚动更新,反向更新镜像
Deployment 能管有状态应用:Deployment 是为无状态设计的,有状态应用用 StatefulSet
课后练习
创建一个 3 副本的 nginx 部署
执行滚动更新,升级镜像版本
查看更新历史,执行回滚操作
思考:滚动更新相比停机更新有什么优势?
