← 返回首页
🚀

Kubernetes Deployment详解

📂 devops ⏱ 2 min 300 words

Kubernetes Deployment详解

Deployment概述

Deployment提供声明式的Pod更新,支持滚动更新和回滚。

Deployment配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  
  # 更新策略
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多多出的Pod数
      maxUnavailable: 0  # 最多少的Pod数
  
  # Pod模板
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
        - name: myapp
          image: myapp:v1
          ports:
            - containerPort: 8080
          
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
          
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5

更新策略

RollingUpdate

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 25%      # 滚动更新时最多增加25%的Pod
    maxUnavailable: 25% # 滚动更新时最多减少25%的Pod

Recreate

strategy:
  type: Recreate  # 先删除旧Pod,再创建新Pod

更新应用

更新镜像

# 更新镜像
kubectl set image deployment/myapp myapp=myapp:v2

# 或修改yaml后应用
kubectl apply -f deployment.yaml

查看更新状态

# 查看滚动更新状态
kubectl rollout status deployment/myapp

# 查看更新历史
kubectl rollout history deployment/myapp

# 查看特定版本详情
kubectl rollout history deployment/myapp --revision=2

回滚操作

# 回滚到上一版本
kubectl rollout undo deployment/myapp

# 回滚到特定版本
kubectl rollout undo deployment/myapp --to-revision=2

# 暂停/恢复滚动更新
kubectl rollout pause deployment/myapp
kubectl rollout resume deployment/myapp

自动伸缩

水平Pod伸缩(HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
# 创建HPA
kubectl autoscale deployment myapp --min=2 --max=10 --cpu-percent=70

# 查看HPA
kubectl get hpa

实践:零停机更新

# v1版本
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
        - name: myapp
          image: myapp:v1
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
# 执行更新
kubectl apply -f deployment-v2.yaml

# 监控更新过程
kubectl rollout status deployment/myapp

# 如果有问题,立即回滚
kubectl rollout undo deployment/myapp

Deployment调试

# 查看Pod状态
kubectl get pods -l app=myapp

# 查看Pod事件
kubectl describe pod pod_name

# 查看Deployment状态
kubectl describe deployment myapp

# 查看ReplicaSet
kubectl get rs

总结

Deployment是Kubernetes中最常用的 workload。掌握其更新策略和回滚机制,可以实现应用的安全、零停机更新。