Kék-zöld üzembe helyezés az Azure Container Appsben
A Blue-Green Deployment egy szoftverkiadási stratégia, amelynek célja az állásidő minimalizálása és az alkalmazás új verzióinak üzembe helyezésével járó kockázat csökkentése. Kék-zöld környezetben két azonos környezet, a "kék" és a "zöld" van beállítva. Egy környezet (kék) az aktuális alkalmazásverziót futtatja, egy környezet (zöld) pedig az új alkalmazásverziót.
A zöld környezet tesztelése után a rendszer átirányítja az élő forgalmat, a kék környezet pedig egy új alkalmazásverzió üzembe helyezésére szolgál a következő üzembehelyezési ciklus során.
A kék-zöld üzembe helyezést az Azure Container Appsben engedélyezheti a tárolóalkalmazások változatainak, a forgalmi súlyoknak és a változatcímkéknek a kombinálásával.
A változatokkal létrehozhatja az alkalmazás kék és zöld verzióinak példányait.
Változat | Leírás |
---|---|
Kék változat | A kék címkével ellátott változat az alkalmazás jelenleg futó és stabil verziója. Ez a változat az, amellyel a felhasználók kommunikálnak, és ez az éles forgalom célja. |
Zöld változat | A zöldként megjelölt változat a kék változat másolata, kivéve, ha az alkalmazáskód újabb verzióját és esetleg új környezeti változókat használ. Kezdetben nem kap éles forgalmat, de teljes tartománynévvel (FQDN) érhető el. |
Az új változat tesztelése és ellenőrzése után az éles forgalmat az új változatra irányíthatja. Ha problémákat tapasztal, egyszerűen visszatérhet az előző verzióra.
Műveletek | Leírás |
---|---|
Tesztelés és ellenőrzés | A zöld változatot alaposan teszteltük és ellenőriztük, hogy az alkalmazás új verziója a várt módon működjön. Ez a tesztelés különböző feladatokat tartalmazhat, beleértve a funkcionális teszteket, a teljesítményteszteket és a kompatibilitási ellenőrzéseket. |
Forgalmi kapcsoló | Miután a zöld változat megfelel az összes szükséges tesztnek, egy forgalmi kapcsolót kell végrehajtani, hogy a zöld változat megkezdje az éles terhelés kiszolgálását. Ez a kapcsoló szabályozott módon történik, biztosítva a zökkenőmentes átmenetet. |
Visszaállítás | Ha problémák lépnek fel a zöld változatban, visszaállíthatja a forgalmi kapcsolót, és visszaállíthatja a forgalmat a stabil kék változathoz. Ez a visszaállítás minimális hatással van a felhasználókra, ha problémák merülnek fel az új verzióban. A zöld változat továbbra is elérhető a következő üzembe helyezéshez. |
Szerepkör módosítása | A kék és zöld változatok szerepkörei a zöld változat sikeres üzembe helyezése után változnak. A következő kiadási ciklus során a zöld változat a stabil éles környezetet jelöli, míg az alkalmazáskód új verzióját a kék változatban helyezik üzembe és tesztelik. |
Ez a cikk bemutatja, hogyan implementálhatja a kék-zöld üzembe helyezést egy tárolóalkalmazásban. Az alábbi példák futtatásához egy tárolóalkalmazás-környezetre van szükség, ahol létrehozhat egy új alkalmazást.
Tárolóalkalmazás létrehozása több aktív változattal engedélyezve
A tárolóalkalmazásnak rendelkeznie kell a configuration.activeRevisionsMode
forgalom felosztásának engedélyezéséhez multiple
beállított tulajdonságmal. A determinisztikus változatnevek lekéréséhez a template.revisionSuffix
konfigurációs beállítást egy olyan sztringértékre állíthatja be, amely egyedileg azonosít egy kiadást. Használhat például buildszámokat, vagy a Git rövid kivonatokat véglegesít.
A következő parancsok esetében a rendszer véglegesítési kivonatokat használt.
export APP_NAME=<APP_NAME>
export APP_ENVIRONMENT_NAME=<APP_ENVIRONMENT_NAME>
export RESOURCE_GROUP=<RESOURCE_GROUP>
# A commitId that is assumed to correspond to the app code currently in production
export BLUE_COMMIT_ID=fb699ef
# A commitId that is assumed to correspond to the new version of the code to be deployed
export GREEN_COMMIT_ID=c6f1515
# create a new app with a new revision
az containerapp create --name $APP_NAME \
--environment $APP_ENVIRONMENT_NAME \
--resource-group $RESOURCE_GROUP \
--image mcr.microsoft.com/k8se/samples/test-app:$BLUE_COMMIT_ID \
--revision-suffix $BLUE_COMMIT_ID \
--env-vars REVISION_COMMIT_ID=$BLUE_COMMIT_ID \
--ingress external \
--target-port 80 \
--revisions-mode multiple
# Fix 100% of traffic to the revision
az containerapp ingress traffic set \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--revision-weight $APP_NAME--$BLUE_COMMIT_ID=100
# give that revision a label 'blue'
az containerapp revision label add \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--label blue \
--revision $APP_NAME--$BLUE_COMMIT_ID
Mentse a következő kódot egy nevű main.bicep
fájlba.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
@minLength(1)
@maxLength(64)
@description('Name of containerapp')
param appName string
@minLength(1)
@maxLength(64)
@description('Container environment name')
param containerAppsEnvironmentName string
@minLength(1)
@maxLength(64)
@description('CommitId for blue revision')
param blueCommitId string
@maxLength(64)
@description('CommitId for green revision')
param greenCommitId string = ''
@maxLength(64)
@description('CommitId for the latest deployed revision')
param latestCommitId string = ''
@allowed([
'blue'
'green'
])
@description('Name of the label that gets 100% of the traffic')
param productionLabel string = 'blue'
var currentCommitId = !empty(latestCommitId) ? latestCommitId : blueCommitId
resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' existing = {
name: containerAppsEnvironmentName
}
resource blueGreenDeploymentApp 'Microsoft.App/containerApps@2022-11-01-preview' = {
name: appName
location: location
tags: {
blueCommitId: blueCommitId
greenCommitId: greenCommitId
latestCommitId: currentCommitId
productionLabel: productionLabel
}
properties: {
environmentId: containerAppsEnvironment.id
configuration: {
maxInactiveRevisions: 10 // Remove old inactive revisions
activeRevisionsMode: 'multiple' // Multiple active revisions mode is required when using traffic weights
ingress: {
external: true
targetPort: 80
traffic: !empty(blueCommitId) && !empty(greenCommitId) ? [
{
revisionName: '${appName}--${blueCommitId}'
label: 'blue'
weight: productionLabel == 'blue' ? 100 : 0
}
{
revisionName: '${appName}--${greenCommitId}'
label: 'green'
weight: productionLabel == 'green' ? 100 : 0
}
] : [
{
revisionName: '${appName}--${blueCommitId}'
label: 'blue'
weight: 100
}
]
}
}
template: {
revisionSuffix: currentCommitId
containers:[
{
image: 'mcr.microsoft.com/k8se/samples/test-app:${currentCommitId}'
name: appName
resources: {
cpu: json('0.5')
memory: '1.0Gi'
}
env: [
{
name: 'REVISION_COMMIT_ID'
value: currentCommitId
}
]
}
]
}
}
}
output fqdn string = blueGreenDeploymentApp.properties.configuration.ingress.fqdn
output latestRevisionName string = blueGreenDeploymentApp.properties.latestRevisionName
Az alkalmazás üzembe helyezése a Bicep-sablonnal a következő paranccsal:
export APP_NAME=<APP_NAME>
export APP_ENVIRONMENT_NAME=<APP_ENVIRONMENT_NAME>
export RESOURCE_GROUP=<RESOURCE_GROUP>
# A commitId that is assumed to belong to the app code currently in production
export BLUE_COMMIT_ID=fb699ef
# A commitId that is assumed to belong to the new version of the code to be deployed
export GREEN_COMMIT_ID=c6f1515
# create a new app with a blue revision
az deployment group create \
--name createapp-$BLUE_COMMIT_ID \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters appName=$APP_NAME blueCommitId=$BLUE_COMMIT_ID containerAppsEnvironmentName=$APP_ENVIRONMENT_NAME \
--query properties.outputs.fqdn
Új változat üzembe helyezése és címkék hozzárendelése
A kék címke jelenleg egy olyan változatra utal, amely az alkalmazás teljes tartománynevére érkező éles forgalmat veszi át. A zöld címke egy alkalmazás új, éles környezetben üzembe helyezendő verziójára utal. Egy új véglegesítési kivonat azonosítja az alkalmazáskód új verzióját. Az alábbi parancs üzembe helyez egy új változatot a véglegesítési kivonathoz, és zöld címkével jelöli meg.
#create a second revision for green commitId
az containerapp update --name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--image mcr.microsoft.com/k8se/samples/test-app:$GREEN_COMMIT_ID \
--revision-suffix $GREEN_COMMIT_ID \
--set-env-vars REVISION_COMMIT_ID=$GREEN_COMMIT_ID
#give that revision a 'green' label
az containerapp revision label add \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--label green \
--revision $APP_NAME--$GREEN_COMMIT_ID
#deploy a new version of the app to green revision
az deployment group create \
--name deploy-to-green-$GREEN_COMMIT_ID \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters appName=$APP_NAME blueCommitId=$BLUE_COMMIT_ID greenCommitId=$GREEN_COMMIT_ID latestCommitId=$GREEN_COMMIT_ID productionLabel=blue containerAppsEnvironmentName=$APP_ENVIRONMENT_NAME \
--query properties.outputs.fqdn
Az alábbi példa a forgalmi szakasz konfigurálását mutatja be. A kék commitId
színnel ellátott változat az éles forgalom 100%-át veszi át, míg az újonnan üzembe helyezett zöld commitId
színnel ellátott változat nem veszi át az éles forgalmat.
{
"traffic": [
{
"revisionName": "<APP_NAME>--fb699ef",
"weight": 100,
"label": "blue"
},
{
"revisionName": "<APP_NAME>--c6f1515",
"weight": 0,
"label": "green"
}
]
}
Az újonnan üzembe helyezett változat a címkespecifikus teljes tartománynévvel tesztelhető:
#get the containerapp environment default domain
export APP_DOMAIN=$(az containerapp env show -g $RESOURCE_GROUP -n $APP_ENVIRONMENT_NAME --query properties.defaultDomain -o tsv | tr -d '\r\n')
#Test the production FQDN
curl -s https://$APP_NAME.$APP_DOMAIN/api/env | jq | grep COMMIT
#Test the blue label FQDN
curl -s https://$APP_NAME---blue.$APP_DOMAIN/api/env | jq | grep COMMIT
#Test the green label FQDN
curl -s https://$APP_NAME---green.$APP_DOMAIN/api/env | jq | grep COMMIT
Éles forgalom küldése a zöld változatra
Miután meggyőződett arról, hogy a zöld változatban szereplő alkalmazáskód a várt módon működik, a rendszer az éles forgalom 100%-át elküldi a változatnak. A zöld változat mostantól éles változat lesz.
# set 100% of traffic to green revision
az containerapp ingress traffic set \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--label-weight blue=0 green=100
# make green the prod revision
az deployment group create \
--name make-green-prod-$GREEN_COMMIT_ID \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters appName=$APP_NAME blueCommitId=$BLUE_COMMIT_ID greenCommitId=$GREEN_COMMIT_ID latestCommitId=$GREEN_COMMIT_ID productionLabel=green containerAppsEnvironmentName=$APP_ENVIRONMENT_NAME \
--query properties.outputs.fqdn
Az alábbi példa bemutatja, hogyan van konfigurálva a traffic
szakasz a lépés után. Az új alkalmazáskóddal ellátott zöld változat az összes felhasználói forgalmat átveszi, míg a régi alkalmazásverzióval rendelkező kék változat nem fogadja el a felhasználói kéréseket.
{
"traffic": [
{
"revisionName": "<APP_NAME>--fb699ef",
"weight": 0,
"label": "blue"
},
{
"revisionName": "<APP_NAME>--c6f1515",
"weight": 100,
"label": "green"
}
]
}
Az üzembe helyezés visszaállítása problémák esetén
Ha az éles környezetben való futtatás után az új változatban hibák találhatók, visszaállíthatja az előző jó állapotot. A visszaállítás után a forgalom 100%-át a kék változat régi verziójára küldi a rendszer, és ez a változat ismét éles változatként lesz kijelölve.
# set 100% of traffic to green revision
az containerapp ingress traffic set \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--label-weight blue=100 green=0
# rollback traffic to blue revision
az deployment group create \
--name rollback-to-blue-$GREEN_COMMIT_ID \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters appName=$APP_NAME blueCommitId=$BLUE_COMMIT_ID greenCommitId=$GREEN_COMMIT_ID latestCommitId=$GREEN_COMMIT_ID productionLabel=blue containerAppsEnvironmentName=$APP_ENVIRONMENT_NAME \
--query properties.outputs.fqdn
A hibák kijavítása után az alkalmazás új verziója ismét zöld változatként lesz üzembe helyezve. A zöld verzió végül az éles változat lesz.
Következő üzembehelyezési ciklus
A zöld címke most a stabil üzemi kódot futtató változatot jelöli.
A következő üzembehelyezési ciklus során a kék azonosítja a változatot az éles környezetben üzembe helyezendő új alkalmazásverzióval.
Az alábbi parancsok bemutatják, hogyan készülhet fel a következő üzembehelyezési ciklusra.
# set the new commitId
export BLUE_COMMIT_ID=ad1436b
# create a third revision for blue commitId
az containerapp update --name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--image mcr.microsoft.com/k8se/samples/test-app:$BLUE_COMMIT_ID \
--revision-suffix $BLUE_COMMIT_ID \
--set-env-vars REVISION_COMMIT_ID=$BLUE_COMMIT_ID
# give that revision a 'blue' label
az containerapp revision label add \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--label blue \
--revision $APP_NAME--$BLUE_COMMIT_ID
# set the new commitId
export BLUE_COMMIT_ID=ad1436b
# deploy new version of the app to blue revision
az deployment group create \
--name deploy-to-blue-$BLUE_COMMIT_ID \
--resource-group $RESOURCE_GROUP \
--template-file main.bicep \
--parameters appName=$APP_NAME blueCommitId=$BLUE_COMMIT_ID greenCommitId=$GREEN_COMMIT_ID latestCommitId=$BLUE_COMMIT_ID productionLabel=green containerAppsEnvironmentName=$APP_ENVIRONMENT_NAME \
--query properties.outputs.fqdn