zoukankan      html  css  js  c++  java
  • Kubernetes技术分析之灰度升级

    【编者的话】Docker的流行激活了一直不温不火的PaaS,随着而来的是各类Micro-PaaS的出现,Kubernetes是其中最具代表性的一员,它是Google多年大规模容器管理技术的开源版本。本系列文章将逐一分析Kubernetes,本文介绍 Kubernetes对灰度升级的支持。 

    Kubernetes灰度升级

    灰度升级(又称灰度发布、灰度更新)是指在黑与白之间,能够平滑过渡的一种发布方式。ABtest就是一种灰度发布方式,让一部用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

    Kubenetes中支持灰度升级,现在我们先通过一个例子演示应用从V1版本灰度升级到V2版本,创建V1版本的Replication Controller ,配置文件my-web-v1-rc.yaml

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: my-web-v1
    spec:
    selector:
    app: my-web
    version: v1
    template:
    metadata:
      labels:
        app: my-web
        version: v1
    spec:
      containers:
      - name: my-web
        image: my-web:v1
        ports:
        - containerPort: 80
          protocol: TCP 
    



    通过配置文件创建Replication Controller

    $ kubectl create -f my-web-v1-rc.yaml 
    replicationcontrollers/my-web-v1
    
    $ kubectl get rc my-web-v1
    CONTROLLER   CONTAINER(S)   IMAGE(S)    SELECTOR                REPLICAS
    my-web-v1    my-web         my-web:v1   app=my-web,version=v1   1 
    


    然后扩容Replication Controller到副本数目4:

    $ kubectl scale rc my-web-v1 --replicas=4
    scaled
    
    $ kubectl get pods -l app=my-web
    NAME              READY     STATUS    RESTARTS   AGE
    my-web-v1-2r7ag   1/1       Running   0          6s
    my-web-v1-mv9wg   0/1       Running   0          6s
    my-web-v1-qvi4r   1/1       Running   0          6s
    my-web-v1-v1w9e   1/1       Running   0          13s
    


    现在需要升级V1版本到V2版本,V2版本的Replication Controller配置文件my-web-v2-rc.yaml:

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: my-web-v2
    spec:
    selector:
    app: my-web
    version: v2
    template:
    metadata:
      labels:
        app: my-web
        version: v2
    spec:
      containers:
      - name: my-web
        image: my-web:v2
        ports:
        - containerPort: 80
          protocol: TCP
    


    开始灰度升级:

    $ kubectl rolling-update my-web-v1 -f my-web-v2-rc.yaml --update-period=10s
    Creating my-web-v2
    At beginning of loop: my-web-v1 replicas: 3, my-web-v2 replicas: 1
    Updating my-web-v1 replicas: 3, my-web-v2 replicas: 1
    At end of loop: my-web-v1 replicas: 3, my-web-v2 replicas: 1
    At beginning of loop: my-web-v1 replicas: 2, my-web-v2 replicas: 2
    Updating my-web-v1 replicas: 2, my-web-v2 replicas: 2
    At end of loop: my-web-v1 replicas: 2, my-web-v2 replicas: 2
    At beginning of loop: my-web-v1 replicas: 1, my-web-v2 replicas: 3
    Updating my-web-v1 replicas: 1, my-web-v2 replicas: 3
    At end of loop: my-web-v1 replicas: 1, my-web-v2 replicas: 3
    At beginning of loop: my-web-v1 replicas: 0, my-web-v2 replicas: 4
    Updating my-web-v1 replicas: 0, my-web-v2 replicas: 4
    At end of loop: my-web-v1 replicas: 0, my-web-v2 replicas: 4
    Update succeeded. Deleting my-web-v1
    my-web-v2
    


    升级开始后,首先根据提供的配置文件创建新的Replication Controller(V2版本),然后每隔10s(通过--update-period设置)逐步增加新的Replication Controller(V1版本)的副本数,逐步减少旧的Replication Controller的副本数,升级完成后后删除旧的Replication Controller,保留新的Replication Controller,即实现灰度升级。

    Updating my-web-v1 replicas: 3, my-web-v2 replicas: 1
    Updating my-web-v1 replicas: 2, my-web-v2 replicas: 2
    Updating my-web-v1 replicas: 1, my-web-v2 replicas: 3
    Updating my-web-v1 replicas: 0, my-web-v2 replicas: 4
    


    升级期间通过查询Pod,V2版本的Pod目前相应增加逐渐替换V1版本的Pod,当然这是通过调整Replication Controller的副本数目来控制:

    $ kubectl get rc,pods -l app=my-web
    CONTROLLER   CONTAINER(S)   IMAGE(S)    SELECTOR                REPLICAS
    my-web-v1    my-web         my-web:v1   app=my-web,version=v1   2
    my-web-v2    my-web         my-web:v2   app=my-web,version=v2   2
    NAME              READY     STATUS    RESTARTS   AGE
    my-web-v1-2r7ag   1/1       Running   0          1m
    my-web-v1-mv9wg   1/1       Running   0          1m
    my-web-v2-bg8ur   1/1       Running   0          18s
    my-web-v2-qr33c   1/1       Running   0          41s
    


    待升级完成,即V2的Pod完全替换V1的Pod,同时V1的Replication Controller也被V2的Replication Controller替换:

    $ kubectl get rc,pods -l app=my-web
    CONTROLLER   CONTAINER(S)   IMAGE(S)    SELECTOR                REPLICAS
    my-web-v2    my-web         my-web:v2   app=my-web,version=v2   4
    NAME              READY     STATUS    RESTARTS   AGE
    my-web-v2-785ok   1/1       Running   0          35s
    my-web-v2-bg8ur   1/1       Running   0          1m
    my-web-v2-qr33c   1/1       Running   0          1m
    my-web-v2-y2es3   1/1       Running   0          57s
    


    如果在升级过程中,发生错误中途退出的时候,可以选择继续升级,继续升级的话Kubernetes能够智能地判断出升级中断之前的阶段。然后紧接着继续执行升级。

    另外也可以进行回退,命令如下。

    $ kubectl rolling-update my-web-v1 my-web-v2 --rollback --image=my-web:v2
    Found existing update in progress (my-web-v2), resuming.
    Found desired replicas.Continuing update with existing controller my-web-v1.
    At beginning of loop: my-web-v2 replicas: 1, my-web-v1 replicas: 3
    Updating my-web-v2 replicas: 1, my-web-v1 replicas: 3
    At end of loop: my-web-v2 replicas: 1, my-web-v1 replicas: 3
    At beginning of loop: my-web-v2 replicas: 0, my-web-v1 replicas: 4
    Updating my-web-v2 replicas: 0, my-web-v1 replicas: 4
    At end of loop: my-web-v2 replicas: 0, my-web-v1 replicas: 4
    Update succeeded. Deleting my-web-v2
    my-web-v2
    


    回退的方式实际上就是升级的逆操作,逐步增加旧的Replication Controller(V1版本)的副本数,逐步减少新的Replication Controller(V2版本)的副本数。

    来源:https://blog.csdn.net/shenshouer/article/details/49156299

  • 相关阅读:
    C# GDI+图形程序设计看书笔记
    SQL2008转SQL2005
    vb6 调用 .Net Dll
    VS编译后的postevent
    Bind 和 ScaffoldColumn
    转: MarshalAs与StructLayout
    Microsoft .NET Compact Framework 开发常见问题解答
    .Net2.0 使用ConfigurationManager读写配置文件
    在.NET中使用命名管道完成进程间通信[转]
    C# 取电信公网IP并发送邮件
  • 原文地址:https://www.cnblogs.com/gao88/p/11276103.html
Copyright © 2011-2022 走看看