我们应该为所有正在开发的产品使用一个 Azure 容器注册表 (ACR) 还是每个产品使用一个 ACR?

mar*_*ark 5 azure artifactory azure-container-registry

我们已经开始将产品从这一庞大的整体中剥离到 Azure 中。产品也可以称为微服务。

我们有一个问题 - 我们应该有一个 Azure 容器注册表 (ACR) 来服务所有不同的产品,还是每个产品都应该有自己的 ACR?我们仅讨论开发订阅。在生产中,我们计划拥有一个不同的 ACR 或一组 ACR,图像将从开发中导入到其中。

但问题是——推荐的方式是什么?如果我们将 ACR 视为一件人工制品,那么一个就足够了。毕竟,我们只有一个 Azure Artifacts 实例(具有多个不同的源),用于推送 nuget 包。nuget 包和 docker 镜像都是构建工件,因此有一种观点认为,如果我们只有一个 nuget 工件,为什么还要有多个 ACR?

另一方面,对于 Azure Artifacts,我们实际上没有选择 - 只有一个选择。因此,也许我们错过了一些可以通过拥有多个 ACR 来实现甚至期望的有效场景。

Nic*_*ico 8

这个问题有点老了,但仍然相关。

对于这个问题有两种方法:

  1. 为每个环境使用 1 个注册表,例如 dev、staging、prod
  2. 对所有环境使用 1 个注册表。

我推荐解决方案 2。您应该像查看源代码存储库一样查看容器注册表。您没有为每个环境提供 1 个代码存储库,对吗?容器注册表也是如此。原因是容器注册表应该(必须)包含编译的源代码和运行它的基本基础设施。就是这样。这只是你的代码存储库是相同的东西,但是是预编译/打包的。如果您的开发人员有权访问您的代码存储库,那么他们基本上对您的容器注册表具有相同的访问权限。

如果您每次部署到生产环境时都考虑重建映像,则多个注册表可能会很危险。您可能认为您的映像在暂存中工作,您可以为产品注册表、依赖项更改和中断生产重建它。缓解此问题的方法是从暂存区下载容器并将其上传到生产环境。在我看来,只需使用您刚刚在暂存中测试的容器,而不必费心下载重新上传到产品注册表。

多个注册表浪费资源。您的所有注册表中都有所有图像的副本。只需使用 1 个注册表。

一个大型注册表使安全性变得更加容易。您只需扫描一个注册表,并且可以在部署过程中更早地集成安全性(提前扫描暂存映像,因为这是您将在产品中部署的容器)。

如果你创建了很多环境,那么创建新的注册表并更改所有 CI 以推送到这个新的注册表是非常麻烦的。1.注册表解决这个问题很简单。

使用多个容器注册表的唯一原因是因为您的容器中有敏感信息,或者容器中有特定于环境的配置。如果这就是您正在做的事情,请使用多个注册表。

TL;博士; 使用一个注册表,对于多个注册表并没有真正的好处,甚至安全性也没有。


Saj*_*ran 4

您可以通过两种方式做到这一点,根据最佳实践文档,您可以拥有单个容器注册表并通过namespaces专用资源组管理它们,

通过利用存储库命名空间,您可以允许在组织内的多个组之间共享单个注册表。注册表可以在部署和团队之间共享。Azure 容器注册表支持嵌套命名空间,从而实现组隔离。

例如,请考虑以下容器映像标签。在公司范围内使用的映像(例如 aspnetcore)放置在根命名空间中,而产品和营销组拥有的容器映像各自使用自己的命名空间。

  • contoso.azurecr.io/aspnetcore:2.0
  • contoso.azurecr.io/products/widget/web:1
  • contoso.azurecr.io/products/bettermousetrap/refundapi:12.3
  • contoso.azurecr.io/marketing/2017-fall/concertpromotions/campaign:218.42