Kubernetes无法从私人docker图像存储库中提取图像

时间:2018-04-03 21:19:18

标签: kubernetes minikube

我有kubernetes(minikube)的问题,并从docker上的本地图像存储库中提取图像。 Docker存储库已创建:

docker run --entrypoint htpasswd registry:2 -Bbn zordon examplePassword > /mnt/LINUX/auth/htpasswd

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/LINUX/dockerreg:/var/lib/registry \
  -v /mnt/LINUX/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

然后我想创建一个带有图像的简单pod,它已成功上传到本地存储库:

curl localhost:5000/v2/_catalog
{"repositories":["car/configuration"]}

我还在minikube集群上创建了秘密:

kubectl create secret docker-registry docregkey --docker-server=localhost:5000 --docker-username=zordon --docker-password=examplePassword --docker-email=test@dock.mail

并定义简单的Pod:

    apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: car/configuration:latest
    imagePullPolicy: Always
  restartPolicy: Always
  imagePullSecrets:
  - name: docregkey
不幸的是,我静止不动:

  

无法拉取图片“car / configuration:latest”:rpc错误:code =   未知desc =来自守护程序的错误响应:pull access denied for   汽车/配置,存储库不存在或可能需要'docker   登录

我如何解决这个问题?

8 个答案:

答案 0 :(得分:15)

要使minikube从您自己的本地Docker注册表中提取,该标记会影响提取策略。对于Images docs,默认情况下拉取策略为IfNotPresent,除了

  1. 您使用:latest作为要使用的图像的标签
  2. 或者您省略了要使用的图像标签。

在这种情况下,拉取策略将有效地默认为Always,它将尝试从docker hub进行拉取。这将导致minikube无法获取没有标签或“最新”标签的本地图像。

故事的寓意是,不要依赖默认值,因为它太混乱了:)

因此始终明确声明拉取策略:

  1. 当部署到minikube中时,拉出策略应为 IfNotPresentNever用于本地图像
  2. 当部署到云主机(如AWS)中时,提取策略应与公共映像相同(请参见下文)
  3. 对于使用诸如“最新”或“稳定”之类的标记的公共图像,拉取策略应为Always(因为该图像带有标记 点数会随着时间而变化),而IfNotPresent用于标记 始终指向同一张图片(避免获取超过 必要)

这意味着,如果您避免使用“最新”和“稳定”等标记,则只需遵循一条规则:

  1. 将您规范中的imagePullPolicy(或在运行时在命令行中)明确设置为IfNotPresent,因为它将始终首先在本地查找,如果需要,请转到公共注册表在本地找不到它,无论您是否将其部署到minikube或云中,它都将起作用。

答案 1 :(得分:8)

问题出在图像拉出策略上-您已将thist设置为Always(默认设置),这意味着docker deamon总是尝试从外部docker注册表中拉出图像-而您想使用本地的

尝试在创建部署时添加--image-pull-policy=Never

使用本地创建的图像的很好的教程在这里(对我有帮助):

  

https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-docker-container-image

答案 2 :(得分:3)

问题在于你在POD yaml文件中提到的图像名称。

image: car/configuration:latest

这将尝试从全局注册表而不是本地注册表中提取。更改图像名称以包含存储库。

image: localhost:5000/car/configuration:latest

如果您的注册表没有安全保护,请确保您在docker守护程序配置中包含了不安全的注册表。

答案 3 :(得分:3)

因为Minikube是VM而不是您的本地主机。 您尝试使用此代码eval $(minikube docker-env) https://kubernetes.io/docs/getting-started-guides/minikube/

  1. 打开终端
  2. eval $(minikube docker-env)
  3. docker build。
  4. kubectl create -f deployment.yaml
  5. 只是有效的终端。 如果关闭终端再次打开终端并写入eval $(minikube docker-env)

    eval $(minikube docker-env) 此代码在Minikube中构建图片

答案 4 :(得分:0)

Minikube中的私人注册表

kubectl create -f kube-registry.yaml

(从github上的这个要点中抓取kube-registry.yaml。)

并且您需要将port-forward minikube移植到localhost(只是图像构建时间)

kubectl port-forward --namespace kube-system \
$(kubectl get po -n kube-system | grep kube-registry-v0 | \
awk '{print $1;}') 5000:5000

在此之后,来自主机curl localhost:5000的应该返回来自在minikube上运行的docker注册表的有效响应

回购:http://localhost:5000/v2/_catalog

拉图片:localhost:5000 / image_name:image_tag

参考:https://blog.hasura.io/sharing-a-local-registry-for-minikube-37c7240d0615

答案 5 :(得分:0)

我希望在终端中执行单行解决方案。使用minikube进行身份验证时,我尝试的所有其他操作都过于复杂。

这是我每天执行的aws ecr登录命令,因为令牌已过期。以下示例适用于具有AWS ECR的Debian 9。

外壳

kubectl create secret docker-registry aws-ecr-credentials \
--docker-server=$ECR_REGISTRY \
--docker-username=AWS \
--docker-password=$(aws ecr get-login | awk '{print $6}') \
--docker-email=$IAM_EMAIL \
--namespace=$KUBE_NAMESPACE

template.yml

spec:
  imagePullSecrets:
    - name: aws-ecr-credentials

答案 6 :(得分:0)

在Docker for Desktop中运行Kubernetes时,您的应用程序将在Docker和Kubernetes之间共享相同的映像注册表。列出所有图片:

docker images --all

选择它们并以更改的属性--image-pull-policy=Never运行它。例如:

kubectl run ContainerName --image=myimage/server --port=8080 --image-pull-policy=Never 

默认情况下,kubelet将尝试从指定的注册表中提取每个图像。但是,如果容器的imagePullPolicy属性设置为IfNotPresentNever,则将使用本地图像(分别为优先或排他)。 Link

这意味着Kubernetes从本地注册表而不是远程云中获取图像。

答案 7 :(得分:0)

与我相同的问题是,当我使用本地 Docker 构建映像时,它不会添加到 minikube 映像列表中。

分辨率是手动添加图片:

minikube image load image-name:tag