Argo Rollouts 和 Ambassador 快速开始

查看本文大纲

本教程将指导你如何配置 Argo Rollouts 与 Ambassador 配合以实现金丝雀发布。本指南中使用的所有文件都可在此存储库的 examples 目录中找到。

要求

  • Kubernetes 集群
  • 在集群中安装 Argo-Rollouts

注意

如果使用 Ambassador Edge Stack 或 Emissary-ingress 2.0+,则需要安装 Argo-Rollouts 版本 v1.1+,并需要向 argo-rollouts 部署提供 --ambassador-api-version getambassador.io/v3alpha1

1. 安装和配置 Ambassador Edge Stack

如果你的集群中没有 Ambassador,可以按照 Edge Stack 文档 进行安装。

默认情况下,Edge Stack 通过 Kubernetes 服务路由。为了获得更好的金丝雀性能,我们建议你使用端点路由。通过将以下配置保存在名为 resolver.yaml 的文件中,启用集群上的端点路由:

 apiVersion: getambassador.io/v2
 kind: KubernetesEndpointResolver
 metadata:
   name: endpoint

将此配置应用于你的集群:kubectl apply -f resolver.yaml

2. 创建 Kubernetes 服务

我们将创建两个 Kubernetes 服务,分别命名为 echo-stableecho-canary。将此配置保存到名为 echo-service.yaml 的文件中。

 apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: echo
   name: echo-stable
 spec:
   type: ClusterIP
   ports:
   - name: http
     port: 80
     protocol: TCP
     targetPort: 8080
   selector:
     app: echo
 ---
 apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: echo
   name: echo-canary
 spec:
   type: ClusterIP
   ports:
   - name: http
     port: 80
     protocol: TCP
     targetPort: 8080
   selector:
     app: echo

我们还将为服务创建 Edge Stack 路由。将以下配置保存到名为 echo-mapping.yaml 的文件中。

 apiVersion: getambassador.io/v2
 kind:  Mapping
 metadata:
   name:  echo
 spec:
   prefix: /echo
   rewrite: /echo
   service: echo-stable:80
   resolver: endpoint

将这两个配置都应用于 Kubernetes 集群:

 kubectl apply -f echo-service.yaml
 kubectl apply -f echo-mapping.yaml

3. 部署 Echo 服务

创建一个 Rollout 资源并将其保存到名为 rollout.yaml 的文件中。注意 trafficRouting 属性,它告诉 Argo 使用 Ambassador Edge Stack 进行路由。

 apiVersion: argoproj.io/v1alpha1
 kind: Rollout
 metadata:
   name: echo-rollout
 spec:
   selector:
     matchLabels:
       app: echo
   template:
     metadata:
       labels:
         app: echo
     spec:
       containers:
         - image: hashicorp/http-echo
           args:
             - "-text=VERSION 1"
             - -listen=:8080
           imagePullPolicy: Always
           name: echo-v1
           ports:
             - containerPort: 8080
   strategy:
     canary:
       stableService: echo-stable
       canaryService: echo-canary
       trafficRouting:
         ambassador:
           mappings:
             - echo
       steps:
       - setWeight: 30
       - pause: {duration: 30s}
       - setWeight: 60
       - pause: {duration: 30s}
       - setWeight: 100
       - pause: {duration: 10}

将 Rollout 应用于你的集群 kubectl apply -f rollout.yaml。注意,由于这是部署的服务的第一个版本,因此不会进行金丝雀部署。

4. 测试服务

现在,我们将测试此部署是否按预期工作。打开一个新的终端窗口。我们将使用它来发送请求到集群。获取 Edge Stack 的外部 IP 地址:

 export AMBASSADOR_LB_ENDPOINT=$(kubectl -n ambassador get svc ambassador -o "go-template={{range .status.loadBalancer.ingress}}{{or .ip .hostname}}{{end}}")

发送请求到 echo 服务:

 curl -Lk "https://$AMBASSADOR_LB_ENDPOINT/echo/"

你应该会得到一个 “VERSION 1” 的响应。

5. 部署新版本

现在是时候部署服务的新版本了。将 rollout.yaml 中的 echo 容器更新为显示 “VERSION 2”:

 apiVersion: argoproj.io/v1alpha1
 kind: Rollout
 metadata:
   name: echo-rollout
 spec:
   selector:
     matchLabels:
       app: echo
   template:
     metadata:
       labels:
         app: echo
     spec:
       containers:
         - image: hashicorp/http-echo
           args:
             - "-text=VERSION 2"
             - -listen=:8080
           imagePullPolicy: Always
           name: echo-v1
           ports:
             - containerPort: 8080
   strategy:
     canary:
       stableService: echo-stable
       canaryService: echo-canary
       trafficRouting:
         ambassador:
           mappings:
             - echo
       steps:
       - setWeight: 30
       - pause: {duration: 30s}
       - setWeight: 60
       - pause: {duration: 30s}
       - setWeight: 100
       - pause: {duration: 10}

通过键入 kubectl apply -f rollout.yaml 将 Rollout 应用于集群。这将通过在 30 秒内将 30% 的流量路由到服务,然后在另外 30 秒内将 60% 的流量路由到服务来部署服务的第 2 个版本。

你可以在命令行上监视 Rollout 的状态:

 kubectl argo rollouts get rollout echo-rollout --watch

将显示类似于以下内容的输出:

 Name:            echo-rollout
 Namespace:       default
 Status:          ॥ Paused
 Message:         CanaryPauseStep
 Strategy:        Canary
   Step:          1/6
   SetWeight:     30
   ActualWeight:  30
 Images:          hashicorp/http-echo (canary, stable)
 Replicas:
   Desired:       1
   Current:       2
   Updated:       1
   Ready:         2
   Available:     2

 NAME                                      KIND        STATUS        AGE    INFO
 ⟳ echo-rollout                            Rollout     ॥ Paused      2d21h
 ├──# revision:3
 │  └──⧉ echo-rollout-64fb847897           ReplicaSet  ✔ Healthy     2s     canary
 │     └──□ echo-rollout-64fb847897-49sg6  Pod         ✔ Running     2s     ready:1/1
 ├──# revision:2
 │  └──⧉ echo-rollout-578bfdb4b8           ReplicaSet  ✔ Healthy     3h5m   stable
 │     └──□ echo-rollout-578bfdb4b8-86z6n  Pod         ✔ Running     3h5m   ready:1/1
 └──# revision:1
    └──⧉ echo-rollout-948d9c9f9            ReplicaSet  • ScaledDown  2d21h

在其他终端窗口中,你可以通过循环发送请求来验证金丝雀是否正在适当地进行:

 while true; do curl -k https://$AMBASSADOR_LB_ENDPOINT/echo/; sleep 0.2; done

这将显示一个来自服务的响应的运行列表,这些响应将逐渐从 VERSION 1 字符串转换为 VERSION 2 字符串。

有关 Ambassador 和 Argo-Rollouts 集成的更多详细信息,请参见 Ambassador Argo 文档