1

我正在尝试在 localhost 上使用我自己的 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
                                                                                     

图像已被推送到 localhost 注册表。

以下是我收到的错误。

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 文件上。任何帮助,将不胜感激。

4

1 回答 1

1

将此发布为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.

CrashLoopBackOffKubernetes 中 Pod 启动反复失败时会发生错误。`

您基于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

希望它澄清。

于 2020-12-07T13:51:07.263 回答