工作负载管理一组Pod, 可以让Pod有自恢复的能力。

Deployment 用于管理运行一个应用负载的一组 Pod,通常适用于不保持状态的负载。

1 Deployment

image.png

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  strategy:
    type: Recreate # 删除旧的Pod,然后再创建新的Pod,默认滚动更新
  paused: true  #默认false, 当为true时,不是产生一次部署的副本集(rs)
  revisionHistoryLimit: 15 # 默认保留十个副本集,修改为15个
  progressDeadlineSeconds: 600 # 如果在指定的时间内没有达到预期的更新状态,Kubernetes 将认为更新失败。
  replicas: 3   # 副本数
  selector:     #选择器
    matchLabels:   #匹配标签
      app: nginx
  template:       #Pod模版
    metadata:     #元数据
      labels:     #标签
        app: nginx
    spec:
      containers: #容器
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
# 查看一个deployment产生三个资源
kubectl get pod,deploy,rs

一个deployment产生三个资源

Deployment控制ReplicaSet,ReplicaSet控制Pod的副本数

1.1 Deployment滚动更新

上述示例中更改nginx:1.14.2为其他版本时,启动新的副本集中的Pod,杀死老的副本集中的Pod。始终保持一次部署中存在可用Pod。

# 修改yml,重新应用。需要让k8s记录此次应用
kubectl apply -f nginx-deployment.yml --record

# yml文件不存在的时候也可以修改资源
kubectl get deploy,rs
kubectl edit deployment.apps/nginx-deployment

# 命令行修改镜像的方式
kubectl set image deploy nginx-deployment nginx=nginx:1.27.1

每次滚动更新都会产生一条ReplicaSet资源(更新的版本就是通过不同的rs资源来控制)

Deployment 每部署一个新版本,就会创建一个新的副本集

rs1 (副本集1)

rs2(副本集2)

……..

rsN(副本集N)

# 查看副本集历史
kubectl rollout history deployment nginx-deployment
# 回滚
kubectl rollout undo deployment nginx-deployment --to-revision=1
# paused: true暂停部署之后恢复部署
kubectl rollout resume deployment nginx-deployment