使用Azure容器应用程序(Azure Container Apps,ACA)进行蓝绿部署

使用Azure容器应用(ACA)进行蓝绿部署。

spring-boot_on_azure-container-apps.png

达到的意图

我将使用Windows 11上的Linux进行云开发。

您可以在这里查看文章的列表。

 

实现

在Microsoft Azure容器应用(ACA)中,我们将尝试实践容器应用的蓝绿部署。

這篇文章使用了在 Docker Hub 上公開的可公開訪問的自定義容器映像。在實際系統開發中,取得容器映像的登記處可能會有所不同,請根據需要進行確認。

技術主题

蓝绿部署是什么?

可以展开并查看此处。蓝绿部署

蓝绿部署是一种与传统操作方法不同的方法,用于在生产环境中部署应用程序的新版本。它涉及在生产环境中构建新版本,并在此处测试应用程序,然后切换到传统生产环境。

通常情况下,会准备一个蓝色的生产环境和一个绿色的新生产环境。一开始,蓝色环境作为激活的生产环境运行,而绿色环境是非激活的。

将新版本的应用程序部署到绿色环境中进行测试,并在没有问题的情况下将流量切换到绿色环境。

通过这种方式,可以将停机时间降到最低,并提高系统的可靠性。

开发环境

    Windows 11 Home 22H2 を使用しています。
由于要操作WSL上的Ubuntu,请参考macOS的使用方法。
WSL (Microsoft Store应用程序版) ※ 您可以从此相关文章中查看安装方法
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu ※ 您可以从此相关文章中查看安装方法
$ lsb_release -a
未找到LSB模块。
发行版ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
版本号:22.04

