我在 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>
答案 0 :(得分:1)
首先,我会检查运行 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
将显示集群级别的事件并可能帮助您了解发生了什么。