如何在Kubernetes上进行Canary部署?详细分步指南

2021年11月20日17:28:22 发表评论 799 次浏览

Kubernetes进行Canary部署教程介绍

在生产中测试新功能或升级是一个压力很大的过程。你希望频繁推出更改但不影响用户体验。为了最大限度地减少此阶段的停机时间,请设置Canary部署以简化过渡。

你可以在任何基础架构上使用Canary部署。因此,它是Kubernetes中的部署策略之一。

Kubernetes如何进行Canary部署本文带你了解Canary部署是什么、它们如何工作以及如何在 Kubernetes 上进行Canary部署。

先决条件

  • 访问命令行/终端
  • 系统上安装的Docker
  • Kubernetes 或Minikube
  •  在本地机器上完全 配置的 kubectl命令行工具

什么是Canary部署?

一个Canary部署是现有部署的升级版,拥有所有必需的应用程序代码和依赖。它用于测试新功能和升级,以查看它们如何处理生产环境。

当你将Canary部署添加到 Kubernetes 集群时,它由服务通过选择器标签进行管理。该服务将流量路由到具有指定标签的 pod。这使你可以轻松添加或删除部署。

Canary 获得的流量与它启动的 Pod 数量相对应。在大多数情况下,你首先将较小比例的流量路由到Canary,然后随着时间的推移增加数量。

设置两个部署后,你可以监控Canary行为以查看是否出现任何问题。一旦你对它处理请求的方式感到满意,你就可以将所有部署升级到最新版本。

注意:Canary部署得名于一个古老的英国采矿实践。过去,矿工们在进矿前用Canary来测试煤矿的安全。如果Canary安然无恙地回来,矿工们就觉得可以安全进入。然而,如果鸟类真的发生了什么事,它们就会知道矿井里充满了有毒气体。

在 Kubernetes 上设置 Canary 部署

如何在Kubernetes上进行Canary部署?以下步骤向你展示了如何设置 Canary 部署。在本文中,我们创建了一个简单的 Nginx Pod Kubernetes 集群,其中包含一个基本的两句静态 HTML 页面。部署的版本因它们在网页上显示的内容而异。

设置 Canary 部署的过程将根据你运行的应用程序而有所不同。

第 1 步:拉取 Docker 镜像

第一步是为 Kubernetes 集群中的容器拉取或创建映像。由于我们在此示例中构建 Nginx 容器,因此我们使用Docker Hub上可用的 Nginx 映像。

1. 下载镜像:

docker pull nginx

2. 通过列出所有本地图像来验证你是否拥有它:

docker image ls
如何在Kubernetes上进行Canary部署?详细分步指南

步骤 2:创建 Kubernetes 部署 - Kubernetes进行Canary部署教程

1. 使用yaml 文件创建部署定义。使用你选择的文本编辑器并为文件提供名称。我们将命名文件nginx-deployment.yaml并使用Nano创建它:

nano nginx-deployment.yaml

2. 在文件中添加以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx
spec:
 selector:
  matchLabels:
   app: nginx
 replicas: 3
 template:
  metadata:
   labels:
    app: nginx
    version: "1.0"
  spec:
   containers:
    - name: nginx
      image: nginx:alpine
      resources:
      limits:
       memory: "128Mi"
       cpu: "50m"
      ports:
      - containerPort: 80
      volumeMounts:
      - mountPath: /usr/share/nginx/html
        name: index.html
      volumes:
      - name: index.html
        hostPath:
          path: /Users/sofija/Documents/nginx/v1

如何在Kubernetes上进行Canary部署?我们为 Kubernetes 集群创建了3个 Nginx pod副本。所有 pod 都有标签version: "1.0“。此外,它们还有一个包含安装到容器的index.html的主机卷。示例 HTML 文件包括:

<html>
<h1>Hello World!</h1>
<p>This is version 1</p>
</html>

3. 保存并退出文件。

4. 通过运行创建部署:

k apply -f nginx-deployment.yaml

5. 检查你是否已成功部署 pod:

k get pods -o wide

输出应显示三个正在运行的 Nginx pods

第 3 步:创建服务

Kubernetes如何进行Canary部署?下一步是为 Kubernetes 集群创建服务定义。该服务会将请求路由到指定的 pod。

1. 创建一个新的yaml文件:

nano nginx-deployment.service.yaml

2.然后,添加以下内容:

apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: LoadBalancer
selector:
 app: nginx
 version: "1.0"
ports:
- port: 8888
  targetPort: 80

yaml 文件指定了服务类型 – LoadBalancer。它指示服务使用标签app: nginxversion: "1.0". pod 需要有两个标签才能成为服务的一部分。

3. 保存并退出服务文件。

4. 现在,创建服务:

kubectl apply -f nginx-deployment.service.yaml

