此示例演示如何使用蓝绿流量路由模式将应用程序更新到新版本。使用Knative,可以通过更改路由配置,安全地将流量从应用程序的实时版本重新路由到新版本。
1.部署修订版1(蓝色)
我们将部署一个示例应用程序,该应用在蓝色背景上显示文本“App v1”。首先,创建一个名为的新文件blue-green-demo-conf ig.yaml并将以下内容复制到文件中:
apiVersion: serving.knative.dev/v1alpha1
kind: Configuration
metadata:
name: blue-green-demo
namespace: default
spec:
revisionTemplate:
metadata:
labels:
knative.dev/type: container
spec:
container:
# The URL to the sample app docker image
image: registry.cn-beijing.aliyuncs.com/istio-samples/knative-route-demo:blue
imagePullPolicy: Always
env:
- name: T_VERSION
value: "blue"
保存文件,然后将配置部署到集群中,如下所示:
kubectl apply -f blue-green-demo-config.yaml
这将部署示例应用程序的初始版本blue-green-demo-00001,接下来定义路由,将入站流量路由到该版本。创建一个新文件blue-green-demo-route.yaml并将如下内容复制到文件中:
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: blue-green-demo # The name of our route; appears in the URL to access the app
namespace: default # The namespace we're working in; also appears in the URL to access the app
spec:
traffic:
- revisionName: blue-green-demo-00001
percent: 100 # All traffic goes to this revision
保存文件,然后将路由应用到你的集群,如下所示:
kubectl apply -f blue-green-demo-route.yaml
2.部署修订版2(绿色)
示例应用程序的修订版v2将在绿色背景上显示文本“App v2”。要创建新版本,首先让blue-green-demo-conf ig.yaml使用更新后的容器镜像和环境变量,如下所示:
apiVersion: serving.knative.dev/v1alpha1
kind: Configuration
metadata:
name: blue-green-demo
namespace: default
spec:
revisionTemplate:
metadata:
labels:
knative.dev/type: container
spec:
container:
# The URL to the sample app docker image
image: registry.cn-beijing.aliyuncs.com/istio-samples/istio-samples/knative-rout-demo:green
imagePullPolicy: Always
env:
- name: T_VERSION
value: "green"
保存文件,然后将更新的配置应用于你的集群,如下所示:
kubectl apply -f blue-green-demo-config.yaml
此时,第一个revision(blue-green-demo-00001)和第二个revision(blue-green-demo00002)都将被部署并运行。我们可以更新现有路由,为第二个版本创建新的测试端点,同时仍将所有其他流量发送到第一个版本。使用如下内容编辑blue-green-demo-route.yaml:
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: blue-green-demo # Route name is unchanged, since we're updating an existing Route
namespace: default
spec:
traffic:
- revisionName: blue-green-demo-00001
percent: 100 # All traffic still going to the first revision
- revisionName: blue-green-demo-00002
percent: 0 # 0% of traffic routed to the second revision
name: v2 # A named route
保存文件,然后将更新的路由应用于你的集群,如下所示:
kubectl apply -f blue-green-demo-route.yaml
此时,应用程序的修订版v2已部署。这意味着:
·没有流量将路由到主URL的修订版v2,http://blue-green-demo.default.YOUR_CUSTOM_DOMAIN.com。
·Knative在http://v2.blue-green-demo.default.YOUR_CUSTOM_DOMAIN.com上创建了一个名为v2的新路由,用于测试新部署的版本。
·这允许你在将任何流量切换到应用程序之前验证新版本的应用程序是否按预期运行。
3.将流量迁移到新版本
我们将再次更新现有路由规则,开始将流量从第一次修订转移到第二次修订。使用如下内容编辑blue-green-demo-route.yaml:
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: blue-green-demo # Updating our existing route
namespace: default
spec:
traffic:
- revisionName: blue-green-demo-00001
percent: 50 # Updating the percentage from 100 to 50
- revisionName: blue-green-demo-00002
percent: 50 # Updating the percentage from 0 to 50
name: v2
保存文件,然后将更新的路由应用于你的集群,如下所示:
kubectl apply -f blue-green-demo-route.yaml
刷新原始路径(http://blue-green-demo.default.YOUR_CUSTOM_DOMAIN.com)几次,以查看某些流量现在是否已转到应用的第2版。
注意
此示例显示50/50分割,以确保你不必刷新太多,但建议在生产环境中以1%~2%的流量开始。
4.重新调整所有流量到新版本
最后,我们将更新现有路线,最终将所有流量转移到第二个版本。使用如下内容编辑blue-green-demo-route.yaml:
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: blue-green-demo # Updating our existing route
namespace: default
spec:
traffic:
- revisionName: blue-green-demo-00001
percent: 0
name: v1 # Adding a new named route for v1
- revisionName: blue-green-demo-00002
percent: 100
# Named route for v2 has been removed, since we don't need it anymore
保存文件,然后将更新的路由应用于你的集群。
刷新原始路线(http://blue-green-demo.default.YOUR_CUSTOM_DOMAIN.com)几次,以验证没有流量路由到应用程序的v1版本。我们在应用程序的v1中添加了一条命名路线,现在你可以访问http://v1.blue-green-demo.default.YOUR_CUSTOM_DOMAIN.com。
将所有入站流量定向到应用程序的第二个版本后,Knative将很快将第一个版本运行的pod缩减为0运行pod,并且可以认为蓝色/绿色部署已完成。使用命名v1路由将重新激活一个pod,以满足专门用于初始修订的任何偶然请求。
要删除示例应用程序,请输入以下命令:
kubectl delete route blue-green-demo kubectl delete configuration blue-green-demo