kubernetes 部署突然 pod 重启,原因?

时间:2021-04-09 07:55:19

标签: kubernetes logging google-cloud-platform google-kubernetes-engine

我在 GKE 上部署了微服务,使用 Helm v3;所有应用程序/掌舵都很好地保持了几个月,但昨天由于某种原因重新创建了 pods

kubectl get pods -l app=myapp  

NAME                     READY   STATUS    RESTARTS   AGE
myapp-75cb966746-grjkj   1/1     Running   1          14h
myapp-75cb966746-gz7g7   1/1     Running   0          14h
myapp-75cb966746-nmzzx   1/1     Running   1          14h

helm3 history myapp 显示它是在 2 天前(40 小时以上)而不是昨天更新的(所以我排除了有人简单运行 helm3 upgrade .. 的可能性;(似乎有人运行了命令 kubectl rollout restart deployment/myapp) ,有什么想法如何检查 Pod 重新启动的原因?我不确定如何验证它;PS:来自 kubectl logs deployment/myapp 的日志仅返回 3 小时前


仅供参考,我不是要这个命令 kubectl logs -p myapp-75cb966746-grjkj,这样没有问题,我想知道 14 小时前在那里的 3 个 pod 发生了什么,只是被删除了/已更换 - 以及如何检查。


集群上也没有事件

MacBook-Pro% kubectl get events
No resources found in myns namespace.

至于描述部署,首先是几个月前创建的部署

CreationTimestamp:      Thu, 22 Oct 2020 09:19:39 +0200

上次更新是在 >40 小时前

lastUpdate: 2021-04-07 07:10:09.715630534 +0200 CEST m=+1.867748121

这里是完整的描述是否有人想要

MacBook-Pro% kubectl describe deployment myapp
Name:                   myapp
Namespace:              myns
CreationTimestamp:      Thu, 22 Oct 2020 09:19:39 +0200
Labels:                 app=myapp
Annotations:            deployment.kubernetes.io/revision: 42
                        lastUpdate: 2021-04-07 07:10:09.715630534 +0200 CEST m=+1.867748121
                        meta.helm.sh/release-name: myapp
                        meta.helm.sh/release-namespace: myns
Selector:               app=myapp,env=myns
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  25% max unavailable, 1 max surge
Pod Template:
  Labels:       app=myapp
  Annotations:  kubectl.kubernetes.io/restartedAt: 2020-10-23T11:21:11+02:00
  Containers:
   myapp:
    Image:      xxx
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:     1
      memory:  1G
    Requests:
      cpu:      1
      memory:   1G
    Liveness:   http-get http://:myappport/status delay=45s timeout=5s period=10s #success=1 #failure=3
    Readiness:  http-get http://:myappport/status delay=45s timeout=5s period=10s #success=1 #failure=3
    Environment Variables from:
      myapp-myns  Secret  Optional: false
    Environment:
      myenv: myval
    Mounts:
      /some/path from myvol (ro)
  Volumes:
   myvol:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      myvol
    Optional:  false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   myapp-75cb966746 (3/3 replicas created)
Events:          <none>

3 个答案:

答案 0 :(得分:1)

首先,我会检查运行 Pod 的节点。

  • 如果 Pod 重新启动(这意味着 RESTART COUNT 递增),通常意味着 Pod 出现错误并且该错误导致 Pod 崩溃。
  • 在您的情况下,Pod 是完全重新创建的,这意味着(如您所说)有人可以使用推出重新启动,或者缩小然后放大部署(均为手动操作)。

自动创建 Pod 的最常见情况是执行 Pod 的节点出现问题。如果一个节点变为NotReady,即使是很短的时间,Kubernetes Scheduler 也会尝试在其他节点上调度新的 Pod 以匹配所需的状态(副本数量等)

NotReady 节点上的旧 Pod 将进入终止状态,并在 NotReady 节点变为 strong>再次准备(如果它们仍在运行)

这在文档 ( https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-lifetime ) 中有详细描述

<块引用>

如果一个节点死亡,则调度到该节点的 Pod 将在超时时间后被调度删除。 Pod 本身不会自我修复。如果一个 Pod 被调度到一个失败的节点上,这个 Pod 就会被删除;同样,由于缺乏资源或节点维护,Pod 将无法在驱逐中幸存下来。 Kubernetes 使用更高级别的抽象,称为控制器,它处理管理相对可支配的 Pod 实例的工作。

答案 1 :(得分:0)

你可以使用

kubectl describe pod your_pod_name

在 Containers.your_container_name.lastState 中的何处,您可以获得最后一个 Pod 终止的时间和原因(例如,由于错误或由于 OOMKilled)

文档参考:

kubectl explain pod.status.containerStatuses.lastState

KIND:     Pod
VERSION:  v1

RESOURCE: lastState <Object>

DESCRIPTION:
     Details about the container's last termination condition.

     ContainerState holds a possible state of container. Only one of its members
     may be specified. If none of them is specified, the default one is
     ContainerStateWaiting.

FIELDS:
   running      <Object>
     Details about a running container

   terminated   <Object>
     Details about a terminated container

   waiting      <Object>
     Details about a waiting container

我的一个容器的示例,由于应用程序错误而终止:

Containers:
  my_container:
    Last State:     Terminated
      Reason:       Error
      Exit Code:    137
      Started:      Tue, 06 Apr 2021 16:28:57 +0300
      Finished:     Tue, 06 Apr 2021 16:32:07 +0300

要获取容器的先前日志(重新启动的日志),您可以在 pod 上使用 --previous 键,如下所示:

kubectl logs your_pod_name --previous

答案 2 :(得分:0)

我建议您运行 kubectl describe deployment <deployment-name>kubectl describe pod <pod-name>

此外,kubectl get events 将显示集群级别的事件并可能帮助您了解发生了什么。