Deployment #
一、Deployment概述 #
Deployment是Kubernetes中最常用的工作负载资源,用于管理无状态应用的部署和更新。
1.1 Deployment功能 #
text
Deployment功能
│
├── 副本管理
│ └── 维护指定数量的Pod副本
│
├── 滚动更新
│ ├── 无缝升级
│ └── 可配置更新策略
│
├── 回滚
│ ├── 版本历史
│ └── 一键回滚
│
└── 扩缩容
├── 手动扩缩容
└── 自动扩缩容
1.2 Deployment关系 #
text
Deployment关系图
│
└── Deployment
│
└── ReplicaSet (管理副本)
│
└── Pod (运行容器)
二、创建Deployment #
2.1 命令行创建 #
bash
# 创建Deployment
kubectl create deployment nginx --image=nginx:1.25
# 指定副本数
kubectl create deployment nginx --image=nginx:1.25 --replicas=3
# 查看Deployment
kubectl get deployments
# 查看ReplicaSet
kubectl get rs
# 查看Pod
kubectl get pods
2.2 YAML创建 #
yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
bash
# 应用配置
kubectl apply -f nginx-deployment.yaml
# 查看状态
kubectl get deployment nginx-deployment
2.3 查看Deployment #
bash
# 查看Deployment详情
kubectl describe deployment nginx-deployment
# 查看Deployment YAML
kubectl get deployment nginx-deployment -o yaml
# 查看关联资源
kubectl get all -l app=nginx
三、更新策略 #
3.1 滚动更新 #
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
3.2 更新参数说明 #
| 参数 | 说明 | 默认值 |
|---|---|---|
| maxSurge | 最多可超出副本数 | 25% |
| maxUnavailable | 最多不可用副本数 | 25% |
text
滚动更新过程(replicas=3, maxSurge=1, maxUnavailable=0)
│
├── 初始状态: 3个旧版本Pod
│
├── 创建1个新Pod(maxSurge=1)
│ └── 4个Pod运行中
│
├── 新Pod就绪后,删除1个旧Pod
│ └── 3个Pod运行中
│
├── 重复上述过程
│
└── 最终状态: 3个新版本Pod
3.3 重建更新 #
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
strategy:
type: Recreate
selector:
matchLabels:
app: nginx
template:
spec:
containers:
- name: nginx
image: nginx:1.25
四、更新Deployment #
4.1 更新镜像 #
bash
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
4.2 编辑配置 #
bash
# 编辑Deployment
kubectl edit deployment nginx-deployment
# 更新环境变量
kubectl set env deployment/nginx-deployment ENV=production
# 更新资源限制
kubectl set resources deployment/nginx-deployment \
--limits=cpu=200m,memory=256Mi \
--requests=cpu=100m,memory=128Mi
4.3 应用更新 #
bash
# 修改YAML文件后应用
kubectl apply -f nginx-deployment.yaml
# 使用kustomize
kubectl apply -k ./overlays/production/
4.4 暂停和恢复 #
bash
# 暂停滚动更新
kubectl rollout pause deployment/nginx-deployment
# 进行多次修改
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl set env deployment/nginx-deployment ENV=production
# 恢复滚动更新
kubectl rollout resume deployment/nginx-deployment
五、回滚Deployment #
5.1 查看历史 #
bash
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
# 输出示例
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 查看特定版本详情
kubectl rollout history deployment/nginx-deployment --revision=2
5.2 回滚操作 #
bash
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
# 查看回滚状态
kubectl rollout status deployment/nginx-deployment
5.3 记录变更原因 #
bash
# 创建时记录原因
kubectl apply -f nginx-deployment.yaml --record
# 更新时记录原因
kubectl set image deployment/nginx-deployment nginx=nginx:1.26 --record
# 查看历史原因
kubectl rollout history deployment/nginx-deployment
六、扩缩容 #
6.1 手动扩缩容 #
bash
# 扩容到5个副本
kubectl scale deployment/nginx-deployment --replicas=5
# 缩容到2个副本
kubectl scale deployment/nginx-deployment --replicas=2
# 基于条件扩容
kubectl scale deployment/nginx-deployment --current-replicas=3 --replicas=5
6.2 自动扩缩容 #
bash
# 创建HPA
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80
# 查看HPA
kubectl get hpa
# 查看HPA详情
kubectl describe hpa nginx-deployment
6.3 HPA配置示例 #
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
七、Deployment状态 #
7.1 状态字段 #
bash
# 查看状态
kubectl get deployment nginx-deployment -o jsonpath='{.status}'
# 状态字段说明
| 字段 | 说明 |
|---|---|
| replicas | 期望副本数 |
| updatedReplicas | 已更新副本数 |
| readyReplicas | 就绪副本数 |
| availableReplicas | 可用副本数 |
| unavailableReplicas | 不可用副本数 |
7.2 条件状态 #
bash
# 查看条件
kubectl get deployment nginx-deployment -o jsonpath='{.status.conditions}'
| 条件类型 | 说明 |
|---|---|
| Progressing | 更新进行中 |
| Available | Deployment可用 |
| ReplicaFailure | 副本创建失败 |
八、完整配置示例 #
8.1 生产级Deployment #
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: web
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: web
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
env:
- name: ENV
value: production
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 5
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
volumes:
- name: config
configMap:
name: nginx-config
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: web
topologyKey: kubernetes.io/hostname
8.2 配置说明 #
| 配置项 | 说明 |
|---|---|
| revisionHistoryLimit | 保留历史版本数 |
| strategy | 更新策略 |
| resources | 资源限制 |
| livenessProbe | 存活探针 |
| readinessProbe | 就绪探针 |
| affinity | 亲和性配置 |
九、故障排查 #
9.1 常见问题 #
bash
# 查看Deployment事件
kubectl describe deployment nginx-deployment
# 查看Pod状态
kubectl get pods -l app=nginx
# 查看Pod事件
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name>
9.2 常见状态 #
| 状态 | 原因 | 解决方案 |
|---|---|---|
| ImagePullBackOff | 镜像拉取失败 | 检查镜像名称和权限 |
| CrashLoopBackOff | 容器崩溃 | 检查日志和配置 |
| Pending | 资源不足 | 增加资源或节点 |
| Running但Not Ready | 健康检查失败 | 检查探针配置 |
十、最佳实践 #
10.1 资源配置 #
yaml
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
10.2 健康检查 #
yaml
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 5
10.3 更新策略 #
yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
十一、总结 #
11.1 核心命令 #
| 操作 | 命令 |
|---|---|
| 创建 | kubectl create deployment |
| 更新 | kubectl set image |
| 扩缩容 | kubectl scale |
| 回滚 | kubectl rollout undo |
| 查看状态 | kubectl rollout status |
| 查看历史 | kubectl rollout history |
11.2 下一步 #
掌握了Deployment后,让我们学习 ReplicaSet,深入理解副本控制机制。
最后更新:2026-03-28