从另一个具有不同订阅的Azure容器存储库ACR引用Docker映像

问题描述

我正在尝试从订阅(DEV-Subscription)中的另一个Azure容器注册表(DEV-ACR)中拉出订阅(QA-Subscription)中(QA-ACR)中的docker映像。

下面是详细步骤。

  1. 在Subscription DEV-Subscription中创建docker映像(例如:docker-image-sample)

  2. 在Subscription DEV-Subscption中使用以下命令创建了秘密文件

    kubectl create secret docker-registry test-secret --docker-server=devsample.azurecr.io --docker-username=**** --docker-password=****
    
  3. 通过引用此机密,
  4. Pod在DEV订阅中运行。下面是部署文件

     apiVersion: apps/v1beta1
     kind: Deployment
     Metadata:
       name: test  
     spec:
       replicas: 2
       template:
         Metadata:
           labels:
             app: test
         spec:
           containers:
           - image: devsample.azurecr.io/test_msdi:latest
             imagePullPolicy: Always
             name: test
             ports:
             - containerPort: 443
             env:
             - name: ASPNETCORE_ENVIRONMENT
               value: dev
           imagePullSecrets:
           - name: test-secret
    
  5. 我正在尝试从其他订阅中的另一个ACR中提取docker映像。

  6. 在这里也像上面一样创建了相同的秘密。

  7. 下面是kubernetes部署文件内容

     apiVersion: apps/v1beta1
     kind: Deployment
     Metadata:
       name: test  
     spec:
       replicas: 2
       template:
         Metadata:
           labels:
             app: test
         spec:
           containers:
           - image: devsample.azurecr.io/test_msdi:latest
             imagePullPolicy: Always
             name: test
             ports:
             - containerPort: 443
             env:
             - name: ASPNETCORE_ENVIRONMENT
               value: qa
           imagePullSecrets:
           - name: test-secret
    
  8. Pod从另一个具有不同订阅的ACR失败。问题是“退出拉取图像...”

解决方法

由于使用的是Azure容器注册表,因此与在Kubernetes机密中传递凭据相比,您可能会更容易在容器注册表上分配AKS服务主体权限。

$Aks = Get-AzAks -ResourceGroupName QaSubscriptionAksResourceGroup -Name QaSubscriptionAks
New-AzRoleAssignment -ApplicationId $Aks.ServicePrincipalProfile.ClientId -RoleDefinitionName AcrPull -ResourceGroupName DevSubscriptionAcrResourceGroup

您可能需要在两个命令之间运行Select-AzSubscription才能从QA订阅更改为DEV订阅。设置完成后,删除

imagePullSecrets:
- name: test-secret

从您的部署文件中重新运行它。

根据您的AKS实例的部署方式,您可能会发现AKS服务主体已经在其自己的订阅中分配了AcrPull角色,如果是这种情况,则可以完全删除imagePullSecrets

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...