我的kubernetes pod与“CrashLoopBackOff”一起崩溃,但我找不到任何日志

时间:2017-01-12 03:13:38

标签: kubernetes

这就是我不断得到的:

[root@centos-master ~]# kubectl get pods
NAME               READY     STATUS             RESTARTS   AGE
nfs-server-h6nw8   1/1       Running            0          1h
nfs-web-07rxz      0/1       CrashLoopBackOff   8          16m
nfs-web-fdr9h      0/1       CrashLoopBackOff   8          16m

以下是“describe pods”的输出 kubectl describe pods

Events:
  FirstSeen LastSeen    Count   From                SubobjectPath       Type        Reason      Message
  --------- --------    -----   ----                -------------       --------    ------      -------
  16m       16m     1   {default-scheduler }                    Normal      Scheduled   Successfully assigned nfs-web-fdr9h to centos-minion-2
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Created     Created container with docker id 495fcbb06836
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Started     Started container with docker id 495fcbb06836
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Started     Started container with docker id d56f34ae4e8f
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Created     Created container with docker id d56f34ae4e8f
  16m       16m     2   {kubelet centos-minion-2}               Warning     FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "web" with CrashLoopBackOff: "Back-off 10s restarting failed container=web pod=nfs-web-fdr9h_default(461c937d-d870-11e6-98de-005056040cc2)"

我有两个pod:nfs-web-07rxz,nfs-web-fdr9h,但如果我执行“kubectl logs nfs-web-07rxz”或“-p”选项,我在两个pod中都看不到任何日志

[root@centos-master ~]# kubectl logs nfs-web-07rxz -p
[root@centos-master ~]# kubectl logs nfs-web-07rxz

这是我的replicationController yaml文件: replicationController yaml file

apiVersion: v1 kind: ReplicationController metadata:   name: nfs-web spec:   replicas: 2   selector:
    role: web-frontend   template:
    metadata:
      labels:
        role: web-frontend
    spec:
      containers:
      - name: web
        image: eso-cmbu-docker.artifactory.eng.vmware.com/demo-container:demo-version3.0
        ports:
          - name: web
            containerPort: 80
        securityContext:
          privileged: true

我的Docker镜像来自这个简单的docker文件:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y nfs-common

我在CentOs-1611上运行我的kubernetes集群,kube版本:

[root@centos-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}

如果我通过“docker run”运行docker镜像,我能够毫无问题地运行图像,只有通过kubernetes我才能崩溃。

有人可以帮我解决,如何在不看日志的情况下进行调试?

19 个答案:

答案 0 :(得分:41)

正如@Sukumar评论的那样,您需要让Dockerfile运行Command或让ReplicationController指定命令。

pod正在崩溃,因为它启动然后立即退出,因此Kubernetes重新启动并且循环继续。

答案 1 :(得分:16)

kubectl -n <namespace-name> describe pod <pod name>

kubectl -n <namespace-name> logs -p  <pod name> 

答案 2 :(得分:6)

我需要为后续的 kubectl exec 调用运行一个pod,正如上面的评论指出我的pod被我的k8s群集杀死了,因为它已经完成了所有任务的运行。我设法保持我的pod运行,只需使用一个不会自动停止的命令来启动pod:

kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null

答案 3 :(得分:3)

在您的yaml文件中,添加命令和args行:

...
containers:
      - name: api
        image: localhost:5000/image-name 
        command: [ "sleep" ]
        args: [ "infinity" ]
...

为我工作。

答案 4 :(得分:3)

This page开始,容器在正确运行所有内容后死亡,但崩溃是因为所有命令都已结束。您可以在前台运行服务,也可以创建保持活动脚本。通过这样做,Kubernetes将显示您的应用程序正在运行。我们必须注意,在Docker环境中,不会遇到此问题。只有Kubernetes想要一个正在运行的应用程序。

答案 5 :(得分:1)

