【问题标题】:Sudden pod restart of kubernetes deployment, reason?kubernetes部署突然pod重启,原因?
【发布时间】:2021-04-09 16:59:37
【问题描述】:

我已经使用 Helm v3 在 GKE 上部署了微服务;所有应用程序/helm 都很好地保存了几个月,但昨天出于某种原因重新创建了 pod

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>

【问题讨论】:

  • 运行 Pod 的节点/节点有什么问题吗?如果它们即使在很短的时间内都没有准备好,并且 Pod 来自 Deployment,那么它们再次被调度是正常的
  • 干得好,伙计:D,就是这样,节点在 15 小时前重新启动,所以就在 pod 重新启动时
  • 您可以将其发布为答案并检查它,再次感谢您的解决方案
  • 我已经发布了评论作为答案,还添加了少量信息

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    你可以使用

    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
    

    【讨论】:

    • 是的,我知道如何查看上次终止或 pod 重新启动的原因;我说之前的所有豆荚都被杀死了,而现在的新豆荚,从 14 小时前开始,都还不错;我想知道之前的 pod 发生了什么
    【解决方案3】:

    我建议你运行kubectl describe deployment &lt;deployment-name&gt;kubectl describe pod &lt;pod-name&gt;

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

    【讨论】:

    • describe deployment 没有显示,杀死的 pod 的名称是什么,或者它们发生了什么
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2021-06-18
    • 2020-07-20
    • 2016-08-22
    • 2020-07-27
    • 2018-08-30
    • 2019-02-05
    • 2021-09-21
    相关资源
    最近更新 更多