如何使用Istio执行Canary部署?详细操作指南

2021年11月20日14:49:59 发表评论 772 次浏览

Istio执行Canary部署教程介绍

Canary 部署有助于引入新版本的服务,因为它们提供了一种逐步部署新功能的方法。当更新推出时,它会分阶段发布给一小部分用户。这允许开发人员在向所有人提供更新之前查看更新的执行情况。

Istio如何执行Canary部署?Kubernetes 旨在本地执行Canary部署。然而,这种方法的缺点是限制Canary部署的流量(通过更改副本比率)需要手动完成。简化此过程的解决方案是使用服务网格(例如开源 Istio)来解耦流量分布和副本计数。

在本教程中,你将学习如何在启用了 Istio 的集群中部署应用程序的 Canary 版本,并设置 Istio 以控制流量路由。

先决条件

  • Kubernetes 集群(minikube)
  • kubectl命令行工具
  • 安装了 Istio
  • Docker Hub 账户
  • Grafana 仪表板

步骤 1:为 Canary 构建构建 Docker 镜像和容器

如何使用Istio执行Canary部署?要开始部署应用的 Canary 版本,首先创建一个包含你要部署的版本的 docker 镜像。

  1. 转到包含图像所需文件的目录。该示例使用名为test-canary的应用程序,存储在同名目录中:
cd test-canary

2. 使用docker build命令构建Docker镜像。使用你的 Docker Hub 用户名和映像名称执行命令:

docker build -t [dockerhub-username]/test-canary .

输出确认镜像创建成功:

如何使用Istio执行Canary部署?详细操作指南

3. 使用docker images命令查看你的图像列表并检查新图像是否在其中:

docker images
如何使用Istio执行Canary部署?详细操作指南

4. 接下来,使用该docker run命令使用你之前创建的映像构建一个容器。为容器命名并选择访问端口:

docker run --name [name] -p [port]:8080 -d [dockerhub-username]/test-canary

如果操作成功,系统会输出新创建的容器的完整ID:

如何使用Istio执行Canary部署?详细操作指南

5. 使用docker ps命令查看正在运行的容器:

docker ps
如何使用Istio执行Canary部署?详细操作指南

6. 现在使用你分配给容器的端口通过浏览器访问它:

http://localhost:[port]

浏览器显示应用程序的内容:

如何使用Istio执行Canary部署?详细操作指南
Istio执行Canary部署教程

7. 确认应用程序正常工作后,使用docker stop命令停止容器。将容器 ID 添加到命令中,你可以从docker ps输出的第一列复制它:

docker stop [container-id]
如何使用Istio执行Canary部署?详细操作指南

8. 最后,要将镜像推送到你的 Docker Hub 帐户,请使用命令行登录 Docker Hub:

docker login -u [dockerhub-username]

系统要求输入密码。输入密码并按Enter

如何使用Istio执行Canary部署?详细操作指南

9. 现在使用以下命令推送图像docker push

docker push [dockerhub-username]/test-canary
如何使用Istio执行Canary部署?详细操作指南

注意:请访问我们关于最常见Docker 命令的文章并下载我们的 PDF 备忘单以供将来参考。

步骤 2:修改应用部署

如何使用Istio执行Canary部署?要将 Canary 部署添加到你的常规应用程序部署中,请使用文本编辑器编辑包含服务和部署规范的文件。

该示例使用名为 的应用程序清单app-manifest.yaml

nano app-manifest.yaml

Istio执行Canary部署教程:清单应类似于以下内容:

apiVersion: v1
kind: Service
metadata:
  name: nodejs
  labels:
    app: nodejs
spec:
  selector:
    app: nodejs
  ports:
  - name: http
    port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v1
    spec:
      containers:
      - name: nodejs
        image: markopnap/test-prod
        ports:
        - containerPort: 8080

Istio如何执行Canary部署?上面的示例清单描述了 Node.js 应用程序的生产版本,其容器存储在markopnap/test-prod. 要包含应用程序的Canary版本,首先编辑文件的部署部分并添加-v1到应用程序的名称:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-v1

