我尝试使用我的本地Docker镜像创建一个pod,如下所示。
1.首先我在终端运行这个命令
eval $(minikube docker-env)
字符串
2.我创建了一个docker镜像,如下所示
sudo docker image build -t my-first-image:3.0.0 .
型
3.我创建了如下所示的pod.yml,并运行以下命令
kubectl -f create pod.yml.
型
4.然后我试着运行这个命令
kubectl get pods
型
但它显示以下错误
NAME READY STATUS RESTARTS AGE
multiplication-b47499db9-phpb7 0/1 ImagePullBackOff 0 23h
my-first-pod 0/1 ErrImagePull 0 7s
型
5.我得到了豆荚日志
kubectl describe pod my-first-pod
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 99s default-scheduler Successfully assigned default/my-first-pod to minikube
Warning Failed 41s (x3 over 94s) kubelet, minikube Failed to pull image "my-first-image:3.0.0": rpc error: code = Unknown desc = Error response from daemon: pull access denied for my-first-image, repository does not exist or may require 'docker login'
Warning Failed 41s (x3 over 94s) kubelet, minikube Error: ErrImagePull
Normal BackOff 12s (x4 over 93s) kubelet, minikube Back-off pulling image "my-first-image:3.0.0"
Warning Failed 12s (x4 over 93s) kubelet, minikube Error: ImagePullBackOff
Normal Pulling 0s (x4 over 98s) kubelet, minikube pulling image "my-first-image:3.0.0"
Dockerfile
FROM node:carbon
WORKDIR /app
COPY . .
CMD [ "node", "index.js" ]
pods.yml
kind: Pod
apiVersion: v1
metadata:
name: my-first-pod
spec:
containers:
- name: my-first-container
image: my-first-image:3.0.0
index.js
var http = require('http');
var server = http.createServer(function(request, response) {
response.statusCode = 200;
response.setHeader('Content-Type', 'text/plain');
response.end('Welcome to the Golden Guide to Kubernetes
Application Development!');
});
server.listen(3000, function() {
console.log('Server running on port 3000');
});
6条答案
按热度按时间crcmnpdw1#
原因
这是因为它无法下载你的pod定义文件中定义的docker镜像。默认情况下,它会从DockerHub下载所需的镜像。
方式一
因此,在创建
my-first-image:3.0.0
镜像后,您必须在DockerHub上发布它。为此,在DockerHub上创建帐户并使用login命令从终端登录字符串
登录成功后,使用标签中的DockerHub用户名重建Docker镜像,并推送到DockerHub(more details)
型
将
pod.yml
中的映像更新为YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0
,并像以前一样创建pod。方式二
您可以指示从本地机器中找到所需的Docker镜像,而不是从DockerHub下载。为此,您必须在特定容器描述下的
pod.yml
文件中添加imagePullPolicy: Never
。下面是pod.yml
文件的示例,以显示在何处定义镜像拉取策略型
4urapxun2#
由于您正在使用一个图像而没有上传它。您必须将imagePullPolicy设置为Never,否则Kubernetes将尝试下载图像。
启动minikube
minikube start
设置docker env
eval $(minikube docker-env)
构建镜像
docker build -t my-first-image:3.0.0 .
在minikube中运行
kubectl run my-first-container --image=my-first-image:3.0.0 --image-pull-policy=Never
检查它是否正在运行
kubectl get pods
您的pod规格应该如下所示
pods.yml
字符串
nafvub8i3#
你已经构建了镜像,但你需要推送到docker仓库。
如果你在kubernetes节点上构建docker镜像,它可以工作,但更好的是推送到仓库,这样docker将从中央仓库拉取,随着节点数量的增加,你无法控制pod将在哪里调用,镜像将不可用。
字符串
如果你有私有的Docker仓库,请推送到私有仓库并使用完整的镜像名称。
rsl1atfo4#
缺少存储库名称。
在dockerHub中创建一个帐户。然后在dockerhub中构建并推送镜像到您的repo中
字符串
更新pod.yaml文件中的镜像名为niranga/my-first-image:3.0.0
它应该工作
to94eoyn5#
当你构建镜像到本地Minikube注册表时,你可能想设置
imagePullPolicy: Never
,这样它就不会尝试从远程注册表中拉取镜像。pod规范看起来像这样:字符串
anauzrmj6#
如果你使用KiND,还有一个额外的步骤。我已经从这里得到了答案:https://iximiuz.com/en/posts/kubernetes-kind-load-docker-image/
基本上,你必须使用:
kind load docker-image image_name:latest
添加它,然后确保你将imagePullPolicy: Never
添加到yaml中,就像前面的答案提到的那样。另外,确保在yaml中标记你的图像的特定版本,例如image: image_name:latest
。