【问题标题】:How can I diagnose why a k8s pod keeps restarting?如何诊断 k8s pod 不断重启的原因?
【发布时间】:2020-12-28 20:45:33
【问题描述】:

我使用以下配置文件将 elasticsearch 部署到 minikube:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      name: elasticsearch
  template:
    metadata:
      labels:
        name: elasticsearch
    spec:
      containers:
        - name: elasticsearch
          image: elasticsearch:7.10.1
          ports:
            - containerPort: 9200
            - containerPort: 9300

我运行命令kubectl apply -f es.yml 来部署elasticsearch 集群。

$ kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
elasticsearch-fb9b44948-bchh2   1/1     Running   5          6m23s

elasticsearch pod 每隔几分钟就会重新启动一次。当我运行kubectl describe pod 命令时,我可以看到这些事件:

Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  7m11s                  default-scheduler  Successfully assigned default/elasticsearch-fb9b44948-bchh2 to minikube
  Normal   Pulled     3m18s (x5 over 7m11s)  kubelet            Container image "elasticsearch:7.10.1" already present on machine
  Normal   Created    3m18s (x5 over 7m11s)  kubelet            Created container elasticsearch
  Normal   Started    3m18s (x5 over 7m10s)  kubelet            Started container elasticsearch
  Warning  BackOff    103s (x11 over 5m56s)  kubelet            Back-off restarting failed container

最后一个事件是Back-off restarting failed,但我不知道为什么它会重新启动 pod。有什么办法可以检查为什么它不断重启?

【问题讨论】:

  • 这与您的问题无关,但是手动管理 Elasticsearch 确实是个坏主意,您应该为此使用 helm 图表或 kubernetes 运算符。

标签: elasticsearch kubernetes


【解决方案1】:

您已经完成的第一步 (kubectl describe pod)。作为下一步,我建议检查容器日志:kubectl logs <pod_name>。在这种情况下,99% 你从日志中得到原因(我打赌bootstrap check 失败)。

当describe pod 和日志都没有关于该错误的任何信息时,我使用“exec”进入容器:kubectl exec -it <pod_name> -c <container_name> sh。有了这个,您将在容器内获得一个 shell(当然,如果其中有一个 shell 二进制文件),因此您可以使用它来手动调查问题。请注意,要使失败的容器保持活动状态,您可能需要将 command 和 args 更改为以下内容:

command:
  - /bin/sh
  - -c
args:
  - cat /dev/stdout

执行此操作时请务必禁用探针。如果 liveness probe 失败,容器可能会重新启动,如果发生这种情况,您将在 kubectl describe pod 中看到。由于你的 sn-p 没有指定任何探测,你可以跳过这个。

【讨论】:

  • 一个不错的文档是here
  • @Arun 是的,很容易解释,对我来说有点太多了。不过我想我会在答案中添加一些内容,谢谢。
【解决方案2】:

使用 kubectl logs podname 检查 pod 的日志可以提供有关可能出错的线索。

ERROR: [2] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log

查看此post 以获得解决方案

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 2020-04-05
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多