Red Hat OpenShift GitOps 中的 Argo Rollouts 支持各种流量管理机制,例如 OpenShift 路由 和基于 Istio 的 OpenShift 服务网格。
选择与 Argo Rollouts 一起使用的流量管理器的选择取决于您用于部署集群工作负载的现有流量管理解决方案。例如,Red Hat OpenShift 路由提供基本的流量管理功能,不需要使用 sidecar 容器。但是,Red Hat OpenShift 服务网格通过使用 Istio 提供更高级的路由功能,但需要配置 sidecar 容器。
您可以使用 OpenShift 服务网格在两个应用程序版本之间拆分流量。
金丝雀版本:应用程序的新版本,您可以逐步路由流量。
稳定版本:应用程序的当前版本。金丝雀版本稳定且所有用户流量都定向到它之后,它将成为新的稳定版本。之前的稳定版本将被丢弃。
Argo Rollouts 中的 Istio 支持使用 Gateway 和 VirtualService 资源来处理流量路由。
Gateway:您可以使用 Gateway 来管理网格的入站和出站流量。Gateway 是 OpenShift Service Mesh 的入口点,负责处理发送到应用程序的流量请求。
VirtualService:VirtualService 定义流量路由规则以及到达底层服务的流量百分比,例如稳定服务和金丝雀服务。
例如,在一个示例部署场景中,在初始实例期间,100% 的流量都定向到应用程序的稳定版本。应用程序按预期运行,并且没有进行额外的部署新版本的尝试。
但是,在部署新版本的应用程序后,Argo Rollouts 会基于新版本的应用程序创建一个新的金丝雀部署,并将一定百分比的流量路由到该新版本。
当您使用 Service Mesh 时,Argo Rollouts 会自动修改 VirtualService 资源以控制稳定版和金丝雀版应用程序之间流量分割的百分比。在下图中,在第一次升级后,20% 的流量发送到金丝雀应用程序版本,然后稳定服务将 80% 的流量发送到稳定版本。
您可以使用 OpenShift Service Mesh 通过创建以下项目来配置 Argo Rollouts:
一个 Gateway
两个 Kubernetes 服务:稳定服务和金丝雀服务,它们指向每个服务版本的 Pod
一个 VirtualService
一个 Rollout 自定义资源 (CR)
在以下示例过程中,Rollout 将 20% 的流量路由到应用程序的金丝雀版本。手动升级后,Rollout 将路由 40% 的流量。在另一次手动升级后,Rollout 将执行多次自动升级,直到所有流量都路由到新应用程序版本。
您已以管理员身份登录到 OpenShift Container Platform 集群。
您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps。
您已在 OpenShift Container Platform 集群上安装了 Argo Rollouts。
您已在您的系统上安装了 Argo Rollouts CLI。
您已在集群上安装了 OpenShift Service Mesh 运算符并配置了 ServiceMeshControlPlane。
创建一个 Gateway
对象来接受网格的入站流量。
创建一个包含以下代码片段内容的 YAML 文件。
rollouts-demo-gateway
的示例 GatewayapiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: rollouts-demo-gateway (1)
spec:
selector:
istio: ingressgateway (2)
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
1 | Gateway 的名称。 |
2 | 指定入口 Gateway 的名称。Gateway 配置公开的端口和协议,但不包含任何流量路由配置。 |
运行以下命令应用 YAML 文件。
$ oc apply -f gateway.yaml
为应用程序的稳定版本和金丝雀版本创建服务。
在 Web 控制台的**管理员**视角中,转到**网络** → **服务**。
单击**创建服务**。
在**创建服务**页面上,单击**YAML 视图**并添加以下代码片段。以下示例创建了一个名为 rollouts-demo-stable
的稳定服务。稳定流量将定向到此服务。
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo-stable
spec:
ports: (1)
- port: 80
targetPort: http
protocol: TCP
name: http
selector: (2)
app: rollouts-demo
1 | 指定应用程序在容器内运行时使用的端口的名称。 |
2 | 确保稳定服务和 Rollout CR 中的 selector 字段内容相同。 |
单击**创建**以创建稳定服务。
在**创建服务**页面上,单击**YAML 视图**并添加以下代码片段。以下示例创建了一个名为 rollouts-demo-canary
的金丝雀服务。金丝雀流量将定向到此服务。
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo-canary
spec:
ports: (1)
- port: 80
targetPort: http
protocol: TCP
name: http
selector: (2)
app: rollouts-demo
1 | 指定应用程序在容器内运行时使用的端口的名称。 |
2 | 确保金丝雀服务和 Rollout CR 中的 selector 字段内容相同。 |
单击**创建**以创建金丝雀服务。
创建一个 VirtualService 来将传入流量路由到稳定服务和金丝雀服务。
创建一个 YAML 文件,并将以下 YAML 代码复制到其中。以下示例创建了一个名为 rollouts-demo-vsvc
的 VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: rollouts-demo-vsvc
spec:
gateways:
- rollouts-demo-gateway (1)
hosts:
- rollouts-demo-vsvc.local
http:
- name: primary
route:
- destination:
host: rollouts-demo-stable (2)
port:
number: 15372 (3)
weight: 100
- destination:
host: rollouts-demo-canary (4)
port:
number: 15372
weight: 0
tls: (5)
- match:
- port: 3000
sniHosts:
- rollouts-demo-vsvc.local
route:
- destination:
host: rollouts-demo-stable
weight: 100
- destination:
host: rollouts-demo-canary
weight: 0
1 | Gateway 的名称。 |
2 | 目标稳定服务的名称。 |
3 | 指定用于侦听流量的端口号。 |
4 | 目标金丝雀服务的名称。 |
5 | 指定用于保护 VirtualService 的 TLS 配置。 |
运行以下命令应用 YAML 文件。
$ oc apply -f virtual-service.yaml
创建 Rollout
CR。在此示例中,Istio
用作流量管理器。
在 Web 控制台的**管理员**视角中,转到**运算符** → **已安装的运算符** → **Red Hat OpenShift GitOps** → **Rollout**。
在**创建 Rollout** 页面上,单击**YAML 视图**并添加以下代码片段。以下示例创建了一个名为 rollouts-demo
的 Rollout
CR
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
spec:
replicas: 5
strategy:
canary:
canaryService: rollouts-demo-canary (1)
stableService: rollouts-demo-stable (2)
trafficRouting:
istio:
virtualServices:
- name: rollouts-demo-vsvc
routes:
- primary
steps: (3)
- setWeight: 20
- pause: {}
- setWeight: 40
- pause: {}
- setWeight: 60
- pause: {duration: 30}
- setWeight: 80
- pause: {duration: 60}
revisionHistoryLimit: 2
selector: (4)
matchLabels:
app: rollouts-demo
template:
metadata:
labels:
app: rollouts-demo
istio-injection: enabled
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
1 | 此值必须与已创建的金丝雀 Service 的名称匹配。 |
2 | 此值必须与已创建的稳定 Service 的名称匹配。 |
3 | 指定 Rollout 的步骤。此示例逐渐将 20%、40%、60% 和 100% 的流量路由到金丝雀版本。 |
4 | 确保 selector 字段的内容与金丝雀服务和稳定服务中的相同。 |
单击**创建**。
在**Rollout** 选项卡下的**Rollout** 部分,验证 Rollout 的**状态**字段是否显示**阶段:健康**。
验证路由是否将 100% 的流量定向到应用程序的稳定版本。
运行以下命令来观察 Rollout 的进度
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
Name: rollouts-demo
Namespace: argo-rollouts
Status: ✔ Healthy
Strategy: Canary
Step: 8/8
SetWeight: 100
ActualWeight: 100
Images: argoproj/rollouts-demo:blue (stable)
Replicas:
Desired: 5
Current: 5
Updated: 5
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ✔ Healthy 4m50s
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet ✔ Healthy 4m50s stable
├──□ rollouts-demo-687d76d795-75k57 Pod ✔ Running 4m49s ready:1/1
├──□ rollouts-demo-687d76d795-bv5zf Pod ✔ Running 4m49s ready:1/1
├──□ rollouts-demo-687d76d795-jsxg8 Pod ✔ Running 4m49s ready:1/1
├──□ rollouts-demo-687d76d795-rsgtv Pod ✔ Running 4m49s ready:1/1
└──□ rollouts-demo-687d76d795-xrmrj Pod ✔ Running 4m49s ready:1/1
创建 |
要验证服务网格是否将 100% 的流量发送到稳定服务,而 0% 发送到金丝雀服务,请运行以下命令
$ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
查看终端中显示的以下输出
route
- destination:
host: rollouts-demo-stable
weight: 100 (1)
- destination:
host: rollouts-demo-canary
weight: 0 (2)
1 | 值为 100 表示 100% 的流量定向到稳定版本。 |
2 | 值为 0 表示 0% 的流量定向到金丝雀版本。 |
通过修改 Rollout 中部署的容器镜像来模拟应用程序的新金丝雀版本。
通过运行以下命令,将 .spec.template.spec.containers.image
值从 argoproj/rollouts-demo:blue
修改为 argoproj/rollouts-demo:yellow
。
$ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace>
结果,Rollout 中部署的容器镜像被修改,并且 Rollout 启动了一个新的金丝雀部署。
根据 |
运行以下命令来观察 Rollout 的进度。
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
在以下示例中,80% 的流量路由到稳定服务,20% 的流量路由到金丝雀服务。然后部署无限期暂停,直到您手动将其提升到下一级。
Name: rollouts-demo
Namespace: argo-rollouts
Status: ॥ Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 1/8
SetWeight: 20
ActualWeight: 20
Images: argoproj/rollouts-demo:blue (stable)
argoproj/rollouts-demo:yellow (canary)
Replicas:
Desired: 5
Current: 6
Updated: 1
Ready: 6
Available: 6
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ॥ Paused 6m51s
├──# revision:2
│ └──⧉ rollouts-demo-6cf78c66c5 ReplicaSet ✔ Healthy 99s canary
│ └──□ rollouts-demo-6cf78c66c5-zrgd4 Pod ✔ Running 98s ready:1/1
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet ✔ Healthy 9m51s stable
├──□ rollouts-demo-687d76d795-75k57 Pod ✔ Running 9m50s ready:1/1
├──□ rollouts-demo-687d76d795-jsxg8 Pod ✔ Running 9m50s ready:1/1
├──□ rollouts-demo-687d76d795-rsgtv Pod ✔ Running 9m50s ready:1/1
└──□ rollouts-demo-687d76d795-xrmrj Pod ✔ Running 9m50s ready:1/1
route
- destination:
host: rollouts-demo-stable
weight: 80 (1)
- destination:
host: rollouts-demo-canary
weight: 20 (2)
1 | 值为80 表示80% 的流量定向到稳定版本。 |
2 | 值为20 表示20% 的流量定向到金丝雀版本。 |
手动将部署提升到下一个推广步骤。
$ oc argo rollouts promote rollouts-demo -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
运行以下命令来观察 Rollout 的进度
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
在以下示例中,60% 的流量路由到稳定服务,40% 的流量路由到金丝雀服务。然后部署无限期暂停,直到您手动将其提升到下一级。
Name: rollouts-demo
Namespace: argo-rollouts
Status: ॥ Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 3/8
SetWeight: 40
ActualWeight: 40
Images: argoproj/rollouts-demo:blue (stable)
argoproj/rollouts-demo:yellow (canary)
Replicas:
Desired: 5
Current: 7
Updated: 2
Ready: 7
Available: 7
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ॥ Paused 9m21s
├──# revision:2
│ └──⧉ rollouts-demo-6cf78c66c5 ReplicaSet ✔ Healthy 99s canary
│ └──□ rollouts-demo-6cf78c66c5-zrgd4 Pod ✔ Running 98s ready:1/1
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet ✔ Healthy 9m51s stable
├──□ rollouts-demo-687d76d795-75k57 Pod ✔ Running 9m50s ready:1/1
├──□ rollouts-demo-687d76d795-jsxg8 Pod ✔ Running 9m50s ready:1/1
├──□ rollouts-demo-687d76d795-rsgtv Pod ✔ Running 9m50s ready:1/1
└──□ rollouts-demo-687d76d795-xrmrj Pod ✔ Running 9m50s ready:1/1
route
- destination:
host: rollouts-demo-stable
weight: 60 (1)
- destination:
host: rollouts-demo-canary
weight: 40 (2)
1 | 值为60 表示60% 的流量定向到稳定版本。 |
2 | 值为40 表示40% 的流量定向到金丝雀版本。 |
通过运行以下命令,将金丝雀版本的流量权重增加到 100%,并丢弃应用程序先前稳定版本的流量
$ oc argo rollouts promote rollouts-demo -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
运行以下命令来观察 Rollout 的进度
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
1 | 指定定义 Rollout 资源的命名空间。 |
成功完成后,稳定服务的权重为 100%,金丝雀服务的权重为 0%。