Megosztás a következőn keresztül:


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.

Képernyőkép az Azure Container Appsről: Kék/zöld üzembe helyezés.

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.bicepfá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

Következő lépések