Deployment
Deployment 管理无状态应用的部署和更新,提供声明式更新和回滚能力。
架构关系
flowchart TB
D[Deployment] --> RS1[ReplicaSet v1]
D --> RS2[ReplicaSet v2]
RS1 --> P1[Pod v1]
RS2 --> P2[Pod v2]
更新策略对比
| 策略 | RollingUpdate | Recreate |
|---|---|---|
| 更新方式 | 逐步替换 | 全部替换 |
| 停机时间 | 无 | 有 |
| 适用场景 | 生产环境 | 开发测试 |
不同部署形式
1. 滚动更新 (Rolling Update)
逐步替换旧版本 Pod,确保服务始终可用。
flowchart LR
subgraph Old[旧版本]
O1[Pod v1]
O2[Pod v1]
O3[Pod v1]
end
subgraph New[新版本]
N1[Pod v2]
N2[Pod v2]
N3[Pod v2]
end
Old -- 逐步替换 --> New
# 滚动更新配置
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
2. 蓝绿部署 (Blue-Green Deployment)
同时运行两个完全相同的环境(蓝和绿),通过切换流量实现零停机部署。
flowchart LR
LB[负载均衡器]
subgraph Blue[蓝环境 v1]
B1[Pod v1]
B2[Pod v1]
end
subgraph Green[绿环境 v2]
G1[Pod v2]
G2[Pod v2]
end
LB --> Blue
LB -.-> Green
# 蓝绿部署示例
# 创建新版本 Deployment
kubectl create deployment myapp-v2 --image=myapp:2.0
# 通过 Service 切换流量
kubectl patch service myapp -p '{"spec":{"selector":{"version":"2.0"}}}'
3. 金丝雀部署 (Canary Deployment)
先向少量用户发布新版本,验证无误后逐步扩大范围。
flowchart LR
subgraph Traffic[流量分配]
T[100% 流量]
end
subgraph V1[版本1]
P1[Pod v1]
P2[Pod v1]
end
subgraph V2[版本2]
P3[Pod v2]
end
T --> V1
T --> V2
# 金丝雀部署示例
# 创建金丝雀版本(少量副本)
kubectl create deployment myapp-canary --image=myapp:2.0 --replicas=1
# 监控金丝雀版本
kubectl get pods -l app=myapp
# 逐步扩大金丝雀版本
kubectl scale deployment myapp-canary --replicas=3
4. A/B 测试部署
同时运行两个不同版本,根据用户特征分配流量进行测试。
flowchart LR
subgraph Users[用户流量]
U1[用户组A]
U2[用户组B]
end
subgraph VersionA[版本A]
A1[Pod v1]
A2[Pod v1]
end
subgraph VersionB[版本B]
B1[Pod v2]
B2[Pod v2]
end
U1 --> VersionA
U2 --> VersionB
# A/B 测试示例
# 通常结合 Ingress 或 Service Mesh 实现
# 使用 Istio 进行流量分割
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
http:
- route:
- destination:
host: myapp
subset: v1
weight: 50
- destination:
host: myapp
subset: v2
weight: 50
常用命令
# 创建 Deployment
kubectl create deployment nginx --image=nginx:1.21
# 扩展副本数
kubectl scale deployment nginx --replicas=3
# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
其他部署类型
5. CronJob (定时任务)
CronJob 用于创建定时任务,按照预定的时间表运行 Job,适用于周期性执行的任务(如备份、清理、报表生成等)。
flowchart TD
S[Schedule] --> CJ[CronJob]
CJ --> J[Job]
J --> P[Pod]
P --> R[Run Task]
R --> |Success| D[Done]
R --> |Failed| R[Retry/Failed]
| 特性 | Deployment | CronJob |
|---|---|---|
| 用途 | 持续运行应用 | 定时执行任务 |
| 运行模式 | 持续运行 | 周期性运行 |
| 调度方式 | 自动扩缩容 | Cron 表达式 |
| 适用场景 | Web 应用、API | 备份、清理、报表 |
# 创建定时任务(每分钟执行一次)
apiVersion: batch/v1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "* * * * *" # Cron 表达式
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox:1.28
args:
- /bin/sh
- -c
- date; echo "Running a scheduled task"
restartPolicy: OnFailure
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
6. StatefulSet (有状态应用)
StatefulSet 管理有状态应用的部署和扩展,为每个 Pod 提供稳定的标识符(如持久化存储、网络标识等),适用于数据库、分布式系统等需要稳定网络标识和持久化存储的应用。
flowchart TD
SS[StatefulSet] --> RS[ReplicaSet]
RS --> P1[Pod-0
Persistent Volume
Stable Identity]
RS --> P2[Pod-1
Persistent Volume
Stable Identity]
RS --> P3[Pod-2
Persistent Volume
Stable Identity]
P1 --> S1[Service]
P2 --> S1
P3 --> S1
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 标识 | 临时、无序 | 稳定、有序 |
| 网络标识 | 动态分配 | 稳定 DNS |
| 存储 | 共享存储卷 | 独立持久卷 |
| 部署顺序 | 并行 | 顺序 |
| 适用场景 | 无状态应用 | 数据库、集群 |
# 创建有状态应用
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset
spec:
serviceName: my-service
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: nginx:1.21
volumeMounts:
- name: storage
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
7. DaemonSet (守护进程集)
DaemonSet 确保所有(或部分)节点上都运行一个 Pod 副本,适用于需要在每个节点上运行的系统级应用,如日志收集、监控、网络代理等。
flowchart LR
DS[DaemonSet] --> N1[Node 1
Pod]
DS --> N2[Node 2
Pod]
DS --> N3[Node 3
Pod]
DS --> N4[Node N
Pod]
| 特性 | Deployment | DaemonSet |
|---|---|---|
| Pod 分布 | 集中部署 | 节点部署 |
| 节点关联 | 无特定节点 | 每个节点一个 |
| 扩展方式 | 按副本数 | 按节点数 |
| 适用场景 | 应用服务 | 系统级服务 |
# 创建守护进程集
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: my-daemon
template:
metadata:
labels:
app: my-daemon
spec:
containers:
- name: daemon
image: fluent/fluent-bit:1.8
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log