我正在尝试在本地主机上使用我自己的 docker 映像创建一个 pod。
这是用于创建映像的 dockerfile :
FROM centos:8
RUN yum install -y gdb
RUN yum group install -y "Development Tools"
CMD ["/usr/bin/bash"]
用于创建 pod 的 yaml 文件是这样的:
---
apiVersion: v1
kind: Pod
metadata:
name: server
labels:
app: server
spec:
containers:
- name: server
imagePullPolicy: Never
image: localhost:5000/server
ports:
- containerPort: 80
root@node1:~/test/server# docker images | grep server
server latest 82c5228a553d 3 hours ago 948MB
localhost.localdomain:5000/server latest 82c5228a553d 3 hours ago 948MB
localhost:5000/server latest 82c5228a553d 3 hours ago 948MB
图像已被推送到本地主机注册表。
以下是我收到的错误。
root@node1:~/test/server# kubectl get pods
NAME READY STATUS RESTARTS AGE
server 0/1 CrashLoopBackOff 5 5m18s
describe pod 的输出:
root@node1:~/test/server# kubectl describe pod server
Name: server
Namespace: default
Priority: 0
Node: node1/10.0.2.15
Start Time: Mon, 07 Dec 2020 15:35:49 +0530
Labels: app=server
Annotations: cni.projectcalico.org/podIP: 10.233.90.192/32
cni.projectcalico.org/podIPs: 10.233.90.192/32
Status: Running
IP: 10.233.90.192
IPs:
IP: 10.233.90.192
Containers:
server:
Container ID: docker://c2982e677bf37ff11272f9ea3f68565e0120fb8ccfb1595393794746ee29b821
Image: localhost:5000/server
Image ID: docker-pullable://localhost.localdomain:5000/server@sha256:6bc8193296d46e1e6fa4cb849fa83cb49e5accc8b0c89a14d95928982ec9d8e9
Port: 80/TCP
Host Port: 0/TCP
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Mon, 07 Dec 2020 15:41:33 +0530
Finished: Mon, 07 Dec 2020 15:41:33 +0530
Ready: False
Restart Count: 6
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-tb7wb (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-tb7wb:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-tb7wb
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 6m default-scheduler Successfully assigned default/server to node1
Normal Pulled 4m34s (x5 over 5m59s) kubelet Container image "localhost:5000/server" already present on machine
Normal Created 4m34s (x5 over 5m59s) kubelet Created container server
Normal Started 4m34s (x5 over 5m59s) kubelet Started container server
Warning BackOff 56s (x25 over 5m58s) kubelet Back-off restarting failed container
我没有收到任何日志:
root@node1:~/test/server# kubectl logs -f server
root@node1:~/test/server#
我无法确定问题是否出在用于创建 pod 的容器或 yaml 文件上。任何帮助将不胜感激。
将此发布为
Community Wiki
。
正如@David Maze 在评论部分所指出的。
如果 docker run 立即退出,Kubernetes Pod 将始终进入
状态。您的CrashLoopBackOff
需要Dockerfile
或以其他方式安装应用程序并设置其COPY
来运行它。CMD
根本原因也可以通过
Exit Code
来确定。在 3) 检查退出代码文章中,您可以找到一些退出代码,例如 0, 1, 128, 137 以及说明。
3.1) 退出代码 0
此退出代码意味着指定的容器命令“成功”完成,但 Kubernetes 经常无法接受其正常工作。
简而言之,您的容器已创建,所有提到的操作均已执行,并且由于没有其他事情可做,因此它以
Exit Code 0
退出。
Kubernetes 中 pod 启动多次失败会出现
错误`CrashLoopBackOff
您基于
centos
的图像,几乎没有额外安装,在后台没有任何进程,因此它被归类为 Completed
。由于这种情况发生得太快,kubernetes 重新启动了它,它陷入了循环。
$ kubectl run centos --image=centos
$ kubectl get po -w
NAME READY STATUS RESTARTS AGE
centos 0/1 CrashLoopBackOff 1 5s
centos 0/1 Completed 2 17s
centos 0/1 CrashLoopBackOff 2 31s
centos 0/1 Completed 3 46s
centos 0/1 CrashLoopBackOff 3 58s
centos 1/1 Running 4 88s
centos 0/1 Completed 4 89s
centos 0/1 CrashLoopBackOff 4 102s
$ kubectl describe po centos | grep 'Exit Code'
Exit Code: 0
但是当您使用
sleep 3600
时,在容器中,命令 sleep
正在执行一个小时。在此之后,它也会以 Exit Code 0
退出。
希望能澄清。