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

达到的意图
我将使用Windows 11上的Linux进行云开发。
您可以在这里查看文章的列表。
实现
在Microsoft Azure容器应用(ACA)中,我们将尝试实践容器应用的蓝绿部署。
技術主题
蓝绿部署是什么?
蓝绿部署是一种与传统操作方法不同的方法,用于在生产环境中部署应用程序的新版本。它涉及在生产环境中构建新版本,并在此处测试应用程序,然后切换到传统生产环境。
通常情况下,会准备一个蓝色的生产环境和一个绿色的新生产环境。一开始,蓝色环境作为激活的生产环境运行,而绿色环境是非激活的。
将新版本的应用程序部署到绿色环境中进行测试,并在没有问题的情况下将流量切换到绿色环境。
通过这种方式,可以将停机时间降到最低,并提高系统的可靠性。
开发环境
- Windows 11 Home 22H2 を使用しています。
> 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
請在中文中對以下內容進行本地化解釋,只需一種選項:
藍綠部署的規格
※ 本文所述为规范。
使用自定义容器镜像格式的应用程序。
进行蓝绿部署的步骤
创建应用程序容器镜像
您可以在相关文章中查看步骤。
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上推送的容器镜像并确认其正确运行。
将应用程序部署到 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
命令 内容
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!"}
确认Azure门户

ca-hello-spring-boot--v1
此外,您还可以检查v1应用程序的修订版本URL。
https://ca-hello-spring-boot--v1.jollyisland-XXXXXXX.japaneast.awesomecontainerapps.io/
创建v2应用程序的容器镜像
创建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应用程序部署到Azure容器应用程序
容器应用
配置容器应用程序的流量分流。
* 将当前版本的配置设为100%。
$ az containerapp ingress traffic set \
--resource-group rg-hello \
--name ca-hello-spring-boot \
--revision-weight ca-hello-spring-boot--v1=100
命令
内容
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!"}
确认Azure门户

ca-hello-spring-boot--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!"}
切换到新的修订版
从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!"}
确认 Azure 门户

发生故障时的回退措施
从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 门户

部署后需注意事项
$ az containerapp revision deactivate \
--resource-group rg-hello \
--name ca-hello-spring-boot \
--revision ca-hello-spring-boot--v1
命令
内容
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门户

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