【问题标题】:There is a way to pull images from azure ACR without passing secret to evrey container?有一种方法可以从 azure ACR 中提取图像,而无需将秘密传递给每个容器?
【发布时间】:2021-03-18 06:14:24
【问题描述】:

我正在使用 Minikube 进行开发,我需要构建一个 k8s 应用程序来从 ACR 中提取所有图像,所有图像都已存储在 ACR 上。

要从 azure 中提取图像,我需要使用 azure 帐户的用户和密码创建密码,并将此密码传递给我要使用 imagePullSecrets (documentation here) 提取的每个图像

有没有办法将此注册表添加为命名空间或项目的全局设置? 我不明白为什么每个图像都需要在规范中隐含地获取秘密。

编辑: 感谢 cmets 我稍后会检查它们,现在我在 minikube 级别解决了这个问题。有一种方法可以在 minikube 中设置私有注册表 (doc here)

在我的版本中this bug 存在,this 回答解决了问题。

【问题讨论】:

  • 你还在努力吗?关于这个问题还有更多更新吗?它解决了你的问题吗?
  • 我编辑了我的帖子,它是由 minikube 注册表插件完成的
  • 根据你提供的链接,它也是用secret来拉图的,不同的是minikube给你设置的。事实上,没有什么不同。

标签: azure kubernetes azure-container-registry


【解决方案1】:

据我所知,如果你不使用 Azure 中的 K8s,我指的是 Azure Kubernetes Service,那么我知道有两种方法可以从 ACR 中拉取图像。一种是你知道使用秘密的方式。另一种是使用服务帐号,但您还需要在每个部署或 Pod 中配置它,方法与 Secret 相同。

如果你使用 Azure Kubernetes Service,那么你只需要assign the AcrPull role to the service principal of the AKS,然后你不需要为每个图像设置任何东西。

【讨论】:

    【解决方案2】:

    您可以将 imagePullSecrets 添加到服务帐户(例如,添加到 default 服务帐户)。

    它会自动将 imagePullSecrets 添加到已分配此特定(例如默认)服务帐户的 pod 规范中,因此您不必明确地这样做。

    你可以运行它:

    kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
    

    您可以通过以下方式进行验证:

    $ kubectl run nginx --image=nginx --restart=Never
    $ kubectl get pod nginx -o=jsonpath='{.spec.imagePullSecrets[0].name}{"\n"}'
    
    myregistrykey
    

    还可以查看 k8s 文档add-image-pull-secret-to-service-account

    【讨论】:

      【解决方案3】:

      就我而言,我安装了一个本地 minikube,以便在本地测试我的图表和代码。 我尝试了此处和其他 stackoverflow 帖子中建议的大多数解决方案,以下是我发现的选项:

      1. 将映像从本地 docker 注册表移动到 minikube 的注册表,并将图表中的 pullPolicy 设置为 Never 或 IfNotPresent
          docker build . -t my-docker-image:v1
          
          minikube image load my-docker-image:v1
          
          $ minikube image list
          rscoreacr.azurecr.io/decibel:0.0.1
          k8s.gcr.io/pause:3.5
          k8s.gcr.io/kube-scheduler:v1.22.3
          k8s.gcr.io/kube-proxy:v1.22.3
          ...
      
          ##Now edit your chart and change the `pullPolicy`.
          helm install my_name chart/ ## should work.
      

      我认为此选项的主要缺点是您需要更改图表并记住将值更改为之前的值。

      1. 创建一个包含 acr 凭据的密钥。

      首先通过以下方式登录 acr:

      az acr login --name my-registry.azurecr.io --expose-token
      

      命令的输出应该显示一个用户和一个访问令牌。

      现在您应该创建一个 kubernetes 机密(确保您位于正确的 kubernetes 上下文 - minikube):

      kubectl create secret docker-registry my-azure-secret --docker-server=my-registry.azurecr.io  --docker-username=<my-user> --docker-password=<access-token>
      

      现在,如果您的图表使用默认服务帐户(当您创建 pod 时,如果您未指定服务帐户,则会自动为其分配同一命名空间中的默认服务帐户),您应该通过以下命令:

      kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-azure-secret"}]}'
      

      我不喜欢这个选项,因为如果我为每个 helm 图表都有不同的秘密提供者,我需要用 imagePullSecrets 覆盖 yaml。

      1. 另一种选择是使用 minikube 的 registry creds

      就我个人而言,我采用的解决方案是第一个经过调整的解决方案,而不是在 yaml 本身中添加 pullPolicy,而是在安装图表时覆盖它:

      $ helm install --set image.pullPolicy=IfNotPresent <name> charts/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多