【赵渝强老师】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
相关推荐
刚入门的大一新生16 分钟前
Linux-进程间通信1
linux·运维·服务器
阿里云云原生25 分钟前
HiRoute:Jev 模型智能路由实践
云原生
张宇Joaquin40 分钟前
Linux系统下磁盘扇区512n、512e和4kn的区别
linux·运维·数据库
道虽迩,不行不至44 分钟前
数据库自动连库执行增量脚本-Linux
linux·数据库
GeW1 小时前
新质生产力发展路线图来了,Linux和数据库人该怎么接
linux·数据库
yunwei371 小时前
eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器
linux·后端·性能优化
阿里云云原生1 小时前
云栖实录丨面向 AgenticOps 的开源建设:采集标准化、统一语义建模与能力评测
云原生·开源
cubestudio1 小时前
云原生分布式训练怎么调度才不浪费算力?CubeStudio 分布式训练与加速架构解析(CRD+Operator / gang 调度 / 亲和反亲和 / GPU 利用率 / 共享 GPU)
人工智能·云原生·gpu
张宇Joaquin1 小时前
自研SP600系列网卡驱动跟麒麟V10 SP3 2403配套关系
linux·运维·网络
mengge.cloud2 小时前
1019Namespace ,Contexts ,Kubernetes Pod
运维·服务器·网络·云原生·容器·kubernetes·云计算