Deployment 部署
Deployment 是 Kubernetes 中最常用的资源对象,用于管理应用的部署和扩缩容。
什么是 Deployment?
Deployment 为 Pod 和 ReplicaSet 提供声明式更新能力,是管理无状态应用的首选方式。
创建 Deployment
基础 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
# Pod 副本数
replicas: 3
# 选择器
selector:
matchLabels:
app: nginx
# Pod 模板
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
使用 kubectl 创建
# 使用 YAML 创建
kubectl apply -f deployment.yaml
# 使用命令创建(不推荐用于生产)
kubectl create deployment nginx --image=nginx:1.25 --replicas=3
# 从文件模板生成
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deployment.yaml
Deployment 策略
RollingUpdate(滚动更新)
默认策略,逐步替换旧版本 Pod:
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 允许超过期望副本数最多1个
maxUnavailable: 0 # 不可用的 Pod 数量(0保证服务不中断)
Recreate(重建)
先删除所有旧 Pod,再创建新 Pod:
spec:
replicas: 3
strategy:
type: Recreate
滚动更新过程:
扩缩容
命令行扩缩容
# 扩容到 5 个副本
kubectl scale deployment nginx-deployment --replicas=5
# 缩容到 2 个副本
kubectl scale deployment nginx-deployment --replicas=2
自动扩缩容(HPA)
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: 70
# 创建 HPA
kubectl apply -f hpa.yaml
# 查看 HPA 状态
kubectl get hpa
# 手动触发扩容
kubectl scale deployment nginx-deployment --replicas=5
更新 Deployment
镜像更新
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 查看历史版本
kubectl rollout history deployment/nginx-deployment
暂停和恢复
# 暂停更新
kubectl rollout pause deployment/nginx-deployment
# 恢复更新
kubectl rollout resume deployment/nginx-deployment
回滚
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
# 查看回滚状态
kubectl rollout status deployment/nginx-deployment
Deployment 生命周期
Deployment 配置详解
完整配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: production
labels:
app: my-app
version: v1
spec:
replicas: 3
revisionHistoryLimit: 5 # 保留的历史版本数
progressDeadlineSeconds: 600 # 最大等待时间(秒)
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: my-app
version: v1
spec:
# 副本亲和性
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: my-app
topologyKey: kubernetes.io/hostname
containers:
- name: app
image: my-app:v1
imagePullPolicy: Always
ports:
- name: http
containerPort: 8080
protocol: TCP
# 资源配额
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
# 健康检查
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# 环境变量
env:
- name: APP_ENV
value: "production"
# 卷挂载
volumeMounts:
- name: config
mountPath: /app/config
# 初始化容器
initContainers:
- name: init-db
image: busybox:1.36
command: ['sh', '-c', 'echo Waiting for DB']
# 亲和性
tolerations:
- key: "dedicated"
value: "app"
effect: NoSchedule
# 存储卷
volumes:
- name: config
configMap:
name: app-config
# 终止GracePeriod
terminationGracePeriodSeconds: 30
管理命令
查看 Deployment
# 查看 Deployment
kubectl get deployment
# 查看详细信息
kubectl describe deployment nginx-deployment
# 查看 Pod
kubectl get pods -l app=nginx
# 查看 ReplicaSet
kubectl get replicaset -l app=nginx
更新策略
# 设置更新策略
kubectl patch deployment nginx-deployment \
-p '{"spec":{"strategy":{"type":"Recreate"}}}'
# 设置镜像并记录
kubectl set image deployment/nginx-deployment \
nginx=nginx:1.26 --record=true
调试
# 查看特定版本的详情
kubectl rollout history deployment/nginx-deployment --revision=2
# 查看实时状态
kubectl rollout status -w deployment/nginx-deployment
# 进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/sh
最佳实践
1. 使用合适的副本数
spec:
replicas: 3 # 生产环境至少3个
2. 设置资源限制
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
3. 使用探针
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
4. 保留历史版本
spec:
revisionHistoryLimit: 5
5. 使用标签管理版本
template:
metadata:
labels:
app: my-app
version: v1.0.0
其他 Controller
ReplicaSet
ReplicaSet 确保指定数量的 Pod 副本运行:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
# ... Pod 模板
StatefulSet
用于有状态应用:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
# ... Pod 模板
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
DaemonSet
确保每个节点都运行一个 Pod:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: logging-agent
spec:
selector:
matchLabels:
app: logging
template:
# ... Pod 模板
小结
本章我们学习了:
- Deployment 概念:声明式管理 Pod
- 创建 Deployment:YAML 配置和命令
- 更新策略:RollingUpdate 和 Recreate
- 扩缩容:手动和自动(HPA)
- 更新和回滚:版本管理
- 最佳实践:资源限制、健康检查、历史版本
练习
- 创建一个包含 3 个副本的 Deployment
- 使用 kubectl 扩缩容
- 更新镜像版本并观察滚动更新过程
- 回滚到上一个版本
准备好继续学习了吗?点击下一章了解 Service 和网络!