Deployment

Deployment 管理无状态应用的部署和更新,提供声明式更新和回滚能力。

架构关系
flowchart TB
    D[Deployment] --> RS1[ReplicaSet v1]
    D --> RS2[ReplicaSet v2]
    RS1 --> P1[Pod v1]
    RS2 --> P2[Pod v2]
                                
更新策略对比
策略RollingUpdateRecreate
更新方式逐步替换全部替换
停机时间
适用场景生产环境开发测试
不同部署形式

1. 滚动更新 (Rolling Update)

逐步替换旧版本 Pod,确保服务始终可用。

flowchart LR
    subgraph Old[旧版本]
        O1[Pod v1]
        O2[Pod v1]
        O3[Pod v1]
    end
    subgraph New[新版本]
        N1[Pod v2]
        N2[Pod v2]
        N3[Pod v2]
    end
    Old -- 逐步替换 --> New
                                                
# 滚动更新配置
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 25%
    maxUnavailable: 25%

2. 蓝绿部署 (Blue-Green Deployment)

同时运行两个完全相同的环境(蓝和绿),通过切换流量实现零停机部署。

flowchart LR
    LB[负载均衡器]
    subgraph Blue[蓝环境 v1]
        B1[Pod v1]
        B2[Pod v1]
    end
    subgraph Green[绿环境 v2]
        G1[Pod v2]
        G2[Pod v2]
    end
    LB --> Blue
    LB -.-> Green
                                                
# 蓝绿部署示例
# 创建新版本 Deployment
kubectl create deployment myapp-v2 --image=myapp:2.0
# 通过 Service 切换流量
kubectl patch service myapp -p '{"spec":{"selector":{"version":"2.0"}}}'

3. 金丝雀部署 (Canary Deployment)

先向少量用户发布新版本,验证无误后逐步扩大范围。

flowchart LR
    subgraph Traffic[流量分配]
        T[100% 流量]
    end
    subgraph V1[版本1]
        P1[Pod v1]
        P2[Pod v1]
    end
    subgraph V2[版本2]
        P3[Pod v2]
    end
    T --> V1
    T --> V2
                                                
# 金丝雀部署示例
# 创建金丝雀版本(少量副本)
kubectl create deployment myapp-canary --image=myapp:2.0 --replicas=1
# 监控金丝雀版本
kubectl get pods -l app=myapp
# 逐步扩大金丝雀版本
kubectl scale deployment myapp-canary --replicas=3

4. A/B 测试部署

同时运行两个不同版本,根据用户特征分配流量进行测试。

flowchart LR
    subgraph Users[用户流量]
        U1[用户组A]
        U2[用户组B]
    end
    subgraph VersionA[版本A]
        A1[Pod v1]
        A2[Pod v1]
    end
    subgraph VersionB[版本B]
        B1[Pod v2]
        B2[Pod v2]
    end
    U1 --> VersionA
    U2 --> VersionB
                                                
# A/B 测试示例
# 通常结合 Ingress 或 Service Mesh 实现
# 使用 Istio 进行流量分割
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
  http:
  - route:
    - destination:
        host: myapp
        subset: v1
      weight: 50
    - destination:
        host: myapp
        subset: v2
      weight: 50
常用命令
# 创建 Deployment
kubectl create deployment nginx --image=nginx:1.21
# 扩展副本数
kubectl scale deployment nginx --replicas=3
# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
其他部署类型
schedule
5. CronJob (定时任务)

CronJob 用于创建定时任务,按照预定的时间表运行 Job,适用于周期性执行的任务(如备份、清理、报表生成等)。

flowchart TD
    S[Schedule] --> CJ[CronJob]
    CJ --> J[Job]
    J --> P[Pod]
    P --> R[Run Task]
    R --> |Success| D[Done]
    R --> |Failed| R[Retry/Failed]
                                                
特性DeploymentCronJob
用途持续运行应用定时执行任务
运行模式持续运行周期性运行
调度方式自动扩缩容Cron 表达式
适用场景Web 应用、API备份、清理、报表
# 创建定时任务(每分钟执行一次)
apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-cronjob
spec:
  schedule: "* * * * *"  # Cron 表达式
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox:1.28
            args:
            - /bin/sh
            - -c
            - date; echo "Running a scheduled task"
          restartPolicy: OnFailure
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
storage
6. StatefulSet (有状态应用)

StatefulSet 管理有状态应用的部署和扩展,为每个 Pod 提供稳定的标识符(如持久化存储、网络标识等),适用于数据库、分布式系统等需要稳定网络标识和持久化存储的应用。

flowchart TD
    SS[StatefulSet] --> RS[ReplicaSet]
    RS --> P1[Pod-0
Persistent Volume
Stable Identity] RS --> P2[Pod-1
Persistent Volume
Stable Identity] RS --> P3[Pod-2
Persistent Volume
Stable Identity] P1 --> S1[Service] P2 --> S1 P3 --> S1
特性DeploymentStatefulSet
Pod 标识临时、无序稳定、有序
网络标识动态分配稳定 DNS
存储共享存储卷独立持久卷
部署顺序并行顺序
适用场景无状态应用数据库、集群
# 创建有状态应用
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: my-service
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: nginx:1.21
        volumeMounts:
        - name: storage
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
    name: storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
apps
7. DaemonSet (守护进程集)

DaemonSet 确保所有(或部分)节点上都运行一个 Pod 副本,适用于需要在每个节点上运行的系统级应用,如日志收集、监控、网络代理等。

flowchart LR
    DS[DaemonSet] --> N1[Node 1
Pod] DS --> N2[Node 2
Pod] DS --> N3[Node 3
Pod] DS --> N4[Node N
Pod]
特性DeploymentDaemonSet
Pod 分布集中部署节点部署
节点关联无特定节点每个节点一个
扩展方式按副本数按节点数
适用场景应用服务系统级服务
# 创建守护进程集
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
spec:
  selector:
    matchLabels:
      app: my-daemon
  template:
    metadata:
      labels:
        app: my-daemon
    spec:
      containers:
      - name: daemon
        image: fluent/fluent-bit:1.8
        volumeMounts:
        - name: varlog
          mountPath: /var/log
    volumes:
    - name: varlog
      hostPath:
        path: /var/log