Kubernetes Deployment 是用于管理 Pod 和 ReplicaSet 的声明式更新控制器,它提供了声明式的应用部署和更新能力。
Deployment 的核心功能
-
声明式管理:通过 YAML 文件定义期望状态,Kubernetes 自动实现当前状态到期望状态的转换。
-
滚动更新:支持零停机时间的应用更新,逐步替换旧版本的 Pod。
-
回滚能力:可以轻松回滚到之前的版本,支持查看更新历史。
-
自动扩缩容:支持手动或自动调整 Pod 的副本数量。
-
自愈能力:当 Pod 故障或被删除时,自动创建新的 Pod 以维持期望的副本数。
Deployment 的工作原理
Deployment 通过 ReplicaSet 管理 Pod:
-
ReplicaSet:确保指定数量的 Pod 副本始终运行。
-
Pod 模板:定义 Pod 的规格,包括容器镜像、资源限制等。
-
更新策略:控制滚动更新的行为,如最大不可用 Pod 数量、最大激增 Pod 数量。
Deployment 的 YAML 示例
yamlapiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
更新策略
Deployment 支持两种更新策略:
-
RollingUpdate(默认):
- 逐步替换 Pod,确保始终有可用 Pod
- 可配置 maxUnavailable 和 maxSurge
- 适用于大多数应用
-
Recreate:
- 先删除所有旧 Pod,再创建新 Pod
- 会导致短暂的服务中断
- 适用于无法同时运行新旧版本的应用
滚动更新参数
-
maxUnavailable:更新过程中最多允许多少个 Pod 不可用(默认 25%)
-
maxSurge:更新过程中最多允许多少个额外的 Pod(默认 25%)
回滚操作
查看更新历史:
bashkubectl rollout history deployment/nginx-deployment
回滚到上一个版本:
bashkubectl rollout undo deployment/nginx-deployment
回滚到指定版本:
bashkubectl rollout undo deployment/nginx-deployment --to-revision=2
扩缩容
手动扩缩容:
bashkubectl scale deployment/nginx-deployment --replicas=5
自动扩缩容(HPA):
yamlapiVersion: 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: 50
Deployment 与其他控制器的区别
-
vs ReplicaSet:
- Deployment 是 ReplicaSet 的上层控制器
- Deployment 提供更新和回滚能力,ReplicaSet 只能维持副本数
-
vs StatefulSet:
- Deployment 适用于无状态应用
- StatefulSet 适用于有状态应用,提供稳定的网络标识和持久化存储
-
vs DaemonSet:
- Deployment 可以在任意节点运行指定数量的 Pod
- DaemonSet 确保在每个节点上运行一个 Pod 副本
最佳实践
-
使用声明式配置:始终使用 YAML 文件定义 Deployment,而不是命令式命令。
-
设置合理的资源限制:为容器设置 CPU 和内存的 requests 和 limits。
-
配置健康检查:使用 livenessProbe 和 readinessProbe 确保应用健康。
-
使用多阶段构建:优化镜像大小,提高部署速度。
-
设置适当的更新策略:根据应用特性选择 RollingUpdate 或 Recreate。
-
使用标签和注解:为 Deployment 添加有意义的标签和注解,便于管理和追踪。
-
监控更新过程:使用
kubectl rollout status监控更新进度。