使用 Azure 容器注册表 和 AKS Arc 从专用容器注册表部署到本地 Kubernetes

适用于:Azure Stack HCI 版本 23H2

本文介绍如何使用 Azure 容器注册表 从专用容器注册表部署容器映像,可以在 AKS Arc 部署的自己的数据中心内运行。 部署到 AKS 托管的本地 Kubernetes 群集。 使用 Azure 容器注册表可以在专用注册表中为所有类型的容器部署生成、存储和管理容器映像与项目。

本文介绍如何在 Azure 中创建专用容器注册表,并将容器映像推送到该专用容器注册表。 然后,可以从专用注册表部署到托管在 AKS Arc 中的本地 Kubernetes 群集。

有关Azure 容器注册表的详细信息,请参阅Azure 容器注册表文档

先决条件

验证是否已满足以下要求:

在 Azure 中创建专用容器注册表

若要创建容器注册表,请从 资源组开始。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 使用 az group create 命令创建资源组。 以下示例在 eastus 区域中创建资源组:

az group create --name <RESOURCE_GROUP_NAME> --location eastus

使用 az acr create 命令创建容器注册表实例,并提供自己的注册表名称。 注册表名称在 Azure 中必须唯一,并且包含 5 到 50 个字母数字字符。 在本文的其余部分中, <acrName> 用作容器注册表名称的占位符,但你可以提供自己的唯一注册表名称。 基本 SKU 是用于开发目的的成本优化入口点,可提供存储和吞吐量的平衡:

az acr create --resource-group <RESOURCE_GROUP_NAME> --name <REGISTRY_NAME> --sku Basic

创建容器注册表后,使用以下命令创建服务主体,以便可以从 Kubernetes 访问容器注册表:

az ad sp create-for-rbac /
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RG_NAME>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME> /
--role Contributor /
--name <SERVICE_PRINCIPAL_NAME>

Azure 容器注册表支持三个访问角色。 应用程序开发人员最常使用 参与者 角色。 但是,在实际方案中,可能需要根据所需的访问类型创建多个服务主体:

  • 参与者:此角色提供对存储库的推送和拉取访问。
  • 读取者:此角色仅允许对存储库进行拉取访问。
  • 所有者:此角色允许向其他用户分配角色,以及对存储库进行推送和拉取访问。

上一个命令应生成类似于以下文本的输出:

{
"appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"displayName": "akshci-service-principal",
"name": "http://akshci-service-principal",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

成功创建服务主体后,将 appId 和密码复制到安全位置,以便稍后在部署中使用。

若要详细了解如何使用服务主体和 Azure 容器注册表,请参阅使用服务主体的 Azure 容器注册表身份验证

登录专用容器注册表

若要使用容器注册表实例,必须先登录。 可以使用 Azure CLI 或 Docker CLI 登录。

选项 1:从 Azure CLI 登录

使用 az acr sign in 命令并提供在上一步中分配给容器注册表的唯一名称:

az acr login --name <REGISTRY_NAME>

选项 2:从 Docker CLI 登录

若要使用 Docker CLI 访问容器注册表,请在 Bash 或 PowerShell 终端中键入以下命令:

docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>

在任一选项中,命令完成后都应返回 登录成功 消息。

将映像推送到容器注册表

成功登录后,可以开始将映像推送到容器注册表。 首先,运行 docker images 命令以查看本地计算机上的映像列表:

REPOSITORY TAG IMAGE ID CREATED SIZE

mcr.microsoft.com/azure-functions/dotnet 3.0 9f8ad1bdee67 5 months ago
540MB

poemfinder-app latest 2d9bef425603 6 months ago 208MB

若要开始,请使用 docker tag 命令标记映像,然后使用 docker push 将其推送到容器注册表:

docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

再次运行 docker images 命令,验证映像是否已正确标记。 确认后,运行 docker push 以推送到容器注册表,如下所示:

docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

若要确认映像已成功推送到容器注册表,请运行以下命令:

az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table

将映像从容器注册表部署到 AKS

若要将容器映像从容器注册表部署到 Kubernetes 群集,请创建 Kubernetes 机密 来存储注册表凭据。 Kubernetes 使用“映像拉取机密” 来存储向注册表证明身份所需的信息。 若要为容器注册表创建拉取机密,请提供服务主体 ID、密码和注册表 URL:

kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<REGISTRY_NAME>.azurecr.io \
--docker-username=<appId> \
--docker-password=<password>

下表描述了输入参数:

说明
secret-name 映像拉取机密的名称;例如 。 acr-secret
namespace 要在其中放置机密的 Kubernetes 命名空间。 仅当想要将机密放置在默认命名空间以外的命名空间中时,才需要。
<REGISTRY_NAME> 容器注册表的名称。 例如 myregistry。 是 --docker-server 注册表登录服务器的完全限定名称。
appId Kubernetes 用于访问注册表的服务主体的 ID。
password 服务主体密码。

创建映像拉取机密后,即可使用它来创建 Kubernetes Pod 和部署。 在部署文件中提供下机密 imagePullSecrets 的名称,如以下示例所示:

apiVersion: v1
kind: Pod
metadata:
name: poemfinder-app
namespace: mydemoapps
spec:
containers:
 - name: poemfinder-app
   image: <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
   imagePullPolicy: IfNotPresent
 - imagePullSecrets:
   - name: acr-secret

在此示例中, poemfinder-app:v1.0 是要从容器注册表中拉取的映像的名称, acr-secret 是你为访问注册表而创建的拉取机密的名称。 部署 Pod 时,如果群集上尚不存在映像,Kubernetes 会自动从注册表拉取映像。

可以将上述 Pod 配置保存在 pod-example.yaml 等文件中,然后将其部署到 Kubernetes,如下所示:

kubectl create -f pod-example.yaml

若要确认是否已使用容器注册表中的容器映像成功创建 Pod,请运行 kubectl describe pod <POD_NAME>,其中应显示用于创建 Pod 的容器映像。

后续步骤