deployment

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Deployment 管理

Deployment 管理

概述

概述

Deployment 滚动更新、回滚、扩缩容等技能。
Deployment 滚动更新、回滚、扩缩容等技能。

基础操作

基础操作

查看 Deployment

查看 Deployment

bash
undefined
bash
undefined

列出 Deployment

列出 Deployment

kubectl get deployments kubectl get deploy -o wide kubectl get deploy -n namespace
kubectl get deployments kubectl get deploy -o wide kubectl get deploy -n namespace

详细信息

详细信息

kubectl describe deploy deployment-name kubectl get deploy deployment-name -o yaml
undefined
kubectl describe deploy deployment-name kubectl get deploy deployment-name -o yaml
undefined

创建 Deployment

创建 Deployment

yaml
undefined
yaml
undefined

deployment.yaml

deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"

```bash
kubectl apply -f deployment.yaml
kubectl create deployment nginx --image=nginx:1.20 --replicas=3
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"

```bash
kubectl apply -f deployment.yaml
kubectl create deployment nginx --image=nginx:1.20 --replicas=3

删除 Deployment

删除 Deployment

bash
kubectl delete deploy deployment-name
kubectl delete -f deployment.yaml
bash
kubectl delete deploy deployment-name
kubectl delete -f deployment.yaml

扩缩容

扩缩容

bash
undefined
bash
undefined

手动扩缩容

手动扩缩容

kubectl scale deploy deployment-name --replicas=5
kubectl scale deploy deployment-name --replicas=5

自动扩缩容 (HPA)

自动扩缩容 (HPA)

kubectl autoscale deploy deployment-name --min=2 --max=10 --cpu-percent=80
kubectl autoscale deploy deployment-name --min=2 --max=10 --cpu-percent=80

查看 HPA

查看 HPA

kubectl get hpa kubectl describe hpa deployment-name
undefined
kubectl get hpa kubectl describe hpa deployment-name
undefined

HPA 配置

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: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
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: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

滚动更新

滚动更新

更新策略配置

更新策略配置

yaml
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%           # 最多超出期望副本数
      maxUnavailable: 25%     # 最多不可用副本数
yaml
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%           # 最多超出期望副本数
      maxUnavailable: 25%     # 最多不可用副本数

执行更新

执行更新

bash
undefined
bash
undefined

更新镜像

更新镜像

kubectl set image deploy/deployment-name container-name=nginx:1.21
kubectl set image deploy/deployment-name container-name=nginx:1.21

更新环境变量

更新环境变量

kubectl set env deploy/deployment-name ENV_VAR=value
kubectl set env deploy/deployment-name ENV_VAR=value

更新资源限制

更新资源限制

kubectl set resources deploy/deployment-name -c container-name --limits=cpu=200m,memory=256Mi
kubectl set resources deploy/deployment-name -c container-name --limits=cpu=200m,memory=256Mi

应用配置文件更新

应用配置文件更新

kubectl apply -f deployment.yaml
kubectl apply -f deployment.yaml

记录更新原因

记录更新原因

kubectl set image deploy/deployment-name container-name=nginx:1.21 --record
undefined
kubectl set image deploy/deployment-name container-name=nginx:1.21 --record
undefined

查看更新状态

查看更新状态

bash
undefined
bash
undefined

查看滚动更新状态

查看滚动更新状态

kubectl rollout status deploy/deployment-name
kubectl rollout status deploy/deployment-name

查看更新历史

查看更新历史

kubectl rollout history deploy/deployment-name kubectl rollout history deploy/deployment-name --revision=2
kubectl rollout history deploy/deployment-name kubectl rollout history deploy/deployment-name --revision=2

暂停/恢复更新

暂停/恢复更新

kubectl rollout pause deploy/deployment-name kubectl rollout resume deploy/deployment-name
undefined
kubectl rollout pause deploy/deployment-name kubectl rollout resume deploy/deployment-name
undefined

回滚

回滚

bash
undefined
bash
undefined

回滚到上一版本

回滚到上一版本

kubectl rollout undo deploy/deployment-name
kubectl rollout undo deploy/deployment-name

回滚到指定版本

回滚到指定版本

kubectl rollout undo deploy/deployment-name --to-revision=2
kubectl rollout undo deploy/deployment-name --to-revision=2

查看回滚状态

查看回滚状态

