← 返回首页
🔧

Kubernetes Deployment:应用部署与更新

📂 devops ⏱ 3 min 410 words

Kubernetes Deployment:应用部署与更新

Deployment概述

Deployment是Kubernetes中管理无状态应用的核心对象,提供声明式更新、滚动升级和回滚能力。

创建Deployment

命令行创建

# 基本创建
kubectl create deployment nginx --image=nginx:1.25 --replicas=3

# 指定命名空间
kubectl create deployment nginx --image=nginx:1.25 -n production

# 从YAML创建
kubectl apply -f deployment.yaml

YAML声明式配置

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20

更新策略

RollingUpdate(滚动更新)

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1        # 最多多出1个Pod
    maxUnavailable: 0  # 不允许Pod不可用

Recreate(重建)

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

滚动更新

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

# 查看更新状态
kubectl rollout status deployment/nginx-deployment

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

回滚操作

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

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

# 查看回滚状态
kubectl rollout status deployment/nginx-deployment

扩缩容

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

# 自动扩缩容(HPA)
kubectl autoscale deployment nginx-deployment --min=3 --max=10 --cpu-percent=80

# 查看HPA
kubectl get hpa

暂停与恢复

# 暂停Deployment(用于批量修改)
kubectl rollout pause deployment/nginx-deployment

# 执行多次修改
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl set resources deployment/nginx-deployment -c nginx --limits=cpu=200m,memory=256Mi

# 恢复Deployment(只触发一次更新)
kubectl rollout resume deployment/nginx-deployment

高级配置

容器环境变量

spec:
  template:
    spec:
      containers:
      - name: app
        env:
        - name: APP_ENV
          value: "production"
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: db-host
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password

卷挂载

spec:
  template:
    spec:
      containers:
      - name: app
        volumeMounts:
        - name: config
          mountPath: /app/config
        - name: data
          mountPath: /app/data
      volumes:
      - name: config
        configMap:
          name: app-config
      - name: data
        persistentVolumeClaim:
          claimName: app-data-pvc

节点亲和性

spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: zone
                operator: In
                values:
                - zone1
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "special"
        effect: "NoSchedule"

实践:生产级Deployment

# production-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
    version: v1
  annotations:
    deployment.kubernetes.io/revision: "1"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web-app
        version: v1
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: web
        image: myapp:1.0
        ports:
        - containerPort: 8080
        env:
        - name: APP_ENV
          value: "production"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 10"]

常用命令汇总

# 查看Deployment
kubectl get deployments
kubectl get deploy

# 查看详细信息
kubectl describe deployment nginx-deployment

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

# 强制更新
kubectl rollout restart deployment/nginx-deployment

# 删除Deployment
kubectl delete deployment nginx-deployment

总结

Deployment是Kubernetes中管理应用部署的核心工具。掌握滚动更新、回滚和扩缩容策略,是实现应用持续交付的关键。