美文网首页
Kubernetes——Deployment水平更新以及滚动更新

Kubernetes——Deployment水平更新以及滚动更新

作者: 懒无趣 | 来源:发表于2020-12-31 08:00 被阅读0次

    控制器

    控制循环

    
    for {
      实际状态 := 获取集群中对象X的实际状态(Actual State)
      期望状态 := 获取集群中对象X的期望状态(Desired State)
      if 实际状态 == 期望状态{
        什么都不做
      } else {
        执行编排动作,将实际状态调整为期望状态
      }
    }
    

    以 Deployment 为例,我和你简单描述一下它对控制器模型的实现:

    1. Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态;
    2. Deployment 对象的 Replicas 字段的值就是期望状态;
    3. Deployment 控制器将两个状态做比较,然后根据比较结果,确定是创建 Pod,还是删除已有的 Pod,这个比较多过程叫做调谐(Reconcile)。这个调谐的过程,则被称作“Reconcile Loop”(调谐循环)或者“Sync Loop”(同步循环)。

    Deployment

    Pod 的“水平扩展 / 收缩”(horizontal scaling out/in)以及更新,控制ReplicaSet实现

    可以理解为:ReplicaSet 操作 pod实现水平扩展和水平收缩,deployment 操作replicaSet实现滚动更新

    ReplicaSet 的 DESIRED、CURRENT 和 READY 字段的含义,和 Deployment 中是一致的。所以,相比之下,Deployment 只是在 ReplicaSet 的基础上,添加了 UP-TO-DATE 这个跟版本有关的状态字段。

    水平扩展/收缩

    kubectl scale deployment nginx-deployment --replicas=4
    

    即deployment控制replicaSet的Pod数量属性即可

    Deployment 和 ReplicaSet 和 Pod 关系图

    滚动更新

    一个应用的版本,对应的正是一个 ReplicaSet;这个版本应用的 Pod 数量,则由 ReplicaSet 通过它自己的控制器(ReplicaSet Controller)来保证。

    1. 修改更新内容
    kubectl edit deployment/nginx-deployment
    
    1. 获取滚动更新状态
    $ kubectl rollout status deployment/nginx-deployment
    Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
    deployment.apps/nginx-deployment successfully rolled out
    
    
    $ kubectl describe deployment nginx-deployment
    ...
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
    ...
      Normal  ScalingReplicaSet  24s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 1
      Normal  ScalingReplicaSet  22s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 2
      Normal  ScalingReplicaSet  22s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 2
      Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 1
      Normal  ScalingReplicaSet  19s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 3
      Normal  ScalingReplicaSet  14s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 0
    
    1. 可以看到,首先,当你修改了 Deployment 里的 Pod 定义之后,Deployment Controller 会使用这个修改后的 Pod 模板,创建一个新的 ReplicaSet(hash=1764197365),这个新的 ReplicaSet 的初始 Pod 副本数是:0。
    2. 然后,在 Age=24 s 的位置,Deployment Controller 开始将这个新的 ReplicaSet 所控制的 Pod 副本数从 0 个变成 1 个,即:“水平扩展”出一个副本。
    3. 紧接着,在 Age=22 s 的位置,Deployment Controller 又将旧的 ReplicaSet(hash=3167673210)所控制的旧 Pod 副本数减少一个。
      即:“水平收缩”成两个副本。如此交替进行,新 ReplicaSet 管理的 Pod 副本数,从 0 个变成 1 个,再变成 2 个,最后变成 3 个。而旧的 ReplicaSet 管理的 Pod 副本数则从 3 个变成 2 个,再变成 1 个,最后变成 0 个。这样,就完成了这一组 Pod 的版本升级过程。

    相关文章

      网友评论

          本文标题:Kubernetes——Deployment水平更新以及滚动更新

          本文链接:https://www.haomeiwen.com/subject/grqloktx.html