kubectl rollout status deploy/deployment-name
undefined
kubectl rollout status deploy/deployment-name
undefined

高级配置

高级配置

健康检查

健康检查

yaml
spec:
  template:
    spec:
      containers:
      - name: app
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        startupProbe:
          httpGet:
            path: /startup
            port: 8080
          failureThreshold: 30
          periodSeconds: 10
yaml
spec:
  template:
    spec:
      containers:
      - name: app
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        startupProbe:
          httpGet:
            path: /startup
            port: 8080
          failureThreshold: 30
          periodSeconds: 10

亲和性配置

亲和性配置

yaml
spec:
  template:
    spec:
      affinity:
        # Pod 反亲和(分散部署)
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: nginx
              topologyKey: kubernetes.io/hostname
        # 节点亲和
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values:
                - worker
yaml
spec:
  template:
    spec:
      affinity:
        # Pod 反亲和(分散部署)
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: nginx
              topologyKey: kubernetes.io/hostname
        # 节点亲和
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values:
                - worker

容忍度

容忍度

yaml
spec:
  template:
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
yaml
spec:
  template:
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

常见场景

常见场景

场景 1:蓝绿部署

场景 1:蓝绿部署

bash
undefined
bash
undefined

创建新版本 Deployment

创建新版本 Deployment

kubectl apply -f deployment-v2.yaml
kubectl apply -f deployment-v2.yaml

切换 Service 到新版本

切换 Service 到新版本

kubectl patch service my-service -p '{"spec":{"selector":{"version":"v2"}}}'
kubectl patch service my-service -p '{"spec":{"selector":{"version":"v2"}}}'

验证后删除旧版本

验证后删除旧版本

kubectl delete deploy deployment-v1
undefined
kubectl delete deploy deployment-v1
undefined

场景 2:金丝雀发布

场景 2:金丝雀发布

yaml
undefined
yaml
undefined

创建金丝雀 Deployment(少量副本)

创建金丝雀 Deployment(少量副本)

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-canary spec: replicas: 1 selector: matchLabels: app: nginx track: canary template: metadata: labels: app: nginx track: canary spec: containers: - name: nginx image: nginx:1.21
undefined
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-canary spec: replicas: 1 selector: matchLabels: app: nginx track: canary template: metadata: labels: app: nginx track: canary spec: containers: - name: nginx image: nginx:1.21
undefined

场景 3:批量重启 Pod

场景 3:批量重启 Pod

bash
undefined
bash
undefined

触发滚动重启

触发滚动重启

kubectl rollout restart deploy/deployment-name
kubectl rollout restart deploy/deployment-name

或添加注解触发更新

或添加注解触发更新

kubectl patch deploy deployment-name -p '{"spec":{"template":{"metadata":{"annotations":{"date":"'$(date +%s)'"}}}}}'
undefined
kubectl patch deploy deployment-name -p '{"spec":{"template":{"metadata":{"annotations":{"date":"'$(date +%s)'"}}}}}'
undefined

场景 4:查看 Pod 分布

场景 4:查看 Pod 分布

bash
undefined
bash
undefined

查看 Pod 所在节点

查看 Pod 所在节点

kubectl get pods -l app=nginx -o wide
kubectl get pods -l app=nginx -o wide

按节点统计

按节点统计

kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.nodeName}{"\n"}{end}' | sort | uniq -c
undefined
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.nodeName}{"\n"}{end}' | sort | uniq -c
undefined

故障排查

故障排查

问题排查方法
更新卡住
kubectl rollout status
, 检查 Pod 状态
Pod 无法调度
kubectl describe pod
, 检查资源和亲和性
更新后服务异常检查健康检查配置、回滚
HPA 不生效检查 metrics-server、资源配置
bash
undefined
问题排查方法
更新卡住
kubectl rollout status
, 检查 Pod 状态
Pod 无法调度
kubectl describe pod
, 检查资源和亲和性
更新后服务异常检查健康检查配置、回滚
HPA 不生效检查 metrics-server、资源配置
bash
undefined

查看 Deployment 事件

查看 Deployment 事件

kubectl describe deploy deployment-name | grep -A 20 Events
kubectl describe deploy deployment-name | grep -A 20 Events

查看 ReplicaSet

查看 ReplicaSet

kubectl get rs -l app=nginx kubectl describe rs rs-name
undefined
kubectl get rs -l app=nginx kubectl describe rs rs-name
undefined