K8S中Deployment

Deployment 同样也是Kubernetes 系统的一个核心概念,主要职责和RC一样的都是保证 Pod 的数量和健康,二者大部分功能都是完全一致的,可以看成是一个升级版的RC控制器,

特征:

RC 的全部功能:

Deployment 具备上面描述的RC 的全部功能

事件和状态查看:可以查看Deployment 的升级详细进度和状态 回滚:当升级Pod 的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本

版本记录:每一次对Deployment 的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础

暂停和启动:对于每一次升级都能够随时暂停和启动

一个Deployment拥有多个Replica Set(RS),而一个Replica Set拥有一个或多个Pod。一个Deployment控制多个rs主要是为了支持回滚机 制,每当Deployment操作时,Kubernetes会重新生成一个Replica Set 并保留,以后有需要的话就可以回滚至之前的状态。

vim nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    k8s-app: nginx-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        ports:
        - containerPort: 80

kubectl get po,deploy -o wide   #查看详细信息

滚动更新

spec:
  replicas: 3
  minReadySeconds: 5       #在启动后5秒中后分发流量
  strategy:
  # 指定滚动更新的策略
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1

minReadySeconds:

  1. Kubernetes在等待设置的时间后才进行升级

  2. 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了

  3. 如果没有设置该值,在某些极端情况下可能会造成服务不正常运行

maxSurge:

  1. 升级过程中最多可以比原先设置多出的POD数量

  2. 例如:maxSurge=1,replicas=5,则表示Kubernetes会先启动1一 个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个 POD。

maxUnavaible:

  1. 升级过程中最多有多少个POD处于无法提供服务的状态

  2. 当maxSurge不为0时,该值也不能为0

  3. 例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多 会有1个POD处于无法服务的状态。

#暂停升级
kubectl rollout pause deployment <deployment>

#继续升级
kubectl rollout resume deployment <deployment>

#升级后可查看
kubectl get rs

回滚 Deployment

查看Deployment的升级历史:

kubectl rollout history deployment nginx-deploy

deployment.apps/nginx-deploy 
REVISION  CHANGE-CAUSE
1         <none>   #这里是改变的原因如果需要记录的话启动加参数--record=true
2         <none>

kubectl apply -f nginx.yaml --record=true

上生产时,最好通过设置Deployment的.spec.revisionHistoryLimit 来 限制最大保留的revision number,比如15个版本,回滚的时候一般只会 回滚到最近的几个版本就足够了。其实rollout history中记录的 revision都和 ReplicaSets一一对应。如果手动delete 某个 ReplicaSet,对应的rollout history就会被删除,也就是还说你无法回滚到这个revison了。

rollout history和ReplicaSet 的对应关系,可以在kubectl describe rs $RSNAME 返回的revision字段中得到,这里的revision就 对应着 rollout history返回的revison。

回退版本:

#回退到上一个版本
kubectl rollout undo deployment nginx-deploy

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