乐闻世界logo
搜索文章和话题

Kubernetes Deployment 的作用是什么?它如何实现滚动更新和回滚?

2月21日 15:53

Kubernetes Deployment 是用于管理 Pod 和 ReplicaSet 的声明式更新控制器,它提供了声明式的应用部署和更新能力。

Deployment 的核心功能

  1. 声明式管理:通过 YAML 文件定义期望状态,Kubernetes 自动实现当前状态到期望状态的转换。

  2. 滚动更新:支持零停机时间的应用更新,逐步替换旧版本的 Pod。

  3. 回滚能力:可以轻松回滚到之前的版本,支持查看更新历史。

  4. 自动扩缩容:支持手动或自动调整 Pod 的副本数量。

  5. 自愈能力:当 Pod 故障或被删除时,自动创建新的 Pod 以维持期望的副本数。

Deployment 的工作原理

Deployment 通过 ReplicaSet 管理 Pod:

  1. ReplicaSet:确保指定数量的 Pod 副本始终运行。

  2. Pod 模板:定义 Pod 的规格,包括容器镜像、资源限制等。

  3. 更新策略:控制滚动更新的行为,如最大不可用 Pod 数量、最大激增 Pod 数量。

Deployment 的 YAML 示例

yaml
apiVersion: 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 支持两种更新策略:

  1. RollingUpdate(默认):

    • 逐步替换 Pod,确保始终有可用 Pod
    • 可配置 maxUnavailable 和 maxSurge
    • 适用于大多数应用
  2. Recreate

    • 先删除所有旧 Pod,再创建新 Pod
    • 会导致短暂的服务中断
    • 适用于无法同时运行新旧版本的应用

滚动更新参数

  • maxUnavailable:更新过程中最多允许多少个 Pod 不可用(默认 25%)

  • maxSurge:更新过程中最多允许多少个额外的 Pod(默认 25%)

回滚操作

查看更新历史:

bash
kubectl rollout history deployment/nginx-deployment

回滚到上一个版本:

bash
kubectl rollout undo deployment/nginx-deployment

回滚到指定版本:

bash
kubectl rollout undo deployment/nginx-deployment --to-revision=2

扩缩容

手动扩缩容:

bash
kubectl scale deployment/nginx-deployment --replicas=5

自动扩缩容(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: 50

Deployment 与其他控制器的区别

  1. vs ReplicaSet

    • Deployment 是 ReplicaSet 的上层控制器
    • Deployment 提供更新和回滚能力,ReplicaSet 只能维持副本数
  2. vs StatefulSet

    • Deployment 适用于无状态应用
    • StatefulSet 适用于有状态应用,提供稳定的网络标识和持久化存储
  3. vs DaemonSet

    • Deployment 可以在任意节点运行指定数量的 Pod
    • DaemonSet 确保在每个节点上运行一个 Pod 副本

最佳实践

  1. 使用声明式配置:始终使用 YAML 文件定义 Deployment,而不是命令式命令。

  2. 设置合理的资源限制:为容器设置 CPU 和内存的 requests 和 limits。

  3. 配置健康检查:使用 livenessProbe 和 readinessProbe 确保应用健康。

  4. 使用多阶段构建:优化镜像大小,提高部署速度。

  5. 设置适当的更新策略:根据应用特性选择 RollingUpdate 或 Recreate。

  6. 使用标签和注解:为 Deployment 添加有意义的标签和注解,便于管理和追踪。

  7. 监控更新过程:使用 kubectl rollout status 监控更新进度。

标签:Kubernetes