簡體   English   中英

(Kube.netes + Minikube) 無法從本地注冊表獲取 docker 圖像

[英](Kubernetes + Minikube) can't get docker image from local registry

我在我的機器上設置了 docker,還有 minikube,里面有 docker,所以我可能有兩個 docker 實例在不同的 VM 上運行

我構建一個圖像並標記它,然后將它推送到本地注冊表,它成功推送,我也可以從注冊表中提取它,當我運行 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

以上所有步驟都可以正常工作,沒有任何問題。

我的問題是當我運行 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

在最后一步(第 4 點)它給了我下一條消息

curl: (7) 無法連接到 127.0.0.1 端口 5000:連接被拒絕

所以我可以從我的機器訪問圖像注冊表,但不能從 minikube 訪問圖像注冊表,當我在 minikube 上使用 Kube.netes 部署此圖像並由於無法連接到http://127.0.0.1而使部署失敗時,這當然會給我帶來問題:5000

你能幫我配置 minikube 以查看我的本地注冊表,這樣我的問題就會得到解決,然后我就可以使用 kube.netes 成功地將圖像部署到 minikube 了嗎?

更新

我正在使用這個 yaml 文件(我將其命名為ConsolePre.yaml )來使用 kube.netes 部署我的圖像

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

當我運行下一個命令來應用更改時

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

當我運行描述命令時

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

我在描述結果中找到了下一條消息

來自守護程序的錯誤響應:{“消息”:“獲取https://docker.local:5000/v1/_ping :撥打 tcp:在 10.0.2.3:53 上查找 docker.local:讀取 udp 10.0.2.3:53:讀取 udp 10.0.2.90->5177.90->5177.925-> .2.3:53: i/o 超時"}

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

那么我該如何解決這個問題呢。

謝謝:)

問題是您在任何地方使用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

因為docker run將注冊表映射到127.0.0.1:5000和192.168.0.101:5000。 現在在你的機器上只有這個127.0.0.1可以工作。 現在你用的時候

3- minikube ssh

你進入minikube機器並且沒有在127.0.0.1:5000上運行的注冊表。 所以錯誤。 使用機器機器IP在本機內無法訪問注冊表。

我通常解決這個問題的方法是在本地和其他VM中使用主機名。

所以在你的機器上在/etc/hosts創建一個條目

docker.local 127.0.0.1

並將命令更改為

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

然后當你使用minikube ssh ,在/etc/hostsdocker.local創建一個條目

docker.local 192.168.0.101

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

編輯-1

對於TLS問題,您需要在minikube中停止docker服務

systemctl stop docker

然后編輯/etc/systemd/system/docker.service.d/10-machine.conf並進行更改

ExecStart = / usr / bin / docker daemon -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 / docker daemon -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 --insecure-registry docker.local:5000 - insecure-registry 192.168.1.4:5000

然后重新加載守護進程並啟動docker服務

systemctl daemon-reload
systemctl start docker

之后試着拉

docker pull docker.local:5000/eliza/console:0.0.1

命令應該有效

如何在Docker容器中訪問在hostmachine上運行的進程?

這是一個在碼頭工人土地上的流行問題。 看這里。 https://stackoverflow.com/a/24326540/6785908還有其他方法,例如,對於Mac上的Docker, docker.for.mac.localhost DNS名稱將解析為hostmachine

來自https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers

Mac具有更改的IP地址(如果您沒有網絡訪問權限,則為無)。 從17.06開始,我們建議連接到特殊的Mac-DNS DNS名稱docker.for.mac.localhost,它將解析為主機使用的內部IP地址。

假設這個minikube的主要目的是用於本地測試,那么部署docker容器有一種更簡單的方法(這甚至不需要本地docker注冊表)

方法2:將docker CLI指向在minikube中運行的Docker守護程序,然后在那里執行docker build命令。

首先要理解的是,當您在機器中安裝docker時,它有2個部分,1)docker cli,您可以使用docker守護進程與docker守護進程進行交互2)docker守護進程。 在這種方法中,我們將本地docker cli指向minikube的docker守護進程並執行docker docker build

https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/getting-started-guides/minikube.md#reusing-the-docker-daemon

在這里引用相關部分

當使用Kubernetes的單個VM時,重用minikube的內置Docker守護進程非常方便; 因為這意味着您不必在主機上構建docker注冊表並將圖像推入其中 - 您可以在與minikube相同的docker守護程序內部構建,從而加速本地實驗。 只需確保使用“最新”之外的其他內容標記Docker鏡像,並在拉動圖像時使用該標記。 否則,如果您沒有指定圖像的版本,它將被假定為:latest,使用始終相應的拉圖像策略,這可能最終導致ErrImagePull,因為您可能沒有任何版本的Docker鏡像在默認情況下docker注冊表(通常是DockerHub)。

為了能夠在mac / linux主機上使用docker守護進程,請在shell中使用docker-env命令:

eval $(minikube docker-env)

您現在應該可以在主機mac / linux機器上的命令行上使用docker與minikube VM內的docker守護程序通信:

做一個docker container list命令: docker ps 它甚至應該顯示與kubernetes系統相關的容器(因為現在你的cli指向你的minikube正在運行的docker守護進程)。

現在構建您的docker鏡像。 然后它將在minikube中為您提供。

Minikube 在 docker 容器中運行,因此您應該將其視為一台單獨的機器。 現在,在這台機器內運行 Kube.netes,請注意,了解我們擁有 Minikube 環境和 Kube.netes 環境很重要。 理解這一點很重要,因為從 Minikube 連接到本地注冊表與從 Kube.netes(駐留在 Minikube 上)不同。 這里的區別:在這里輸入圖像描述

當你創建 Job / Deployment / Statefulset 時,創建是由 minikube 完成的,因此它不知道是否有任何服務連接到我們在 docker 中的本地注冊中心。奇怪的是,我們的“注冊中心”服務確實在 pod 內工作,即,一旦創建了我們的作業/部署/Statefulset,您就可以毫無問題地訪問我們的“注冊表”服務。 那么這一切的解決方案是什么? Minikube 可以通過 192.168.49.1:5000 輕松連接到我們的本地注冊表。 如果您希望使用本地注冊表中的圖像創建作業/部署/狀態集,則只需將 192.168.49.1:5000 添加到您的圖像中即可。 enter image description here另一方面,如果您希望能夠從 pod 中訪問您的本地注冊表,您將需要一個服務和一個端點。

注意事項:請記住,允許 minikube 通過以下方式訪問本地注冊表非常重要:

minikube start --insecure-registries 192.168.49.1:5000

minikube 很少使用除 192.168.49.1 之外的另一個 ip,以防萬一最好檢查一下:

minikube ssh 'grep host.minikube.internal / etc / hosts | cut -f1 '

這一切都假設您在 docker 中創建了一個注冊表,並暴露了端口 5000。

您可以發出此命令將docker CLI指向minikube:eval $(minikube docker-env)然后您可以在那里構建圖像或從任何位置導出它們並導入它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM