本文演示了使用蓝/绿部署模式将应用程序更新到新版本。使用Knative,您可以通过更改路由配置将流量从应用程序的实时版本安全地重新路由到新版本。

部署 Revision 1 (Blue)

我们将部署一个示例应用程序的镜像,该镜像在蓝色背景上显示文本“ App v1”。

首先,创建一个名为blue-green-demo-config.yaml的新文件,将其复制到其中:

apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:
  name: blue-green-demo
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/knative-route-demo:blue # The URL to the sample app docker image
          env:
            - name: T_VERSION
              value: "blue"

保存文件,然后将配置部署到您的集群:

kubectl apply --filename blue-green-demo-config.yaml

configuration.serving.knative.dev/blue-green-demo created

这将部署示例应用程序的初始版本。在将流量路由到此应用程序之前,我们需要知道刚刚创建的初始修订的名称。使用kubectl,可以通过以下命令获取它:

kubectl get configurations blue-green-demo -o=jsonpath='{.status.latestCreatedRevisionName}'

上面的命令将返回修订的名称,类似于blue-green-demo-5shtc。在本文档的其余部分中,我们将使用此修订版名称,但您的名称将有所不同。

要将入站流量路由到它,我们需要定义一条路由。创建一个名为blue-green-demo-route.yaml的新文件,并将以下YAML清单复制到其中(不要忘记编辑修订名称):

apiVersion: serving.knative.dev/v1
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-5shtc
      percent: 100 # All traffic goes to this revision

保存文件,然后将路由应用于您的集群:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo created

现在,您可以通过以下所示的URL查看示例应用程序:

kubectl get route blue-green-demo

NAME              URL                                                     READY   REASON
blue-green-demo   http://blue-green-demo.default.serverless.xx.me   True

浏览器访问该URL,返回如下内容:

部署 Revision 2 (Green)

示例应用程序的修订版2将在绿色背景上显示文本“ App v2”。要创建新修订,我们将在blue-green-demo-config.yaml中使用更新的镜像和环境变量编辑现有配置:

apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:
  name: blue-green-demo # Configuration name is unchanged, since we're updating an existing Configuration
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/knative-route-demo:green # URL to the new version of the sample app docker image
          env:
            - name: T_VERSION
              value: "green" # Updated value for the T_VERSION environment variable

保存文件,然后将更新的配置应用于您的集群:

kubectl apply --filename blue-green-demo-config.yaml

configuration.serving.knative.dev/blue-green-demo configured

使用以下命令查找第二个修订的名称:

kubectl get configurations blue-green-demo -o=jsonpath='{.status.latestCreatedRevisionName}'

在本文档的其余部分中,我们将假定第二个版本称为blue-green-demo-tn6cc,但是您的版本会有所不同。确保在随后的清单中使用第二个修订版的正确名称。

此时,第一个修订版(blue-green-demo-5shtc)和第二个修订版(blue-green-demo-tn6cc)将同时部署并运行。我们可以更新现有路由以为第二个修订版创建一个新的(测试)端点,同时仍将所有其他流量发送到第一个修订版。编辑blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
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-5shtc
      percent: 100 # All traffic still going to the first revision
    - revisionName: blue-green-demo-tn6cc
      percent: 0 # 0% of traffic routed to the second revision
      tag: v2 # A named route

保存文件,然后将更新的路由应用于您的集群:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

该应用程序的修订版2现已运行。这意味着:

kubectl get route blue-green-demo --output jsonpath="{.status.traffic[*].url}"

有如下输出:

http://v2-blue-green-demo.default.serverless.xx.me/

访问该URL,可以看到如下:

这样,您可以在将任何流量切换到新版本之前,验证该应用程序的新版本是否符合预期。

迁移流量到新的revision

我们将再次更新现有路线,以开始将流量从第一个修订版转移到第二个修订版。编辑blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # Updating our existing route
  namespace: default
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 50 # Updating the percentage from 100 to 50
    - revisionName: blue-green-demo-tn6cc
      percent: 50 # Updating the percentage from 0 to 50
      tag: v2

保存文件,然后将更新的路由应用于您的集群:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

几次刷新原始路由(http://blue-green-demo.default.serverless.xx.me),以查看一些流量现在流向该应用程序的版本2。

注意:此示例显示了50/50的分配比例,以确保您不必刷新太多,但建议在生产环境中以1-2%的流量开始

路由全部的流量到新的version

最后,我们将更新现有路由,以最终将所有流量转移到第二个修订版。编辑blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # Updating our existing route
  namespace: default
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 0
      tag: v1 # Adding a new named route for v1
    - revisionName: blue-green-demo-tn6cc
      percent: 100
      # Named route for v2 has been removed, since we don't need it anymore
注意:当您不再回滚修​​订时,可以删除第一个修订blue-green-demo-lcfrd而不是流量的0%。然后,不可路由的修订对象将被垃圾回收。

保存文件,然后将更新的路由应用于您的集群:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

几次刷新原始路由(http://blue-green-demo.default.serverless.xx.me),以验证没有流量路由到该应用的v1。

我们向该应用的v1添加了一个命名路由,因此您现在可以在状态部分的点击量栏中列出的URL上访问它。要获取URL,请输入以下命令:

kubectl get route blue-green-demo --output jsonpath="{.status.traffic[*].url}"

由于所有入站流量都定向到该应用程序的第二个修订版,因此Knative很快会将第一个修订版缩小到0个正在运行的Pod,并且可以将蓝色/绿色部署视为已完成。使用命名的v1路由将重新激活广告连播,以满足专门针对初始修订的任何偶然请求。


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。