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

luk*_*isp 15 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
Run Code Online (Sandbox Code Playgroud)

然后我想用图像创建简单的pod,并成功上传到本地存储库:

curl localhost:5000/v2/_catalog
{"repositories":["car/configuration"]}
Run Code Online (Sandbox Code Playgroud)

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

kubectl create secret docker-registry docregkey --docker-server=localhost:5000 --docker-username=zordon --docker-password=examplePassword --docker-email=test@dock.mail
Run Code Online (Sandbox Code Playgroud)

并定义简单的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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我变得不动:

无法提取图像"car/configuration:latest":rpc错误:代码=未知desc =来自守护程序的错误响应:对于汽车/配置拉取访问权限,存储库不存在或者可能需要"docker login"

我怎么能解决这个问题?

Oli*_*ver 20

为了使 minikube 从您自己的本地 docker 注册表中拉取,该标签会影响拉取策略。根据图片文档IfNotPresent默认情况下拉取策略是除非

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

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

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

所以总是明确说明拉取策略:

  1. 部署到 minikube 时,pull 策略应该是 IfNotPresentNever本地镜像
  2. 部署到云主机(如 AWS)时,拉取策略应与公共图像相同(见下文)
  3. 拉取策略应该Always针对那些使用“最新”或“稳定”等标签的公共图像(因为标签点会随着时间的推移而改变),以及IfNotPresent始终指向同一图像的标签(以避免获取超过必要的)

这意味着,如果您避免使用诸如 latest 和 stable 等标签,则只需遵循一条规则:

  1. imagePullPolicy将规范中的(或在运行的情况下在命令行上)显式设置为IfNotPresent,因为这将始终首先在本地查找,如果在本地找不到,则转到公共注册表,无论是否有效,这都将起作用您正在部署到 minikube 或云中。

  • 谢谢 Oliver,这让我开始使用 minikube、docker 和本地镜像。`docker run image_name --image-pull-policy=IfNotPresent` (2认同)

Ogn*_*rov 12

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

解决方法是手动添加图像:

minikube image load image-name:tag
Run Code Online (Sandbox Code Playgroud)


Onu*_*aşı 11

因为 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 中构建图像


小智 9

问题在于图像拉取策略 - 你已经将thist设置为Always(默认设置),并且我和docker deamon总是试图从外部docker注册表中提取图像 - 而你想要使用本地的

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

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

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


Lig*_*mer 6

我想要一个单行解决方案在我的终端中执行。我尝试的所有其他方法都过于复杂,无法使用 minikube 验证 ecr。

这是我每天运行的 aws ecr login 命令,因为令牌过期。以下示例适用于具有 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
Run Code Online (Sandbox Code Playgroud)

模板.yml

spec:
  imagePullSecrets:
    - name: aws-ecr-credentials
Run Code Online (Sandbox Code Playgroud)


小智 5

问题与您在POD yaml文件中提到的图像名称有关。

image: car/configuration:latest
Run Code Online (Sandbox Code Playgroud)

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

image: localhost:5000/car/configuration:latest
Run Code Online (Sandbox Code Playgroud)

如果您的注册表不安全,请确保在docker daemon配置中包括了不安全的注册表。

  • 此外,在 pod 的描述中,我得到了:`无法拉取映像“localhost:5000/car/configuration:latest”:rpc 错误:代码 = 未知 desc = 来自守护进程的错误响应:获取 http://localhost:5000/v2 /:拨号 tcp 127.0.0.1:5000:getsockopt:连接被拒绝`但是当尝试 curl (`curl --user zordon:4a5b-9cd7 http://localhost:5000/v2/`) 获得 {} 有效响应 (2认同)

epp*_*ppe 5

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

docker images --all
Run Code Online (Sandbox Code Playgroud)

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

kubectl run ContainerName --image=myimage/server --port=8080 --image-pull-policy=Never 
Run Code Online (Sandbox Code Playgroud)

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

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