现在,将另一个部署部分附加到文件末尾,其中包含Canary构建的规范:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-v2
  labels:
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v2
    spec:
      containers:
      - name: nodejs
        image: markopnap/test-canary
        ports:
        - containerPort: 8080

注意:请记住将示例 Docker Hub 映像位置替换为你的文件位置。

完成文件编辑后,保存它,然后使用kubectl apply以下命令更新系统配置:

kubectl apply -f app-manifest.yaml

第三步:配置 Istio 虚拟服务

如何使用Istio执行Canary部署?创建一个新的yaml文件来存储 Istio 配置。该示例使用名为 的文件istio.yaml,但你可以为它指定一个你选择的名称:

nano istio.yaml

如果你之前使用 Istio 部署生产版本,则该文件已经存在并且应该类似于以下内容:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nodejs-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nodejs
spec:
  hosts:
  - "*"
  gateways:
  - nodejs-gateway
  http:
  - route:
    - destination:
        host: nodejs

该文件有两个部分,用于定义GatewayVirtualService对象。要介绍两个版本的应用程序并设置分发给用户的路由规则,请修改http底部的部分。该部分必须包含两个具有不同子集权重的目的地:

http:
  - route:
    - destination:
        host: nodejs
        subset: v1
      weight: 90
    - destination:
        host: nodejs
        subset: v2
      weight: 10

weight参数告诉Istio哪些流量百分比应被路由到特定目标。在上面的示例中,90% 的流量流向生产版本,而 10% 的流量流向Canary构建。

编辑 Virtual Service 部分后,将以下行附加到文件末尾以创建Destination Rule

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: nodejs
spec:
  host: nodejs
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

定义目标规则目的是管理传入流量并将其发送到应用程序的指定版本。

保存文件并使用kubectl apply它来激活它:

kubectl apply -f istio.yaml

第 4 步:测试 Canary 部署

如何使用Istio执行Canary部署?上一步中设置的配置执行到你的生产和Canary部署的流量路由。要对此进行测试,请使用 的外部 IP 访问应用程序istio-ingressgateway,Istio 将其用作负载均衡器。

注意:如果你使用 minikube,则需要通过打开另一个终端窗口并发出minikube tunnel命令来模拟负载均衡器。如果没有这个,下一步中的外部 IP 字段将始终显示为pending

Istio执行Canary部署教程:istio-ingressgatewayistio-system命名空间中可用的服务列表中查找该服务。使用kubectl get列出的服务:

kubectl get svc -n istio-system
如何使用Istio执行Canary部署?详细操作指南

istio-ingressgateway外部 IP 地址复制到浏览器的地址栏中:

http://[ingressgateway_ip]

浏览器可能会显示应用程序的生产版本。多次点击刷新按钮来模拟一些流量:

如何使用Istio执行Canary部署?详细操作指南

几次后,你应该会看到该应用程序的 Canary 版本:

如何使用Istio执行Canary部署?详细操作指南

如果你安装了 Grafana 附加组件,请检查传入请求统计信息以查看每个部署的路由百分比。在 Grafana 中,单击主页图标:

如何使用Istio执行Canary部署?详细操作指南

Dashboards部分,选择Istio,然后单击Istio Service Dashboard

如何使用Istio执行Canary部署?详细操作指南

Istio如何执行Canary部署?在仪表板中,找到服务字段并选择与你的应用程序对应的服务。在此示例中,该服务名为nodejs.default.svc.cluster.local。选择服务后,转到“服务工作负载”部分:

如何使用Istio执行Canary部署?详细操作指南

选择标题为Incoming Requests By Destination Workload and Response Code的图表。该图表显示你通过刷新页面产生的流量。在这个例子中,很明显 Istionodejs-v1比Canarynodejs-v2版本更频繁地提供应用程序版本。

如何使用Istio执行Canary部署?详细操作指南

Istio执行Canary部署教程结论

如何使用Istio执行Canary部署?通过学习本教程,你学习了如何设置 Istio 以自动将流量路由到一个应用程序的多个版本。该文章还提供了有关为Canary应用部署设置路由规则的说明。

木子山

发表评论

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