我正在尝试在本地运行我的第一个 kubernetes pod。我已经运行了以下命令(从这里(:
export ARCH=amd64
docker run -d
--volume=/:/rootfs:ro
--volume=/sys:/sys:ro
--volume=/var/lib/docker/:/var/lib/docker:rw
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw
--volume=/var/run:/var/run:rw
--net=host
--pid=host
--privileged
gcr.io/google_containers/hyperkube-${ARCH}:${K8S_VERSION}
/hyperkube kubelet
--containerized
--hostname-override=127.0.0.1
--api-servers=http://localhost:8080
--config=/etc/kubernetes/manifests
--cluster-dns=10.0.0.10
--cluster-domain=cluster.local
--allow-privileged --v=2
然后,我尝试运行以下内容:
kubectl create -f ./run-aii.yaml
run-aii.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: aii
spec:
replicas: 2
template:
metadata:
labels:
run: aii
spec:
containers:
- name: aii
image: aii
ports:
- containerPort: 5144
env:
- name: KAFKA_IP
value: kafka
volumeMounts:
- mountPath: /root/script
name: scripts-data
readOnly: true
- mountPath: /home/aii/core
name: core-aii
readOnly: true
- mountPath: /home/aii/genome
name: genome-aii
readOnly: true
- mountPath: /home/aii/main
name: main-aii
readOnly: true
- name: kafka
image: kafkazoo
volumeMounts:
- mountPath: /root/script
name: scripts-data
readOnly: true
- mountPath: /root/config
name: config-data
readOnly: true
- name: ws
image: ws
ports:
- containerPort: 3000
volumes:
- name: scripts-data
hostPath:
path: /home/aii/general/infra/script
- name: config-data
hostPath:
path: /home/aii/general/infra/config
- name: core-aii
hostPath:
path: /home/aii/general/core
- name: genome-aii
hostPath:
path: /home/aii/general/genome
- name: main-aii
hostPath:
path: /home/aii/general/main
现在,当我跑步时:kubectl get pods
我得到:
NAME READY STATUS RESTARTS AGE
aii-806125049-18ocr 0/3 ImagePullBackOff 0 52m
aii-806125049-6oi8o 0/3 ImagePullBackOff 0 52m
aii-pod 0/3 ImagePullBackOff 0 23h
k8s-etcd-127.0.0.1 1/1 Running 0 2d
k8s-master-127.0.0.1 4/4 Running 0 2d
k8s-proxy-127.0.0.1 1/1 Running 0 2d
nginx-198147104-9kajo 1/1 Running 0 2d
顺便说一句:docker images
返回:
REPOSITORY TAG IMAGE ID CREATED SIZE
ws latest fa7c5f6ef83a 7 days ago 706.8 MB
kafkazoo latest 84c687b0bd74 9 days ago 697.7 MB
aii latest bd12c4acbbaf 9 days ago 1.421 GB
node 4.4 1a93433cee73 11 days ago 647 MB
gcr.io/google_containers/hyperkube-amd64 v1.2.4 3c4f38def75b 11 days ago 316.7 MB
nginx latest 3edcc5de5a79 2 weeks ago 182.7 MB
docker_kafka latest e1d954a6a827 5 weeks ago 697.7 MB
spotify/kafka latest 30d3cef1fe8e 12 weeks ago 421.6 MB
wurstmeister/zookeeper latest dc00f1198a44 3 months ago 468.7 MB
centos latest 61b442687d68 4 months ago 196.6 MB
centos centos7.2.1511 38ea04e19303 5 months ago 194.6 MB
gcr.io/google_containers/etcd 2.2.1 a6cd91debed1 6 months ago 28.19 MB
gcr.io/google_containers/pause 2.0 2b58359142b0 7 months ago 350.2 kB
sequenceiq/hadoop-docker latest 5c3cc170c6bc 10 months ago 1.766 GB
为什么我得到图像拉回 ??
默认情况下,Kubernetes 在公共 Docker 注册表中查找图像。如果你的图像不存在,它将无法拉取它。
您可以使用注册表集群插件运行本地 Kubernetes 注册表。
然后用localhost:5000
标记您的图像:
docker tag aii localhost:5000/dev/aii
将镜像推送到 Kubernetes 注册表:
docker push localhost:5000/dev/aii
并将 run-aii.yaml 更改为使用 localhost:5000/dev/aii
图像而不是 aii
。现在 Kubernetes 应该能够拉取镜像了。
或者,您可以通过提供此功能的提供商之一(AWS ECR、GCR 等(运行私有 Docker 注册表,但如果这是用于本地开发,那么使用本地 Kubernetes Docker 注册表进行设置会更快、更容易。
一个可能导致ImagePullBackOff
的问题,尤其是在从私有注册表中提取时,如果 Pod 未配置私有注册表的imagePullSecret
。
身份验证错误可能会导致imagePullBackOff
。
我遇到了同样的问题,导致它的原因是我已经通过 .yml 文件从 docker 映像创建了一个 pod,但是我输入了错误的名称,即 test-app:1.0.1 当我需要 test-app:1.0.2 时在我的 .yml 文件中。所以我kubectl delete pods --all
移除有故障的 pod,然后重做kubectl create -f name_of_file.yml
解决了我的问题。
在容器的规范中指定imagePullPolicy: Never
:
containers:
- name: nginx
imagePullPolicy: Never
image: custom-nginx
ports:
- containerPort: 80
当映像不存在集群并且 k8s 引擎将拉取相应的注册表时,会出现此问题。k8s 引擎支持上述 3 种类型的 ImagePullPolicy:
- 始终
- :无论图像如何更改,它始终将图像拉取到容器中
- 从不:它永远不会在容器上拉取新映像 如果
- 不存在 :如果图像不存在,它将在集群中拉取新图像。
最佳实践:始终建议在 docker 文件和 k8s 部署文件中标记新映像。以便它可以在容器中拉取新映像。
我也遇到了这个问题,当我检查我从私有注册表中提取的图像被删除时如果我们描述 pod,它将显示拉取事件和它试图拉取的图像
kubectl describe pod <POD_NAME>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 18h (x35 over 20h) kubelet, gsk-kub Pulling image "registeryName:tag"
Normal BackOff 11m (x822 over 20h) kubelet, gsk-kub Back-off pulling image "registeryName:tag"
Warning Failed 91s (x858 over 20h) kubelet, gsk-kub Error: ImagePullBackOff
调试步骤:
kubectl get pod [name] -o yaml
运行此命令以获取 pod 的 YAML 配置(获取已部署的 Kubernetes 服务的 YAML?就我而言,它位于本节下:
状态:
等待:消息:"rpc 错误:代码 = 未知 desc = 来自守护程序的错误响应:获取https://repository:9999/v2/abc/location/image/manifests/tag:未经授权:BAD_CREDENTIAL'
原因:ErrImagePull
尽管有所有其他很棒的答案,但没有一个帮助我,直到我找到一条评论指出这个 更新图像:
默认拉取策略是
IfNotPresent
,这会导致 kubelet 跳过拉取映像(如果它已经存在(。
这正是我想要的,但似乎不起作用。
雷丁进一步说:
如果要始终强制拉取,可以执行以下操作之一:
- 省略
imagePullPolicy
并使用:latest
作为要使用的图像的标记。
当我用一个版本(我推送到 minikube 的 Docker 守护进程(替换latest
时,它工作正常。
$ kubectl create deployment presto-coordinator
--image=warsaw-data-meetup/presto-coordinator:beta0
deployment.apps/presto-coordinator created
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
presto-coordinator 1/1 1 1 3s
找到部署的容器(使用 kubectl get pods
(,然后使用 kubectl describe pod
了解有关容器的更多信息。
在将适当的标签添加到我想从 DockerHub 中提取的图像时,我的问题得到了解决。
以前:
containers:
- name: nginx
image: alex/my-app-image
更正版本:
containers:
- name: nginx
image: alex/my-app-image:1.1
该映像只有一个版本,即 1.1。由于我最初跳过了它,它引发了一个错误。
正确提及版本后,它工作正常!!
我登录到 docker 私有注册表并尝试拉取公共映像,因此尝试docker logout
为我解决了这个问题。
因此,您还可以验证正在使用的映像(无论是公共映像还是私有映像(,然后尝试docker login
或docker logout
。
2048GB 内存的 hyperv 上使用 minikube 时,我遇到了类似的问题。我发现在HyperV管理器中,内存需求高于分配的内存需求。
所以我停止了minikube,并分配了4096-6144GB之间的某个地方。之后工作正常,所有豆荚都在运行!
我不知道这是否可以在每种情况下确定问题。但是只要看看分配给minikube的内存和磁盘。
我遇到了同样的问题。
imagePullBackOff 意味着它无法从注册表中提取 docker 映像或注册表冒烟问题。
解决方案如下。
1. Check you image registry name.
2. check image pull secrets.
3. check image is present with same tag or name.
4. check you registry is working.
ImagepullBackoff mesns 你没有在你的 yaml 中传递 secret 或 secret 是错误的,可能是你的图像名称是错误的。
如果您从私有注册表中提取映像,则必须提供映像拉取机密,然后它将能够拉取映像。
在部署 Pod 之前,您还需要创建 Secrete。 您可以使用以下命令创建 secrete。
kubectl create secret docker-registry regcred --docker-server=artifacts.exmple.int --docker-username=<username> --docker-password=<password> -n <namespace>
您可以在 YAML 中传递机密,如下所示。
imagePullSecrets:
- name: regcred
尝试创建replicationcontroller
时遇到了此错误。问题是,我在模板定义中错误地拼写了nginx图像名称。
注意:当 kubernetes 无法从存储库中提取指定的映像时,会发生此错误。
我遇到了同样的问题。
[mayur@mayur_cloudtest ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-598b589c46-zcr5d 0/1 ImagePullBackOff 0 6m21s
后来我发现创建 pod 的 docker 正在使用一个私有的镜像注册表,而 Nginx 并不在其中。
我已将 docker 注册表更改为默认值并重新加载了守护程序。发布该问题已解决。
[mayur@mayur_cloudtest ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-598b589c46-7cbjf 1/1 Running 0 33s
[mayur@mayur_cloudtest ~]$
[mayur@mayur_cloudtest ~]$
[mayur@mayur_cloudtest ~]$ kubectl exec -it nginx-598b589c46-7cbjf -- /bin/bash
root@nginx-598b589c46-7cbjf:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@nginx-598b589c46-7cbjf:/#
就我而言,在更新到 MacOS Monterey 后,Kubernetes 无法与我在 localhost:5000 上运行的私人注册表进行通信。它以前运行良好。原因是Apple Airplay现在侦听端口5000。为了解决这个问题,我禁用了苹果Airplay接收器。
转到系统偏好设置>共享>禁用Airplay接收器的复选框。
来源链接: https://developer.apple.com/forums/thread/682332
要处理此错误,只需创建 Kubernetes 机密并在 manifest.yaml 文件中使用它
如果是私有存储库,则必须使用用户机密
要生成密钥 -
kubectl create secret docker-registry docker-secrets --docker-server=https://index.docker.io/v1/ --docker-username=ExamplaName --docker-password=ExamplePassword --docker-email=example@gmail.com
对于 --docker-server,请使用 https://index.docker.io/v1/
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test
image: ExampleUsername/test:tagname
ports:
- containerPort: 3015
imagePullSecrets:
- name: docker-secrets