作者介绍:简历上没有一个精通的运维工程师。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们前面介绍了很多类型的工作负载,最后都会落实到具体的Pod上的。上一小节我们也介绍了Pod的创建流程,实际运维中Pod状态也会根据实际情况进行变化,所以了解Pod的各种状态,对于分析处理问题非常有帮助。
在 Kubernetes 中,Pod 的生命周期涵盖了多个状态,其中包括一些长期状态和短暂状态。下面是这些状态的综合描述:
长期状态
短暂状态
当然其实这些所谓的长期和短暂状态其实不太准确,因为如果出现问题,这些状态就会长期保持,比如我们前面讲解InitContainers,就故意设置错误让这个初始化无法完成,他的状态就会长期维持在Init:xxx状态。
我们通过前面的状态,只能看到一个Pod状态,如果想要知道引发这个状态的详细信息,则可以通过下面的命令来实现。
kubectl get pod <pod-name>
kubectl describe pod <pod-name>
在 kubectl describe pod
的输出中,Events 部分会显示 Pod 的生命周期中的各种短暂状态和相关事件,提供有关 Pod 创建、启动或删除过程中发生的详细信息,有助于诊断和解决问题。
但是这些状态并不绝对,短期状态也可能持续存在,比如下载镜像失败,就会持续存在。
特别注意Terminating状态如果长期不消失则只能强制删除,但是一般不要轻易这样操作。
要强制删除一个 Pod,你可以使用 kubectl
命令并传递 --force
和 --grace-period=0
参数。这将立即删除 Pod 而不等待优雅终止的过程。请记住,强制删除可能会导致 Pod 中运行的服务不正常终止,可能会引起数据不一致或其他问题。只有当 Pod 无法正常删除时,才建议使用强制删除。
下面是强制删除 Pod 的命令:
kubectl delete pod <pod-name> --force --grace-period=0
这里的 <pod-name>
是你想要删除的 Pod 的名字。
如果节点失联,节点的Pod出现Unknown状态,一般不需要手工删除,只要等待节点恢复以后,这些Pod就会被自动删除。
另一个注意事项是,如果 Pod 被设置了 finalizers(终结器),那么即使使用了 --force
参数,它仍可能不会被立即删除。这是因为 finalizers 是用于在删除资源之前执行特定的清理工作。在这种情况下,你可能需要编辑 Pod 资源以移除 finalizers:
kubectl edit pod <pod-name>
然后删除或清空 metadata.finalizers
字段,保存并退出编辑器,Pod 将被删除。