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
步骤 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: nginx
和version: "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 为:
浏览器应显示来自版本 1的Hello World消息。
第 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 之间分配。如果你多次刷新网页,你会看到不同的结果,具体取决于服务重定向你的请求的位置。
注意:在上面的示例中,一半的流量被重定向到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 最佳实践。