使用Azure Functions自动同步国内外docker 镜像
发布日期:2021-07-01 03:44:25 浏览次数:2 分类:技术文章

本文共 4437 字,大约阅读时间需要 14 分钟。

对于一家业务遍布全球的企业来说,往往会遇到数据同步的困境,明明是一份代码,国内更新之后,还要同步一份到国外 ,反之亦然。尤其在当前微服务技术发展下,应用程序代码的迭代速度越来越快,如何能保持一份代码,减少人为同步的干扰,并且确保同步机制的高可用性、易维护性?本篇我们将为大家介绍,使用Azure Container registries的Web Hook功能,通过调用Azure Functions服务,将国内外container  image自动同步,方便出海或入华的客户快速部署和更新container image。

 图片                                            

准备工作

我们先了解下本次涉及的Azure服务:

  • Azure Functions: Azure Functions是Azure平台的serverless函数计算服务,您只用将代码上传到Azure Functions就可以运行,而无需创建和维护服务器。Azure Functions是为事件触发所设计,可以响应数据变动触发、计划事件触发或HTTP请求触发等。支持丰富的编程语言如C#, Java, JavaScript, Python, PowerShell 等。Azure Functions的运行时也已在上开源。

  • Azure Container Registry:Azure Container Registry (ACR) 是一个基于开源Docker Registry 2.0所构建的一个托管的私有registry服务,ACR不仅仅能够存储您的docker image,还能build image。这意味着您只用将Docker file传给ACR,通过简单的API操作,就能够在Azure上直接Build 镜像(Windows docker image和Linux docker image均支持)

 

操作步骤

创建Function App

1. 在Global Azure Portal界面,搜索Function App,然后点击 ”Add” 按钮,添加一个Function。语言选择”Python”,版本为 3.8,在下一步Hosting界面,Plan选择为”Consumption (Serverless)”,之后完成创建。

图片

 

2. 在创建的Function App的Setting设置项中,点击Identity,然后将System assigned 的Status设置为On,点击保存,之后在role assignments中,添加AcrPush, AcrPull, AcrDelete, AcrImageSinger, AcrQuarantineWriter, AcrQuarantineReader 权限。这一步的目的是:让Function App有权限访问Azure Container Registries,这样从国内ACR里读取镜像之后,有权限写入到Global ACR中。

图片

 

在VS Code中配置Azure Functions

1. 在自己电脑上安装VS Code,在Extensions中搜索”Azure Functions”,然后安装Azure Functions插件。同时需要在自己电脑上安装Python3.8和Nodejs的环境。安装完成之后,在VS Code中,点击Azure的图标,Sign in to Azure,之后会自动打开浏览器,在浏览器登录页面,输入Azure的用户名和密码完成登录。登录完成,在VS Code左侧将会看到Azure订阅名,以及在第一步创建的Function

图片

 

2. 参考下图创建Azure Functions本地package.  创建本地package的目的是:我们可以在本地进行代码的编辑,以及调试,等调试通过之后,可以push到Azure Functionss进行使用。在创建的时候,选择 “HTTP trigger”,trigger名字可以根据自己的需要写,比如”acr_web_trigger”,Authorization Level选择”Admin”。创建完成之后,我们会看到VS Code自动打开__init__.py文件,在该文件中,提供了一些示例代码.

图片

 

3. 使用下面的代码替换自动生成的代码。

注:标红的代码需要修改成您自己的值,

SUBSCRIPTION_ID 为Global Azure的订阅ID

TARGET_RESOURCE_GROUP 为Global Azure的资源组

TARGET_IMG_REPO 为Global Azure的ACR名字

passwd为国内Azure ACR的密码(在ACR中,点击Access Keys,启用Admin user,能看到两个password,使用任意一个即可)

import logging,jsonimport azure.functions as funcfrom msrestazure.azure_active_directory import MSIAuthenticationcredentials = MSIAuthentication()SUBSCRIPTION_ID = '5fb605ab-c16c-4184-8a02-fee38cc11b8c'import  azure.mgmt.containerregistry as acracrclient = acr.ContainerRegistryManagementClient(credentials=credentials, subscription_id=SUBSCRIPTION_ID)def main(req: func.HttpRequest) -> func.HttpResponse:    logging.info('Python HTTP trigger function processed a request.')    acr_event=json.loads(req.get_body())    SRC_REGISTRY_NAME = acr_event['request']['host'].split('.')[0]    SOURCE_IMG = acr_event["target"]['repository'] + ':' + acr_event["target"]['tag']    SRC_REGISTRY_URI = acr_event['request']['host']    TARGET_IMG_TAG = [SOURCE_IMG]    TARGET_RESOURCE_GROUP = 'xiangliu_csa'    TAEGET_IMG_REPO = 'xiangliurepo2'    src_image_url = acr_event['request']['host'] + '/' + acr_event["target"]['repository'] + ':' + acr_event["target"]['tag']    passwd = ‘xxxxxxxxx‘    imp_src_cred = acrclient.models().ImportSourceCredentials(password= passwd, username= SRC_REGISTRY_NAME)    import_img_src = acrclient.models().ImportSource(source_image = SOURCE_IMG ,registry_uri= SRC_REGISTRY_URI , credentials = imp_src_cred)    img_mode = acrclient.models().ImportMode.force    import_img_para=acrclient.models().ImportImageParameters(source=import_img_src, target_tags = TARGET_IMG_TAG, mode= img_mode)    imp_img = acrclient.registries.import_image(resource_group_name= TARGET_RESOURCE_GROUP, registry_name =TAEGET_IMG_REPO, parameters=import_img_para)    return func.HttpResponse(src_image_url + " copied successfully")

4. 找到代码中requirements.txt文件,在文件中添加下面的几个依赖程序包​​​​​​​

azure-functionsazure-mgmt-containerregistry==2.8.0msrestazure

​​​​​​​图片

 

5. 完成上述操作之后,点击”Deploy to Function App”按钮,然后选择先前创建的Function名字”acrcopydemo”进行部署。如果安装了,您也可以通过下面的命令发布Azure Functionss代码: func Azure Functionsapp publish acrcopydemo

图片

 

发布完成之后,在Azure Functions中可以看到之前传过来的代码

 

 

在国内Azure Container registries添加Webhooks

1. 先在Global Azure的Function App处,找到先前创建的acrcopydemo,然后在Functions处, 点击”Get Function Url”,选择”masterKey (host key)”将其复制图片

图片

2. 回到国内,在国内Azure的Azure Container registries处,找到要同步的registries,然后点击 Webhooks—Add,添加一个Webhook。在Webhook中,Service URI为3.1复制的地址,Actions中勾选所有,点击创建

图片

 

3. 使用docker 客户端登陆国内ACR,上传一个docker image,然后观察Webhooks的执行结果,如果执行成功,将返回http 200的status code。同时切换到Global Azure的ACR界面,我们将看到docker image已经成功同步过来。

图片

 

总结

本文提供了利用Azure Functions来实现国内外容器镜像的同步的思路与步骤,除了本文所提及的这个应用场景之外,稍加改动,也很容易就能实现将GitHub Repo或其他托管的docker image repo和ACR的同步。

转载地址:https://microsoftchina.blog.csdn.net/article/details/113863452 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数字时代,“牛”转乾坤操作指南
下一篇:如何利用 Azure Migrate 高效、快捷地完成虚机迁移

发表评论

最新留言

不错!
[***.144.177.141]2024年05月05日 00时52分05秒