Java JDK ※ 您可以从此相关文章中查看安装方法
$ java -version
openjdk版本:”11.0.18″ 2023-01-17
OpenJDK运行时环境(构建版本 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64位服务器虚拟机(构建版本 11.0.18+10-post-Ubuntu-0ubuntu122.04,混合模式,共享)

Maven ※ 您可以从此相关文章中查看安装方法
$ mvn -version
Apache Maven 3.6.3
Maven主目录:/usr/share/maven
Java版本:11.0.18,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64

Docker ※ 您可以从此相关文章中查看安装方法
$ docker –version
Docker版本 23.0.1,构建版本 a5ee5b1

Azure CLI ※ 您可以从此相关文章中查看安装方法
$ az –version
azure-cli 2.45.0
core 2.45.0
telemetry 1.0.8

在这篇文章中,我们主要使用Ubuntu终端进行操作。为了初学者学习如何使用Vim进行复制粘贴,我们在下面的文章中介绍了步骤。请务必尝试一下。

 

請在中文中對以下內容進行本地化解釋,只需一種選項:

藍綠部署的規格

※ 本文所述为规范。

識別するタグ内容エンドポイントJSON レスポンスv1現用のサービス/api/data{“message”:”Hello Blue!”}v2更新するサービス/api/data{“message”:”Hello Green!”}

使用自定义容器镜像格式的应用程序。

Noコンテナイメージ内容1app-hello-spring-boot:v1現用のアプリケーション2app-hello-spring-boot:v2更新するアプリケーション

进行蓝绿部署的步骤

创建应用程序容器镜像

可以展开这里并查看步骤。创建Java应用程序。
您可以在相关文章中查看步骤。
https://qiita.com/fsdg-adachi_h/items/9c07e20b4124d8c5f972
切换到项目文件夹。
※假设~/tmp/hello-spring-boot为项目文件夹。
$ cd ~/tmp/hello-spring-boot

创建v1应用程序的源代码。
$ vim src/main/java/com/example/springboot/controller/HelloController.java

文件内容

HelloController.java
package com.example.springboot.controller;

import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(“/api”)
public class HelloController {
@GetMapping(“/data”)
public Map<String, String> getData() {
Map<String, String> map = Map.of(“message”, “Hello Blue!”);
return map;
}
}

构建v1应用程序。
$ mvn clean package

创建容器镜像。
您可以在相关文章中查看步骤。
https://qiita.com/fsdg-adachi_h/items/9c07e20b4124d8c5f972
启动Docker守护程序。
$ sudo service docker start
* Starting Docker: docker [ OK ]

将v1应用程序构建为容器镜像。
$ docker build –no-cache -t app-hello-spring-boot:v1 .

检查v1应用程序的容器镜像。
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot v1 c61d32929a90 58 seconds ago 390MB

将容器镜像推送到Docker Hub。
您可以在相关文章中查看步骤。
https://qiita.com/fsdg-adachi_h/items/cbcfe1433885bae514db
登录到Docker Hub。
$ docker login
Login Succeeded

为v1应用程序的容器镜像打标签。
※将$USER替换为您自己的容器仓库。
$ docker tag app-hello-spring-boot:v1 $USER/app-hello-spring-boot:v1

将v1应用程序的容器镜像推送到Docker Hub。
$ docker push $USER/app-hello-spring-boot:v1

在本地启动容器并确认应用程序的正常运行。
※将$USER替换为您自己的容器仓库。
$ docker run –rm –name app-local -p 8080:8080 $USER/app-hello-spring-boot:v1

$ curl http://localhost:8080/api/data/
{“message”:”Hello Blue!”}

在构建容器镜像并将其推送到Docker Hub时,可能出现缓存使用不正确,未反映源代码更改的情况。为解决此问题,建议您先在本地启动先前在Docker Hub上推送的容器镜像并确认其正确运行。

通过前面的工作,v1 应用的自定义容器镜像已成功发布到 Docker Hub。

将应用程序部署到 Azure 容器应用。

登录

使用Azure CLI登录到Azure。

$ az login

您可以在相关的文章中查看手续。

 

资源组

创建资源组。

$ az group create \
    --name rg-hello \
    --location japaneast

容器应用环境

您可以在这篇相关文章中查看步骤。

 

创建容器应用环境。
※ 由于基于Kubernetes基础设施,所以可能需要一些时间。

$ az containerapp env create \
    --resource-group rg-hello \
    --name cae-hello \
    --location japaneast

容器应用

创建和部署容器应用程序。
※ 请将$USER替换为您自己的容器仓库。

$ az containerapp create \
    --resource-group rg-hello \
    --environment cae-hello \
    --name ca-hello-spring-boot \
    --image $USER/app-hello-spring-boot:v1 \
    --target-port 8080 \
    --ingress 'external' \
    --min-replicas 1 \
    --revisions-mode multiple \
    --revision-suffix v1
打开说明。这个命令是用来创建Azure容器应用实例的命令。以下是每个选项执行的内容。

命令 内容

az containerapp create 创建容器应用。

选项 值 内容

–resource-group rg-hello 指定要部署资源所属的资源组的名称。

–environment cae-hello 指定容器应用环境的名称。

–name ca-hello-spring-boot 指定容器应用的名称。

–image $USER/app-hello-spring-boot:v1 指定要执行的容器映像的名称。这里使用了在前面步骤中推送到Docker Hub的映像名称。

–target-port 8080 指定容器公开的端口。这里指定了8080,因为Spring Boot应用程序在端口8080上公开。

–ingress ‘external’ 指定允许从外部访问容器的入口设置。这里指定了允许外部访问的’external’。

–min-replicas 1 指定最小副本数。这里将最小副本数设置为1。

–revisions-mode multiple 指定版本模式。这里指定支持多个版本的’multiple’。

–revision-suffix v1 指定用于创建新版本的接尾辞,附加在容器应用名称的末尾。这里指定了v1。

容器应用已创建。

https://ca-hello-spring-boot.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/

从另一个终端使用curl命令来确认应用程序的URL。

$ curl https://ca-hello-spring-boot.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/api/data
{"message":"Hello Blue!"}
在此之前的工作中,v1 应用的自定义容器映像已经可以在 Azure 容器应用中启动。

确认Azure门户

image.png
ca-hello-spring-boot--v1

此外,您还可以检查v1应用程序的修订版本URL。

https://ca-hello-spring-boot--v1.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/

创建v2应用程序的容器镜像

请查看下面的步骤展开。Java 应用创建
创建v2应用的源代码。
$ vim src/main/java/com/example/springboot/controller/HelloController.java

文件内容

HelloController.java
package com.example.springboot.controller;

import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(“/api”)
public class HelloController {
@GetMapping(“/data”)
public Map<String, String> getData() {
Map<String, String> map = Map.of(“message”, “Hello Green!”);
return map;
}
}

构建v2应用
$ mvn clean package

创建容器镜像
将v2应用构建为容器镜像。
$ docker build –no-cache -t app-hello-spring-boot:v2 .

查看v2应用的容器镜像。
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot v1 c61d32929a90 58 seconds ago 390MB
app-hello-spring-boot v2 9d54d1056fb2 9 seconds ago 390MB

将容器镜像推送到Docker Hub
给v2应用的容器镜像打上标签。
※ 将$USER部分替换为您自己的容器仓库。
$ docker tag app-hello-spring-boot:v2 $USER/app-hello-spring-boot:v2

将v2应用的容器镜像推送到Docker Hub。
$ docker push $USER/app-hello-spring-boot:v2

在本地启动容器并确认应用程序功能。
※ 将$USER部分替换为您自己的容器仓库。
$ docker run –rm –name app-local -p 8080:8080 $USER/app-hello-spring-boot:v2

$ curl http://localhost:8080/api/data/
{“message”:”Hello Green!”}

经过到目前为止的工作,v2 应用程序的自定义容器映像已成功发布到 Docker Hub 上。

将v2应用程序部署到Azure容器应用程序

容器应用

配置容器应用程序的流量分流。
* 将当前版本的配置设为100%。

如果没有设置容器应用程序的流量分割配置,则更新的修订版容器应用程序的流量将被设置为100%。请注意。
$ az containerapp ingress traffic set \
    --resource-group rg-hello \
    --name ca-hello-spring-boot \
    --revision-weight ca-hello-spring-boot--v1=100
打开说明。此命令用于为Azure Container Apps的每个修订版本设置流量权重。

命令
内容

az containerapp ingress traffic set
用于为Container Apps的每个修订版本设置流量权重的命令。

选项

内容

–resource-group
rg-hello
指定部署的资源所属的资源组名称。

–name
ca-hello-spring-boot
指定Container Apps的名称。

–revision-weight
ca-hello-spring-boot–v1=100
将名为ca-hello-spring-boot–v1的修订版本的流量权重设置为100。

※ 会返回如下的响应信息。

[
  {
    "latestRevision": true,
    "weight": 0
  },
  {
    "revisionName": "ca-hello-spring-boot--v1",
    "weight": 100
  }
]

将进行v2容器应用的部署。
※请将”$USER”部分替换为您自己的容器存储库。

$ az containerapp update \
    --resource-group rg-hello \
    --name ca-hello-spring-boot \
    --image $USER/app-hello-spring-boot:v2 \
    --revision-suffix v2

容器应用程序已经更新了。

在另一个终端使用curl命令来确认应用程序的URL。

$ curl https://ca-hello-spring-boot.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/api/data
{"message":"Hello Blue!"}
请求容器应用程序的应用程序URL时,将显示更新前的v1应用程序的输出。

确认Azure门户

image.png
ca-hello-spring-boot--v2
最新版本的流量为0%。在这种状态下,容器应用的应用程序URL不适用于最新版本的v2应用程序。

您还可以检查v2应用程序的修订版本URL。

https://ca-hello-spring-boot--v2.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/

请使用curl命令从另一个终端窗口确认修订URL。
将显示v2应用程序的输出。

$ curl https://ca-hello-spring-boot--v2.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/api/data
{"message":"Hello Green!"}
为了更新应用程序,我们可以将v2应用程序部署到生产环境中。此外,在实际发布之前,我们可以使用修订URL来测试新修订的功能。这是蓝绿部署的目标之一。

切换到新的修订版

从v1应用切换到v2应用。
*从v1版本切换到v2版本。

$ az containerapp ingress traffic set \
    --resource-group rg-hello \
    --name ca-hello-spring-boot \
    --revision-weight ca-hello-spring-boot--v1=0 ca-hello-spring-boot--v2=100

※ 以下是可能的回答内容。

[
  {
    "latestRevision": true,
    "weight": 0
  },
  {
    "revisionName": "ca-hello-spring-boot--v1",
    "weight": 0
  },
  {
    "revisionName": "ca-hello-spring-boot--v2",
    "weight": 100
  }
]

版本已更改。

我們可以從不同的終端中使用curl命令來檢查應用程式的URL。

$ curl https://ca-hello-spring-boot.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/api/data
{"message":"Hello Green!"}
请求容器应用程序的应用程序 URL,并显示更新后的 v2 应用程序的输出。已完成将其部署到生产环境的工作。*本文中的生产环境指的是实际运行环境。

确认 Azure 门户

image.png

发生故障时的回退措施

如果在将服务部署到最新版本后发生问题,需要恢复到之前正常运行的修订版。这是蓝绿部署的一个目的之一。

从v2应用程序切换回v1应用程序。
※ 切换修订版本。

$ az containerapp ingress traffic set \
    --resource-group rg-hello \
    --name ca-hello-spring-boot \
    --revision-weight ca-hello-spring-boot--v1=100 ca-hello-spring-boot--v2=0

请在另一个终端使用curl命令来确认应用程序的URL。

$ curl https://ca-hello-spring-boot.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/api/data
{"message":"Hello Blue!"}

请求容器应用程序的应用URL,显示了更新前的v1应用程序的输出。

确认 Azure 门户

image.png

部署后需注意事项

当容器应用程序的修订版本处于活动状态时,会根据使用情况进行计费。在新的修订版本成功运行并稳定之后,可以解除原始旧修订版本的活动状态。这样可以防止过度计费。
$ az containerapp revision deactivate \
    --resource-group rg-hello \
    --name ca-hello-spring-boot \
    --revision ca-hello-spring-boot--v1 
打开说明。该命令用于非激活 Azure Container Apps 的修订版。

命令
内容

az containerapp revision deactivate
非激活 Container Apps 修订版的命令。

选项

内容

–resource-group
rg-hello
指定要部署资源所属的资源组名称。

–name
ca-hello-spring-boot
指定 Container Apps 的名称。

–revision
ca-hello-spring-boot–v1
将修订版 ca-hello-spring-boot–v1 设置为非激活状态。

确认Azure门户

image.png

总结

我们能够在Azure容器应用环境中实践蓝绿部署。

使用Maven、Docker和Azure CLI,您可以通过终端完成从开发Spring Boot应用程序到创建容器映像再到部署到Azure环境的所有过程。通过这种方式,您可以加深云系统开发所需的技能和理解。即使是初学者也可以轻松地跟随步骤,所以请务必尝试一下。

你觉得怎么样?在 Azure Container Apps 的验证环境中,你可以轻松体验容器应用的蓝绿部署。请务必试试看。今后我们还会介绍更多 Azure 的开发环境,敬请期待。

建议内容

 

bannerAds