【赵渝强老师】Kubernetes(K8s)中的金丝雀升级

在项目迭代开发的过程中,对应用进行上线部署是不可避免的。项目的上线部署策略主要有以下三种:金丝雀升级、蓝绿升级和滚动升级。下面将重点介绍金丝雀升级策略以及在Kubernetes中如何实现它。

视频讲解如下
【赵渝强老师】Kubernetes中的金丝雀升级

金丝雀部署,也可以叫做灰度部署。它通过在项目部署升级过程中,先让部分用户继续使用旧版本,而另一部分用户开始使用新版本。如果新版本在升级过程中没有发生问题,那么逐步扩大新版本的用户使用范围,直到使用旧版本的用户都迁移到新的新版本上面来。通过使用金丝雀部署可以最大程度地保证系统整体的稳定性,并在部署升级过程的早期就可以发现和解决问题,以保证项目部署升级的进度。下图说明了金丝雀部署升级的过程。

下面通过一个具体的示例来演示如何实现应用的金丝雀部署升级。

(1)创建"canary-demo-v1.yaml"文件,并输入下面的内容。

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: canary-demo
  labels:
    app: canary-demo
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: canary-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary-demo-v1
  labels:
    app: canary-demo
spec:
  replicas: 10
  selector:
    matchLabels:
      app: canary-demo
      version: v1.0.0
  template:
    metadata:
      labels:
        app: canary-demo
        version: v1.0.0
    spec:
      containers:
      - name: canary-demo
        image: collenzhao/k8s-deployment-strategies
        ports:
        - name: http
          containerPort: 8080
        env:
        - name: VERSION
          value: v1.0.0

# 这里使用了Service的服务来实现Deployment的负载均衡。

(2)使用命令应用"canary-demo-v1.yaml"文件。

powershell 复制代码
kubectl apply -f canary-demo-v1.yaml

(3)获取Service的信息。

powershell 复制代码
kubectl get service canary-demo

# 输出的信息如下:
NAME          TYPE         CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
canary-demo   NodePort   10.1.119.250   <none>        80:30952/TCP   4s

(4)通过Service访问Deployment。

powershell 复制代码
curl 10.1.119.250:80

#输出的信息如下:
Host: canary-demo-v1-78b6cd78db-skjng, Version: v1.0.0

# 这里可以看出目前应用的版本是v1.0.0。

(5)使用金丝雀来升级应用,创建"canary-demo-v2.yaml"文件并输入下面的内容:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary-demo-v2
  labels:
    app: canary-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: canary-demo
      version: v2.0.0
  template:
    metadata:
      labels:
        app: canary-demo
        version: v2.0.0
    spec:
      containers:
      - name: canary-demo
        image: collenzhao/k8s-deployment-strategies
        ports:
        - name: http
          containerPort: 8080
        env:
        - name: VERSION
          value: v2.0.0

(6)单开启两个命令行窗口使用"watch"命令来监控Deployment和Pod的变化。

powershell 复制代码
kubectl get --watch deployment
kubectl get --watch pod

(7)执行应用的升级。

powershell 复制代码
kubectl apply -f canary-demo-v2.yaml

(8)观察Deployment和Pod的变化,如下图所示。

从上图可以看出v1.0.0的版本共有10个实例;而v2.0.0的版本只有1个。

(9)执行下面的脚本来请求应用程序。

powershell 复制代码
for a in {1..11}
  do 
    sleep 1;
    curl "10.1.119.250:80";
  done

# 输出的信息如下:
Host: canary-demo-v1-78b6cd78db-nbbjx, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-nbbjx, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-7zjwf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-dskpc, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-fdrwp, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0

# 提示:for循环中一共循环了11次,其中:10次访问了v1.0.0的版本;
# 而只有1次访问了v2.0.0的版本。

(10)将v2.0.0版本的实例扩容到5个,v1.0.0版本的实例缩容到5个。

powershell 复制代码
kubectl scale --replicas=5 deploy canary-demo-v2
kubectl scale --replicas=5 deploy canary-demo-v1

(11)观察Deployment的变化,如下图所示。

powershell 复制代码
kubectl get --watch deployment

(12)重新执行下面的脚本。

powershell 复制代码
for a in {1..10}
  do 
    sleep 1;
    curl "10.1.119.250:80";
  done

# 输出的信息如下:
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-9dphd, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-hr9x8, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-7zjwf, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-fdrwp, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-hr9x8, Version: v1.0.0

(12)停止v1.0.0的版本,并把v2.0.0版本的实例扩容到10个。

powershell 复制代码
kubectl delete deployment.apps/canary-demo-v1
kubectl scale --replicas=10 deploy canary-demo-v2

# 提示:这时候应用将全部升级到v2.0.0的版本。
# 如果再次执行for循环的脚本,所有请求都将返回下面的信息。

Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-hs4k2, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-hs4k2, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-5h5sm, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-5h5sm, Version: v2.0.0

(13)清理测试的数据。

powershell 复制代码
kubectl delete all -l app=canary-demo
相关推荐
鹤落晴春1 小时前
【K8s】配置存储卷
云原生·容器·kubernetes
Qt程序员2 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
The Sheep 20232 小时前
Vue复习
linux·服务器·数据库
兄台の请冷静2 小时前
Linux 安装es
linux·elasticsearch·jenkins
fengyehongWorld2 小时前
Linux rg命令
linux
pride.li2 小时前
海思视觉Hi3516CV610--开机自动设置ip
linux·网络·网络协议·tcp/ip
我叫张小白。2 小时前
CentOS 7 安装 Docker并配置镜像加速(完整指南)
linux·docker·centos
张忠琳3 小时前
【client-go v0.36.1】(DeltaFIFO Part 1)DeltaFIFO 超深度分析 — 模块定位、类结构、接口层次、构造与初始化
云原生·kubernetes·deltafifo·informer·client-go
Titan20244 小时前
Linux动静态库
linux·服务器·c++