排查Pod卡在Terminating状态

排查Pod卡在Terminating状态,第1张

pod已经被删除,并且卡在Terminated状态较长时间,可能是因为:

这个手册用于排查pod已经被删除,但长时间卡在Terminate状态,或者长于自己期望的时间。

当运行命令 kubect get pods ,你可以看到关于pod的输出:

1收集信息

2检查finalizers

3检查节点状态

4强制删除

首先检查一下是否有finalizers,如果有可能是无法完成的根本原因。

获取pod配置:

并且检查 metadata 下面有 finalizers ,如果有则跳到 方案A)。

pod可能运行在因为某种原因发生故障的节点。

如果从 /tmp/runbooks_pod_configurationtxt 文件里面所指定的节点上所有的pod都卡在Terminated状态,那么极有可能是因为node节点故障导致的,可以通过运行命令检查:

由于没有想用终止信号,pod可能不会终止,具体原因可能取决于程序的具体情况,常见原因可能包含:

如果没有其他效果,可以尝试在pod所在的节点上重启kubelet,查看 方案C

A) 删除finalizer

B) 强制删除pod

C) 重启kubelet

删除pod的finalizers,运行命令:

请注意,这是解决方法不是解决方案,请谨慎行事确保问题不会进一步恶化。另外请参与 Statefulset 有关的详细信息。

强制删除运行命令:

如果不生效,请重新参照排查手册,检查一下解决思路。

如果可以,SSH登陆到节点上重启kubelet进程,重启之前可以检查kubelet的日志是否有异常信息。

如果 kubectl get pod 没有显示pod存在那么问题就得到了解决:

如果问题进一步出现,你可能需要:

根据终结器需要完成的工作有所不同。

终结器未完成的常见情况包括

这将根据终结器的 *** 作有所不同,并且需要特定的上下文知识。

可以检查kubelet的日志,可能会包含一些有用的信息。

Finalizers

Container Lifecycle Hooks

Termination of Pods

Unofficial Kubernetes Pod Termination

Kubelet logs

原文: >

  一个pod是一组紧密相关的容器,是一起运行在同一个工作节点上,以及同一个Linux命名空间中。每个pod就像是一个独立的逻辑机器,拥有自己的IP、主机名、进程等,运行一个独立的应用程序。

  pod是逻辑主机,一个pod的所有容器都运行在同一个逻辑机器上,其他pod中的容器,即使运行在同一个工作节点上,也会出现在不同的节点上。即一个pod包含多个容器时,这些容器总是运行在同一个工作节点上,一个pod绝不可能跨多个工作节点。

举例

  每个pod自有IP,包含1个或多个容器,每个容器运行一个应用进程

查看pod命令

$ kubectl get pods

READY:0/1 表示pod的单个容器显示为未就绪的状态;相反,1/1表示已就绪;

STATUS: Pending 表示pod处于挂起状态;相反,Running表示pod处于运行状态;

  运行应用两大步骤:1)构建镜像并推送至镜像仓库中;2)K8s创建pod进行调度;

流程:

1)本地构建镜像;

2)推送镜像至镜像仓库;

3)kubectl创建并部署应用;

4)kubectl发出REST请求至REST API服务器;

5)创建pod并调度到工作节点;

6)kubelet收到通知;

7)kubelet告知Docker运行镜像;

8)Docker从镜像仓库中拉取镜像;

9)Docker创建并运行容器;

  如果单个容器中运行多个不相关的进程,保持所有进程运行、管理它们的日志将很难,需要包含一种在进程崩溃时能够自动重启的机制,同事,这些进程都将记录到相同的标准输出中,很难确定每个进程分别记录的内容。

  不能讲多个进程聚集在一个单独的容器中,需要pod将容器绑定在一起,并将它们作为一个单元进行管理,在包含容器的pod下,可以同时运行一些密切现骨干的进程,并为其提供相同的环境,此时这些进程就好像全部运行于单独的容器中,同时保持一定的隔离性。

  k8s可以通过配置docker让一个pod内的所有容器共享相同的Linux命名空间(network、UTS命名空间、IPC命名空间),从而使容器都共享相同的主机名、网络名和IPC通信。

  同一个pod中的容器运行的多个进程不能绑定到相同的端口号,否则会端口冲突(每个pod都有独立的端口空间,不同pod中的容器不会有端口冲突现象。)

  同一个pod中的容器具有相同的loopback网络接口,所以容器可以通过localhost与同一个pod中的其他容器进行通信。

注意

  容器不应该包含多个进程,pod也不应该包含多个并不需要运行在同一主机上的容器。如下图:

1)yaml中使用的kubernetes API版本和yaml描述的资源类型;

2)metadata:包括名称、命名空间、标签和关于该容器的其他信息;

3)spec:包含pod内容的实际说明,如pod的容器、卷和其他数据;

4)status:包含运行中的pod的当前信息,如pod所处的条件、每个容器的描述和状态,以及内部IP和其他基本信息。

描述信息:

1)该文件遵循Kubernetes API的v1版本;

2)描述的资源类型是pod;

3)资源名称为kubia-manual;

4)该pod由基于luksa/kubia镜像的单个容器组成;

5)容器名称为kubia;

6)容器监听的端口是8080;

按名称删除

$ kubectl delete po pod_name

其中, pod_name 为pod名称;删除命令指示uk8s终止该pod中所有容器,k8s向进程发送一个SIGTERM信号并等待一定的秒数(默认30s),使得其正常关闭,若未及时关闭,则通过SIGKILL终止进程。

删除多个pod

$ kubectl delete po pod_name1 pod_name2

多个pod删除使用空格隔开;

按照标签删除

$ kubectl depete po -l tag_key=tag_value

其中, tag_key 为标签健, tag_value 为标签值;

按照整个命名空间删除

$ kubectl delete ns namespace_name

其中, namespace_name 为命名空间名称

Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现 多套环境的资源隔离 或者 多租户的资源隔离

默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的组,以方便不同的组的资源进行隔离使用和管理。

可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

然后就可以执行对应的创建和删除命令了:

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。

Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:

创建并运行

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

查看pod信息

访问Pod

删除指定Pod

配置 *** 作

创建一个pod-nginxyaml,内容如下:

然后就可以执行对应的创建和删除命令了:

Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label的特点:

可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:

当前有两种Label Selector:

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

name=slave,env!=production

name not in (frontend),env!=production

命令方式

配置方式

然后就可以执行对应的更新命令了:kubectl apply -f pod-nginxyaml

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

在kubernetes中Pod控制器的种类有很多,本文只介绍一种:Deployment。

命令 *** 作

查看创建的Pod

查看deployment的信息

查看deployment的详细信息

删除

配置 *** 作

创建一个deploy-nginxyaml,内容如下:

然后就可以执行对应的创建和删除命令了:

前面已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。

虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。

Service可以看作是一组同类Pod 对外的访问接口 。借助Service,应用可以方便地实现服务发现和负载均衡。

*** 作一:创建集群内部可访问的Service

*** 作二:创建集群外部也可访问的Service

删除Service

配置方式

创建一个svc-nginxyaml,内容如下:

然后就可以执行对应的创建和删除命令了:

至此,介绍了Namespace、Pod、Deployment、Service资源的基本 *** 作,有了这些 *** 作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。

以上就是关于排查Pod卡在Terminating状态全部的内容,包括:排查Pod卡在Terminating状态、k8s-pod之DaemonSet、Kubernetes-Pod基本概念(六)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10083707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存