Kubernetes Deployment 详解

Deployment 是 Kubernetes 中最常用的工作负载控制器之一,它提供了声明式的更新能力,用于管理无状态应用的部署和更新。以下是 Deployment 的全面介绍:

一、Deployment 核心功能

1. 核心特性

特性 说明
Pod 声明式管理 通过 YAML 定义 Pod 模板
滚动更新 支持无宕机更新应用
版本回滚 可回退到历史版本
扩缩容 轻松调整 Pod 副本数
健康检查 结合 Readiness/Liveness Probe

2. 典型工作流程

kubectl apply
User
Deployment
ReplicaSet
Pod
Container

二、Deployment 配置详解

1. 基础 YAML 结构

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # Pod副本数
  selector:    # 必须匹配template中的labels
    matchLabels:
      app: nginx
  template:    # Pod模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.10
        ports:
        - containerPort: 80

2. 关键字段说明

字段 必选 说明
spec.replicas 期望的Pod副本数(默认为1)
spec.selector 标签选择器(必须匹配template.labels)
spec.template Pod模板定义
spec.strategy 更新策略配置

三、部署策略类型

1. 滚动更新(RollingUpdate) - 默认策略

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # 可超出replicas的最大Pod数
      maxUnavailable: 25%  # 更新期间不可用Pod比例

更新过程

  1. 创建新ReplicaSet并逐步扩容
  2. 旧ReplicaSet逐步缩容
  3. 确保始终有可用Pod处理请求

2. 重建更新(Recreate)

spec:
  strategy:
    type: Recreate

特点

  • 先删除所有旧Pod再创建新Pod
  • 会导致短暂服务不可用
  • 适合需要完全替换的场景

四、Deployment 生命周期管理

1. 创建与查看

# 创建Deployment
kubectl apply -f deployment.yaml

# 查看状态
kubectl get deployments
kubectl describe deployment <name>

# 查看关联的ReplicaSet
kubectl get rs -l app=nginx

2. 更新操作

# 镜像更新
kubectl set image deployment/nginx-deployment nginx=nginx:1.20.0

# 或通过编辑配置
kubectl edit deployment nginx-deployment

3. 扩缩容

# 手动扩缩
kubectl scale deployment nginx-deployment --replicas=5

# 基于CPU自动扩缩(HPA)
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

4. 回滚操作

# 查看历史版本
kubectl rollout history deployment nginx-deployment

# 回滚到上一个版本
kubectl rollout undo deployment nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment nginx-deployment --to-revision=2

五、高级配置

1. 就绪检查配置

spec:
  template:
    spec:
      containers:
      - name: nginx
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

2. 资源限制

resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "200m"
    memory: "256Mi"

3. 亲和性调度

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values: [ssd]

六、Deployment 状态解析

1. 状态类型

状态 说明
Progressing 正在执行滚动更新
Available 有足够Pod可用(>=minAvailable)
ReplicaFailure 创建/删除Pod时出错
Completed 所有Pod已成功更新

2. 状态检查

kubectl rollout status deployment nginx-deployment

七、最佳实践

  1. 标签一致性

    • 确保selector.matchLabels与template.metadata.labels完全匹配
    • 使用有意义的标签如:app, version, environment
  2. 更新策略选择

    • 生产环境使用RollingUpdate
    • 开发环境可使用Recreate加快更新速度
  3. 版本控制

    # 查看更新历史(包括变更原因)
    kubectl rollout history deployment nginx-deployment --revision=2
    
  4. 监控与告警

    # 设置Rollout监控
    kubectl get deployments -w
    

八、常见问题排查

  1. Pod 未创建

    kubectl describe deployment <name>  # 查看事件
    kubectl get rs                      # 检查ReplicaSet
    
  2. 更新卡住

    kubectl rollout undo deployment <name>  # 先回滚
    kubectl describe deployment <name>      # 分析原因
    
  3. 资源不足

    kubectl describe nodes  # 查看节点资源
    kubectl top pods        # 查看Pod资源使用
    

Deployment 是 Kubernetes 中最常用的工作负载管理方式,通过合理配置可以实现高效的应用部署和更新。建议结合 ConfigMap、Secret 和 Service 一起使用,构建完整的应用部署方案。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