النشر الأزرق والأخضر في Azure Container Apps
النشر الأزرق والأخضر هو استراتيجية إصدار برامج تهدف إلى تقليل وقت التعطل وتقليل المخاطر المرتبطة بنشر إصدارات جديدة من التطبيق. في التوزيع الأزرق والأخضر، يتم إعداد بيئتين متطابقتين، يشار إليهما باسم "الأزرق" و"الأخضر". تعمل بيئة واحدة (أزرق) على تشغيل إصدار التطبيق الحالي وبيئة واحدة (خضراء) تقوم بتشغيل إصدار التطبيق الجديد.
بمجرد اختبار البيئة الخضراء، يتم توجيه حركة المرور المباشرة إليها، ويتم استخدام البيئة الزرقاء لنشر إصدار تطبيق جديد أثناء دورة النشر التالية.
يمكنك تمكين النشر الأزرق والأخضر في Azure Container Apps من خلال الجمع بين مراجعات تطبيقات الحاوية وأوزان نسبة استخدام الشبكة وتسميات المراجعة.
يمكنك استخدام المراجعات لإنشاء مثيلات للإصدارات الزرقاء والأخضر من التطبيق.
المراجعة | الوصف |
---|---|
مراجعة زرقاء | المراجعة المسماة باللون الأزرق هي الإصدار الحالي والمستقر من التطبيق. هذه المراجعة هي تلك التي يتفاعل معها المستخدمون، وهي الهدف من حركة مرور الإنتاج. |
مراجعة خضراء | المراجعة المسماة باللون الأخضر هي نسخة من المراجعة الزرقاء باستثناء أنها تستخدم إصدارا أحدث من التعليمات البرمجية للتطبيق وربما مجموعة جديدة من متغيرات البيئة. لا يتلقى أي حركة مرور إنتاج في البداية ولكن يمكن الوصول إليها عبر اسم مجال مؤهل بالكامل (FQDN). |
بعد اختبار المراجعة الجديدة والتحقق منها، يمكنك بعد ذلك توجيه حركة مرور الإنتاج إلى المراجعة الجديدة. إذا واجهت مشكلات، يمكنك التراجع بسهولة إلى الإصدار السابق.
الإجراءات | الوصف |
---|---|
الاختبار والتحقق | يتم اختبار المراجعة الخضراء والتحقق منها بدقة للتأكد من أن الإصدار الجديد من التطبيق يعمل كما هو متوقع. قد يتضمن هذا الاختبار مهاما مختلفة، بما في ذلك الاختبارات الوظيفية واختبارات الأداء وفحوصات التوافق. |
رمز تبديل نسبة استخدام الشبكة | بمجرد اجتياز المراجعة الخضراء لجميع الاختبارات الضرورية، يتم تنفيذ مفتاح حركة المرور بحيث تبدأ المراجعة الخضراء في خدمة تحميل الإنتاج. يتم إجراء هذا التبديل بطريقة خاضعة للرقابة، مما يضمن انتقالا سلسا. |
العودة إلى الحالة السابقة | إذا حدثت مشاكل في المراجعة الخضراء، يمكنك إعادة مفتاح حركة المرور، وتوجيه نسبة استخدام الشبكة مرة أخرى إلى المراجعة الزرقاء المستقرة. يضمن هذا التراجع الحد الأدنى من التأثير على المستخدمين إذا كانت هناك مشكلات في الإصدار الجديد. لا تزال المراجعة الخضراء متاحة للتوزيع التالي. |
تغيير الدور | تتغير أدوار المراجعات الزرقاء والأخضر بعد التوزيع الناجح إلى المراجعة الخضراء . أثناء دورة الإصدار التالية، تمثل المراجعة الخضراء بيئة الإنتاج الثابتة بينما يتم نشر الإصدار الجديد من التعليمات البرمجية للتطبيق واختباره في المراجعة الزرقاء . |
توضح لك هذه المقالة كيفية تنفيذ النشر الأزرق والأخضر في تطبيق حاوية. لتشغيل الأمثلة التالية، تحتاج إلى بيئة تطبيق حاوية حيث يمكنك إنشاء تطبيق جديد.
إشعار
راجع مستودع containerapps-blue-green للحصول على مثال كامل لسير عمل GitHub الذي ينفذ النشر الأزرق والأخضر لتطبيقات الحاوية.
إنشاء تطبيق حاوية مع تمكين مراجعات نشطة متعددة
يجب أن يحتوي تطبيق الحاوية على الخاصية المعينة configuration.activeRevisionsMode
multiple
لتمكين تقسيم نسبة استخدام الشبكة. للحصول على أسماء المراجعة المحددة، يمكنك تعيين template.revisionSuffix
إعداد التكوين إلى قيمة سلسلة تعرف الإصدار بشكل فريد. على سبيل المثال، يمكنك استخدام أرقام الإنشاء، أو تثبيت git لتجزئة قصيرة.
بالنسبة للأوامر التالية، تم استخدام مجموعة من تجزئات التثبيت.
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
احفظ التعليمات البرمجية التالية في ملف يسمى main.bicep
.
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
انشر التطبيق باستخدام قالب Bicep باستخدام هذا الأمر:
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
نشر مراجعة جديدة وتعيين التسميات
تشير التسمية الزرقاء حاليا إلى مراجعة تأخذ حركة مرور الإنتاج التي تصل إلى FQDN للتطبيق. تشير التسمية الخضراء إلى إصدار جديد من تطبيق على وشك طرحه في الإنتاج. تحدد تجزئة التثبيت الجديدة الإصدار الجديد من التعليمات البرمجية للتطبيق. يقوم الأمر التالي بنشر مراجعة جديدة لتجزئة التثبيت هذه ووضع علامة عليها بتسمية خضراء .
#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
يوضح المثال التالي كيفية تكوين قسم نسبة استخدام الشبكة. تأخذ المراجعة باللون الأزرق commitId
100٪ من نسبة استخدام الشبكة للإنتاج بينما لا تأخذ المراجعة المنشورة حديثا باللون الأخضر commitId
أي حركة مرور للإنتاج.
{
"traffic": [
{
"revisionName": "<APP_NAME>--fb699ef",
"weight": 100,
"label": "blue"
},
{
"revisionName": "<APP_NAME>--c6f1515",
"weight": 0,
"label": "green"
}
]
}
يمكن اختبار المراجعة المنشورة حديثا باستخدام FQDN الخاص بالتسمية:
#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 lable FQDN
curl -s https://$APP_NAME---blue.$APP_DOMAIN/api/env | jq | grep COMMIT
#Test the green lable FQDN
curl -s https://$APP_NAME---green.$APP_DOMAIN/api/env | jq | grep COMMIT
إرسال حركة مرور الإنتاج إلى المراجعة الخضراء
بعد التأكد من أن التعليمات البرمجية للتطبيق في المراجعة الخضراء تعمل كما هو متوقع، يتم إرسال 100٪ من حركة مرور الإنتاج إلى المراجعة. أصبحت المراجعة الخضراء الآن مراجعة الإنتاج.
# 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
يوضح المثال التالي كيفية traffic
تكوين المقطع بعد هذه الخطوة. تأخذ المراجعة الخضراء مع التعليمات البرمجية للتطبيق الجديد جميع حركة مرور المستخدم بينما لا تقبل المراجعة الزرقاء مع إصدار التطبيق القديم طلبات المستخدم.
{
"traffic": [
{
"revisionName": "<APP_NAME>--fb699ef",
"weight": 0,
"label": "blue"
},
{
"revisionName": "<APP_NAME>--c6f1515",
"weight": 100,
"label": "green"
}
]
}
التراجع عن النشر إذا كانت هناك مشاكل
إذا تم العثور على المراجعة الجديدة بعد تشغيلها في الإنتاج على أنها تحتوي على أخطاء، يمكنك العودة إلى الحالة الجيدة السابقة. بعد التراجع، يتم إرسال 100٪ من نسبة استخدام الشبكة إلى الإصدار القديم في المراجعة الزرقاء ويتم تعيين هذه المراجعة على أنها مراجعة الإنتاج مرة أخرى.
# 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
بعد إصلاح الأخطاء، يتم نشر الإصدار الجديد من التطبيق كمراجعة خضراء مرة أخرى. يصبح الإصدار الأخضر في النهاية مراجعة الإنتاج.
دورة التوزيع التالية
الآن تشير التسمية الخضراء إلى المراجعة التي تقوم حاليا بتشغيل رمز الإنتاج الثابت.
أثناء دورة التوزيع التالية، يحدد اللون الأزرق المراجعة مع إصدار التطبيق الجديد الذي يتم طرحه في الإنتاج.
توضح الأوامر التالية كيفية التحضير لدورة التوزيع التالية.
# 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