【赵渝强老师】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
相关推荐
祖力559 分钟前
进程间通信(IPC机制):消息队列与共享内存
linux·消息队列·共享内存·通信·进程间通信
Learn-Share_HY36 分钟前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
CJY6211 小时前
Kubernetes 存储管理
云原生
缘友一世1 小时前
GLM-5.3-NVFP4 部署实战系列[二]Docker 镜像选择与补丁镜像构建:纯 Python overlay,不重编一行 CUDA
python·docker·容器·vllm
harmony&2 小时前
Kubernetes 实战:认证授权、集群 Dashboard 与动态卷供应全解析
云原生·容器·kubernetes
数字化小张2 小时前
Docker镜像优化——从1GB到100MB的瘦身实践
docker
java_logo2 小时前
Docker 部署 MinIO:轻松搭建 S3 兼容对象存储平台
运维·docker·容器·对象存储·minio·轩辕镜像·minio部署
祖力552 小时前
进程间通信(IPC机制):信号
linux·运维·服务器·进程·进程间通信·多任务·ipc
GKxx2 小时前
在 HarmonyOS 上给 QEMU 搭一个最小 aarch64 Linux guest(内核 + busybox initramfs)
linux·华为·qemu·harmonyos·鸿蒙·鸿蒙pc
大大大大晴天️2 小时前
大数据上 K8s 的三种运行范式:离线计算、实时流处理与分析服务
大数据·kubernetes