(Kubernetes + Minikube)无法从本地注册表获取docker镜像

mib*_*iti 10 docker kubernetes docker-registry minikube

我在我的机器上设置了docker,还有minikube,里面有docker,所以我可能在不同的VM上运行了两个docker实例

我构建一个图像并标记它,然后将其推送到本地注册表,它成功推送,我也可以从注册表中拉出它也是当我运行curl得到标签列表我得到结果,这是我做的

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list
Run Code Online (Sandbox Code Playgroud)

以上所有步骤都运行正常,没有任何问题.

我的问题是当我运行minikube并尝试在其中的本地注册表中访问此图像

所以,当我运行下一个命令

1- sudo minikube start --insecure-registry 127.0.0.1:5000
2- eval $(minikube docker-env)
3- minikube ssh
4- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list
Run Code Online (Sandbox Code Playgroud)

在最后一步(第4点),它给了我下一条消息

curl:(7)无法连接到127.0.0.1端口5000:连接被拒绝

因此,我可以从我的机器访问图像注册表,但不能从minikube访问,当我在minikube上使用Kubernetes部署此图像时,我当然会遇到问题,并且由于无法连接到http://127.0.0.1:5000而导致部署失败

你能帮我配置minikube来查看我的本地注册表,这样我的问题就能解决,然后我可以成功地使用kubernetes将图像部署到minikube吗?

UPDATE

我正在使用这个yaml文件(我命名为ConsolePre.yaml)来使用kubernetes部署我的图像

apiVersion: v1
  kind: Service
  metadata:
    name: tripbru-console
    labels:
      app: tripbru-console
  spec:
    ports:
      - port: 9080
        targetPort: 9080
        nodePort: 30181
    selector:
      app: tripbru-console
      tier: frontend
    type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tripbru-console
  labels:
    app: tripbru-console
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: tripbru-console
        tier: frontend
    spec:
      containers:
      - image: docker.local:5000/eliza/console:0.0.1
        name: tripbru-console
        ports:
        - containerPort: 9080
          name: tripbru-console
Run Code Online (Sandbox Code Playgroud)

当我运行下一个命令来应用更改

sudo kubectl apply -f /PATH_TO_YAML_FILE/ConsolePre.yaml

结果是

NAME                                      READY     STATUS         RESTARTS   AGE
po/tripbru-console-1655054400-x3g87       0/1       ErrImagePull   0          1m
Run Code Online (Sandbox Code Playgroud)

当我运行describe命令时

sudo kubectl描述pod tripbru-console-1655054400-x3g87

我在描述结果中找到了下一条消息

来自守护程序的错误响应:{"message":"获取 https://docker.local:5000/v1/_ping:在10.0.2.3:53上拨打tcp:lookup docker.local:read udp 10.0.2.15:57792-\u003e10 .0.2.3:53:i/o超时"}

我在minikube/etc/hosts中配置了docker.local xxx.xxx.xx.4,所以我不知道10.0.2.3:53和10.0.2.15:57792来自哪里.

那我怎么能解决这个问题呢.

谢谢 :)

Tar*_*ani 15

问题是您可以127.0.0.1随心所欲地使用任何想法.这是错的.

因此,如果您的机器IP是192.168.0.101.然后下面的工作

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list
Run Code Online (Sandbox Code Playgroud)

因为docker run将注册表映射到127.0.0.1:5000和192.168.0.101:5000.现在在你的机器上只有这个127.0.0.1工作.现在你用的时候

3- minikube ssh
Run Code Online (Sandbox Code Playgroud)

你进入minikube机器并且没有在127.0.0.1:5000上运行的注册表.所以错误.使用机器机器IP在本机内无法访问注册表.

我通常解决这个问题的方法是在本地和其他VM中使用主机名.

所以在你的机器上创建一个条目 /etc/hosts

docker.local 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

并将命令更改为

1- docker build -t docker.local:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 docker.local:5000/eliza/console:0.0.1
4- docker push docker.local:5000/eliza/console:0.0.1
5- curl -X GET http://docker.local:5000/v2/eliza/console/tags/list
Run Code Online (Sandbox Code Playgroud)

然后当你使用minikube ssh,使一个条目docker.local/etc/hosts

docker.local 192.168.0.101
Run Code Online (Sandbox Code Playgroud)

然后 curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

编辑-1

对于TLS问题,您需要在minikube中停止docker服务

systemctl stop docker
Run Code Online (Sandbox Code Playgroud)

然后编辑/etc/systemd/system/docker.service.d/10-machine.conf和更改

ExecStart =的/ usr/bin中/泊坞窗守护-H TCP://0.0.0.0:2376 -H UNIX:///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider = virtualbox --insecure-registry 10.0.0.0/24

ExecStart =的/ usr/bin中/泊坞窗守护-H TCP://0.0.0.0:2376 -H UNIX:///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label提供商= VirtualBox的--insecure的注册表10.0.0.0/24 --insecure的注册表docker.local:5000 - insecure-registry 192.168.1.4:5000

然后重新加载守护进程并启动docker服务

systemctl daemon-reload
systemctl start docker
Run Code Online (Sandbox Code Playgroud)

之后试着拉

docker pull docker.local:5000/eliza/console:0.0.1
Run Code Online (Sandbox Code Playgroud)

命令应该有效