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

问题描述 投票:9回答:6

我有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 [email protected]

并定义简单的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错误:代码=未知desc =来自守护程序的错误响应:对于汽车/配置拉取访问权限,存储库不存在或者可能需要“docker login”

我怎么能解决这个问题?

kubernetes minikube
6个回答
8
投票

问题在于图像拉取策略 - 您已将其设置为“始终”(默认设置)。这意味着Docker deamon总是试图从外部Docker注册表中提取图像 - 您希望使用本地注册表。

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

这里有一个使用本地创建的图像的好教程(它帮助了我):

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


4
投票

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

image: car/configuration:latest

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

image: localhost:5000/car/configuration:latest

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


3
投票

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

  1. 开放式终端
  2. eval $(minikube docker-env)
  3. 码头工人建造。
  4. kubectl create -f deployment.yaml

只是有效的终端。如果关闭终端再次打开终端并写eval $(minikube docker-env)

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


0
投票

Minikube中的私人注册表

kubectl create -f to 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注册表的有效响应

回购:赌场

拉图像:localhost:5000 / image_name:image_tag

参考:http://localhost:5000/v2/_catalog


0
投票

我想在我的终端中执行一行解决方案。我试过的其他所有东西都过于复杂,以及使用minikube进行验证。

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

贝壳

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

template.yml

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

0
投票

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

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

选择它们并使用更改的属性qazxsw poi运行它。例如:

docker images --all

默认情况下,kubelet将尝试从指定的注册表中提取每个图像。但是,如果容器的--image-pull-policy=Never属性设置为kubectl run ContainerName --image=myimage/server --port=8080 --image-pull-policy=Never imagePullPolicy,则使用局部图像(分别优先或排他)。 IfNotPresent

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

© www.soinside.com 2019 - 2024. All rights reserved.