如果您的应用程序需要较慢的引导时间,则它可能与“就绪/活跃性”探针的初始值有关。我的initialDelaySeconds应用程序处理了大量初始化工作,因此将SpringBoot的值增加到120s解决了我的问题。该文档没有没有提及默认的0(https://kubernetes.io/docs/api-reference/v1.9/#probe-v1-core

service:
  livenessProbe:
    httpGet:
      path: /health/local
      scheme: HTTP
      port: 8888
    initialDelaySeconds: 120
    periodSeconds: 5
    timeoutSeconds: 5
    failureThreshold: 10
  readinessProbe:
    httpGet:
      path: /admin/health
      scheme: HTTP
      port: 8642
    initialDelaySeconds: 150
    periodSeconds: 5
    timeoutSeconds: 5
    failureThreshold: 10

What is the default value of initialDelaySeconds对这些值进行了很好的解释。

  

运行状况或准备情况检查算法的工作方式如下:

     
      
  1. 等待initialDelaySeconds
  2.   
  3. 执行检查并等待timeoutSeconds超时   如果连续成功的次数大于successThreshold,则返回成功
  4.   
  5. 如果连续失败的次数大于failureThreshold,则返回失败,否则请等待periodSeconds并开始新的检查
  6.   

就我而言,我的应用程序现在可以以一种非常清晰的方式进行引导,因此我知道我不会得到定期的崩溃回退,因为有时它会受到这些速率的限制。

答案 6 :(得分:1)

我观察到相同的问题,并在yaml文件中添加了command和args块。我正在复制yaml文件的示例以供参考

 apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: ubuntu
      name: ubuntu
      namespace: default
    spec:
      containers:
      - image: gcr.io/ow/hellokubernetes/ubuntu
        imagePullPolicy: Never
        name: ubuntu
        resources:
          requests:
            cpu: 100m
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo hello; sleep 10;done"]
      dnsPolicy: ClusterFirst
      enableServiceLinks: true

答案 7 :(得分:1)

就我而言,此错误特定于 hello-world docker 映像。我使用了 nginx 图像而不是 hello-world 图像并且错误已解决。

答案 8 :(得分:0)

在我的情况下,问题出在史蒂夫·S。提到的问题上:

  

该Pod崩溃是因为它启动后立即退出,因此Kubernetes重新启动并且循环继续。

也就是说,我有一个Java应用程序,该应用程序的main引发了异常(并且某些东西覆盖了默认的未捕获异常处理程序,因此未记录任何内容)。解决方案是将main的正文放入try { ... } catch并打印出异常。这样我就可以找出问题所在并加以解决。

(另一个原因可能是应用程序调用{​​{1}};您可以使用自定义System.exit和覆盖的SecurityManager来阻止(或记录调用者的)退出;请参见{ {3}}。)

答案 9 :(得分:0)

在对同一问题进行故障排除时,我发现使用kubeclt logs <pod_id>时没有日志。 因此,我将ssh:ed到节点实例中,以尝试使用普通docker运行容器。令我惊讶的是,这也失败了。

使用以下命令进入容器时:

docker exec -it faulty:latest /bin/sh

随便逛逛,我发现它不是最新版本。

实例上已经存在错误版本的docker映像。

当我使用以下命令删除有问题的最新实例时:

docker rmi faulty:latest

一切都开始起作用。

答案 10 :(得分:0)

我的豆荚不断崩溃,我无法找到原因。幸运的collection
(#List事件按时间戳排序)

要查看这些事件,请运行命令:

parseInt()

请确保在命令中添加let number = parseInt(offset) 参数

命令输出中显示的事件表明了我的吊舱持续崩溃的原因。

答案 11 :(得分:0)

我解决了这个问题,增加了内存资源

  resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 100m
        memory: 250Mi 

答案 12 :(得分:0)

我遇到了同样的问题,现在我终于解决了。我没有使用docker-compose文件。 我刚刚在Docker文件中添加了这一行,它就起作用了。

ENV CI=true

参考: https://github.com/GoogleContainerTools/skaffold/issues/3882

答案 13 :(得分:0)

尝试重新运行Pod并运行

 kubectl get pods --watch

观察Pod前进过程中的状态。

就我而言,我只会看到最终结果“ CrashLoopBackOff”,但docker容器在本地运行良好。因此,我使用上述命令观看了吊舱,并看到容器短暂地进入了OOMKilled state,这对我来说意味着它需要更多的内存。

答案 14 :(得分:0)

我通过在数组内部删除引号和命令值之间的空格解决了这个问题,这是因为容器在启动后退出,并且不存在要在容器内部运行的可执行命令。

['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

答案 15 :(得分:0)

我遇到了类似的问题,但是当我更正了zookeeper.yaml文件时,该文件的服务名称与文件部署的容器名称不匹配,因此解决了该问题。通过使它们相同来解决。

apiVersion: v1
kind: Service
metadata:
  name: zk1
  namespace: nbd-mlbpoc-lab
  labels:
    app: zk-1
spec:
  ports:
  - name: client
    port: 2181
    protocol: TCP
  - name: follower
    port: 2888
    protocol: TCP
  - name: leader
    port: 3888
    protocol: TCP
  selector:
    app: zk-1
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: zk-deployment
  namespace: nbd-mlbpoc-lab
spec:
  template:
    metadata:
      labels:
        app: zk-1
    spec:
      containers:
      - name: zk1
        image: digitalwonderland/zookeeper
        ports:
        - containerPort: 2181
        env:
        - name: ZOOKEEPER_ID
          value: "1"
        - name: ZOOKEEPER_SERVER_1
          value: zk1

答案 16 :(得分:0)

就我而言,问题是命令行参数列表被误解了。我在我的部署文件中这样做:

...
args:
  - "--foo 10"
  - "--bar 100"

而不是正确的方法:

...
args:
  - "--foo"
  - "10"
  - "--bar"
  - "100"

答案 17 :(得分:0)

我终于在我执行'docker run xxx'命令时找到了解决方案,然后我得到了错误。它是由不完整的平台引起的。

答案 18 :(得分:0)

如上述帖子所述,容器在创建时退出。

如果您想在不使用 yaml 文件的情况下对此进行测试,可以将命令传递给 kubectl create deployment 语句。双连字符 -- 表示命令,相当于部署 yaml 文件中的 command:

以下命令为 debian 创建部署。

kubectl create deployment deb --image=debian:buster-slim -- "sh" "-c" "while true; do sleep 1234; done"

您只需要创建一个服务等,但您可以kubectl exec -it <pod-name> sh进入其中进行测试。