我有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”
我怎么能解决这个问题?
问题在于图像拉取策略 - 您已将其设置为“始终”(默认设置)。这意味着Docker deamon总是试图从外部Docker注册表中提取图像 - 您希望使用本地注册表。
尝试在创建部署时添加--image-pull-policy=Never
。
这里有一个使用本地创建的图像的好教程(它帮助了我):
https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-docker-container-image
问题在于你在POD yaml文件中提到的图像名称。
image: car/configuration:latest
这将尝试从全局注册表而不是本地注册表中提取。更改图像名称以包括存储库。
image: localhost:5000/car/configuration:latest
如果您的注册表不安全,请确保在docker守护程序配置中包含不安全的注册表。
因为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中构建图像
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
我想在我的终端中执行一行解决方案。我试过的其他所有东西都过于复杂,以及使用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
当您在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从本地注册表而不是远程云中提取图像。