我正在尝试从 Azure 容器注册表获取 minikube 中的图像。这一直失败,因为它没有说未经授权。 未经授权:需要身份验证
我使用 kubectl create Secret 添加注册表的凭据,但它一直失败。
到目前为止我尝试过的:
有点绝望我接下来可以尝试什么?我怎样才能更好地解决这个问题?
kubectl create secret
命令应该生成一个~/.dockercfg文件,该文件用于针对后续的docker push
和docker pull
请求向注册表进行身份验证。
鉴于您的
docker login
和 docker pull
命令有效,我怀疑您可能在错误的命名空间中创建了您的秘密。
Pod 只能在自己的命名空间中引用镜像拉取机密,因此每个命名空间需要执行一次此过程。
https://kubernetes.io/docs/concepts/containers/images/#using-azure-container-registry-acr
您可以创建一个秘密并将其保存在您的 kubernetes 上下文中(在您的情况下为 minikube 上下文)。
kubectl config get-contexts
和 kubectl config use-context minikube
更改为 minikube 上下文,确保您指向正确的上下文。kubectl create secret docker-registry acr-secret --docker-server=<your acr server>.azurecr.io --docker-username=<your acr username> --docker-password=<your acr password>
在 minikube 上下文中创建秘密。此命令生成 acr-secret。acr-secret
导入到部署 yml 文件中: imagePullSecrets:
- name: acr-secret
我认为有一个更简单的答案。首先您需要安装 Azure CLI 并登录
az login
之后,您可以获得 Azure 容器注册表的凭据
az acr login -n yoursupercoolregistry.azurecr.io --expose-token
这会给你类似的东西:
{
"accessToken": "averylongtoken",
"loginServer": "yoursupercoolregistry.azurecr.io"
}
使用此信息,您可以启用注册表信用并配置 Docker 注册表(而不是 Azure 容器注册表)
minikube addons enable registry-creds
minikube addons configure registry-creds
您必须输入您的服务器 URL 和
00000000-0000-0000-0000-000000000000
作为客户端 ID。
Do you want to enable Docker Registry? [y/n]: y
-- Enter docker registry server url: yoursupercoolregistry.azurecr.io
-- Enter docker registry username: 00000000-0000-0000-0000-000000000000
最后将令牌粘贴到命令行中,按 Enter 键,您应该会得到这个
✅ registry-creds was successfully configured
然后将
imagePullSecrets
添加到您的文件中
spec:
containers:
- name: supercoolcontainer
image: yoursupercoolregistry.azurecr.io/supercoolimage:1.0.2
imagePullSecrets:
- name: dpr-secret
在使用 Airflow 的 kubernetespod 操作符启动任务并从 azure 容器注册表中提取映像时,我遇到了类似的问题。对我有用的是在 azure 门户上的存储库权限下设置一个令牌,并使用该令牌在正确的命名空间中设置机密。有关创建令牌以访问 azure 存储库图像的微软文档
docker 用户名应设置为令牌的名称 并且 docker 密码应设置为门户上生成的密码。
kubectl create secret docker-registry acr-secret -n namespace --docker-server=myregistry.azurecr.io --docker-username=<token-name> --docker-password=<my-password-generated-online>
我之前设置用于访问 azure 门户的用户名和密码的方法是因为 kubernetes docker 密钥不正确。
完成后,我还必须更新我的代码以包含 image_pull_secrets 参数。
from kubernetes.client import models as k8s
run_task = KubernetesPodOperator(
namespace=namespace,
image=f"myregistry.azurecr.io/image-name:{image_version}",
image_pull_policy="Always",
image_pull_secrets=[k8s.V1LocalObjectReference("acr-secret")],
name=f"run_my_task",
task_id=f"run_my_task",
get_logs=True,
)