步骤 4:检查集群的第一个版本

如何在Kubernetes上进行Canary部署?要验证服务是否正在运行,请打开 Web 浏览器,然后导航到服务文件中定义的 IP 和端口号。

要查看服务的外部 IP 地址,请使用以下命令:

kubectl get service

如果你在本地运行 Kubernetes ,请使用 localhost 作为 IP。

由于我们创建的示例集群在本地运行 8888 端口,因此 URL 为:

http://localhost:8888

浏览器应显示来自版本 1Hello World消息。

如何在Kubernetes上进行Canary部署?详细分步指南

第 5 步:创建 Canary 部署 - Kubernetes进行Canary部署教程

随着1.0版本到位的应用,部署第2版,Canary部署。

1. 首先为Canary部署创建yaml文件。运行命令:

nano nginx-canary-deployment.yaml

2. 在文件中添加以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-canary-deployment
spec:
 selector:
  matchLabels:
   app: nginx
 replicas: 3
 template:
  metadata:
   labels:
    app: nginx
    version: "2.0"
  spec:
   containers:
    - name: nginx
      image: nginx:alpine
      resources:
      limits:
       memory: "128Mi"
       cpu: "50m"
      ports:
      - containerPort: 80
      volumeMounts:
      - mountPath: /usr/share/nginx/html
        name: index.html
      volumes:
      - name: index.html
        hostPath:
          path: /Users/sofija/Documents/nginx/v2

Canary 部署文件的内容因三个重要参数而异:

  • 元数据中的名称是nginx-canary-deployment.
  • 它有标签version: “2.0”
  • 它链接到一个 html 文件index.html,其中包括:
<html>
<h1>Hello World!</h1>
<p>This is version 2</p>
</html>

3. 保存并退出文件。

4. 使用以下命令创建Canary部署:

k apply -f nginx-canary-deployment.yaml

5. 验证你是否已成功部署另外三个 Pod:

k get pods -o wide

输出应显示Nginx Canary部署 pod以及原始 Nginx pod

第 6 步:运行 Canary 部署

如何在Kubernetes上进行Canary部署?打开 Web 浏览器并导航到与步骤 4 中相同的 IP 地址。你会注意到网页没有任何更改。这是因为服务文件被配置为仅对带有标签的 pod进行负载平衡version: "1.0"

要测试更新的 Pod,你需要修改服务文件并将部分流量定向到version: "2.0".

1. 为此,请使用以下命令打开yaml文件:

nano nginx-deployment.service.yaml

2. 找到并删除该行version: “1.0”。该文件应包括以下内容:

apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: LoadBalancer
selector:
 app: nginx
ports:
- port: 8888
  targetPort: 80

3. 保存更改并退出文件。

4. 使用以下命令创建更新的服务:

k apply -f nginx-deployment.service.yml

5. 流量现在在版本 1 和版本 2 pod 之间分配。如果你多次刷新网页,你会看到不同的结果,具体取决于服务重定向你的请求的位置。

如何在Kubernetes上进行Canary部署?详细分步指南

注意:在上面的示例中,一半的流量被重定向到Canary部署。这是因为版本 1 有三个副本,版本 2 有三个副本。但是,你可以通过重定向较小比例的请求开始。只需将Canary部署配置为具有更少的 pod。一旦你确信Canary可以处理更多流量,你就可以逐渐增加副本的数量。

第 7 步:监控 Canary 行为

Kubernetes如何进行Canary部署?部署并运行这两个部署后,监视新部署的行为。根据结果​​,你可以回滚部署或升级到较新的版本。

回滚Canary部署

如果你发现Canary没有按预期执行,你可以回滚部署并删除升级后的 pod:

kubectl delete deployment.apps/nginx-canary-deployment

该服务继续对初始(版本 1)pod 的流量进行负载平衡。

推出升级部署

如果你断定Canary部署按预期执行,你可以将所有传入流量路由到升级版本。有以下三种方法:

1.通过修改Docker镜像并构建新部署来升级第一个版本。然后,删除Canary:

kubectl delete deployment.apps/nginx-canary-deployment

2. 你可以保留升级后的 Pod 并删除带有version 1标签的Pod :

kubectl delete deployment.apps/nginx

3. 或者,你甚至可以修改service.yaml文件并将版本说明符添加到selector标签中。这会指示负载均衡器仅将流量路由到版本 2 的pod。

注意:了解Istio 服务网格及其对微服务和Canary部署的好处。

Kubernetes进行Canary部署教程结论

如何在Kubernetes上进行Canary部署?本文应该帮助你了解Canary部署是什么以及它们是如何工作的。此外,你现在知道如何在 Kubernetes 上设置Canary部署。

如果你想构建优化的容器、可靠的服务并有效地管理集群,请查看Kubernetes 最佳实践。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: