我有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 登录
我如何解决这个问题?
答案 0 :(得分:15)
要使minikube从您自己的本地Docker注册表中提取,该标记会影响提取策略。对于Images docs,默认情况下拉取策略为IfNotPresent
,除了
:latest
作为要使用的图像的标签在这种情况下,拉取策略将有效地默认为Always
,它将尝试从docker hub进行拉取。这将导致minikube无法获取没有标签或“最新”标签的本地图像。
故事的寓意是,不要依赖默认值,因为它太混乱了:)
因此始终明确声明拉取策略:
IfNotPresent
或Never
用于本地图像Always
(因为该图像带有标记
点数会随着时间而变化),而IfNotPresent
用于标记
始终指向同一张图片(避免获取超过
必要)这意味着,如果您避免使用“最新”和“稳定”等标记,则只需遵循一条规则:
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/
eval $(minikube docker-env)
只是有效的终端。
如果关闭终端再次打开终端并写入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
属性设置为IfNotPresent
或Never
,则将使用本地图像(分别为优先或排他)。 Link
这意味着Kubernetes从本地注册表而不是远程云中获取图像。
答案 7 :(得分:0)
与我相同的问题是,当我使用本地 Docker 构建映像时,它不会添加到 minikube 映像列表中。
分辨率是手动添加图片:
minikube image load image-name:tag