[英]Cannot get local Kubernetes (minikube) to pull from local Docker registry
[英](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/hosts
為docker.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
命令應該有效
這是一個在碼頭工人土地上的流行問題。 看這里。 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注冊表)
首先要理解的是,當您在機器中安裝docker時,它有2個部分,1)docker cli,您可以使用docker守護進程與docker守護進程進行交互2)docker守護進程。 在這種方法中,我們將本地docker cli指向minikube的docker守護進程並執行docker docker build
。
在這里引用相關部分
當使用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.