首页 > 其他分享 >在K8S中,Pod优雅终止过程是什么?

在K8S中,Pod优雅终止过程是什么?

时间:2024-02-28 09:25:13浏览次数:14  
标签:容器 优雅 kubelet 终止 Pod K8S SIGTERM

在Kubernetes (K8s) 中,Pod的优雅终止过程是一个有序的过程,旨在确保Pod中运行的应用程序能够平滑关闭,释放资源,并尽可能减少因突然关闭带来的数据丢失和服务中断。以下是Pod优雅终止的一般步骤:

  1. 删除Pod请求

    • 用户或控制器发出删除Pod的请求,比如通过 kubectl delete pod <pod-name> 或者由于Deployment的滚动更新策略等。
  2. Pod状态更改为Terminating

    • Kubernetes控制平面接收到请求后,将Pod的状态更新为“Terminating”。
  3. kube-proxy更新

    • kube-proxy会立即从Service的负载均衡列表中移除该Pod,停止新的网络流量被路由到该Pod。
  4. 执行PreStop Hook

    • 如果Pod的定义中包含了.spec.containers[].lifecycle.preStop钩子,kubelet将在发送SIGTERM信号之前执行这些自定义操作,例如清理缓存、写入最终状态或通知外部服务。
  5. 发送SIGTERM信号

    • kubelet向Pod中的每个容器发送SIGTERM信号,这标志着容器应该开始执行其自身的优雅停机流程。
  6. 等待容器关闭

    • 容器在接收到SIGTERM信号后应尽快结束处理正在进行的请求,并在完成必要的清理工作后自行退出。
  7. Grace Period(优雅终止期)

    • Kubernetes会给Pod一个默认的 grace period(默认为30秒,可在Pod的.spec.terminationGracePeriodSeconds中自定义),在此期间等待容器自己关闭。
  8. 强制停止

    • 如果容器在grace period结束后仍未退出,kubelet将向其发送SIGKILL信号强制终止容器,以确保Pod能够及时释放资源。
  9. 清理Pod资源

    • 所有容器终止后,kubelet会清理与Pod关联的一切资源,如临时存储卷、环境变量、网络端点等。
  10. Pod完全删除

    • 当Pod的所有资源都被成功清理,kubelet会将Pod从集群中删除,Pod的生命周期至此结束。

综上所述,整个过程中,应用程序应当监听SIGTERM信号,并在接收到该信号时开始优雅地关闭服务。这一系列动作确保了Pod不仅能够快速响应集群管理的需求,还能尽量避免由此造成的用户体验下降或数据完整性损失。需要注意的是,如果在等待容器进程停止的过程中,kubelet或容器管理器发生了重启,那么终止操作会重新获得一个满额的删除宽限期并重新执行删除操作。优雅终止过程确保了Pod中的容器在被删除前能够完成必要的清理工作,从而避免了数据丢失和资源泄漏。这对于长期运行的容器和需要保持数据一致性的应用来说尤为重要。

标签:容器,优雅,kubelet,终止,Pod,K8S,SIGTERM
From: https://www.cnblogs.com/huangjiabobk/p/18038942

相关文章

  • 在K8S中,helm是什么?如何使用?
    在Kubernetes(K8s)中,Helm是一个用于简化Kubernetes应用程序部署和管理的包管理工具。它采用了声明式配置和模板化的概念,使得Kubernetes资源的打包、安装、升级、回滚等操作变得更加方便和高效。Helm主要由两个核心组件构成:HelmCLI(命令行接口):提供了一系列命令,让用户能够在本......
  • 在K8S中,etcd数据库中数据如何更改?
    在Kubernetes(K8s)中,etcd中的数据更改主要发生在以下几个场景中:创建、更新和删除Kubernetes资源对象:当用户在Kubernetes中创建(POST)、更新(PUT)或删除(DELETE)一个资源对象(如Pod、Service、Deployment等)时,KubernetesAPI服务器会将这些更改转换为对etcd的相应操作。API服务器会将更改......
  • 在K8S中,etcd是什么类型数据库?
    在Kubernetes(K8s)中,etcd是一个高度可靠、分布式的键值存储数据库,用于存储集群的共享配置和服务发现信息。etcd在Kubernetes架构中扮演着核心组件的角色,是集群状态数据的关键存储后端。1.etcd的类型:键值存储(Key-ValueStore):etcd最基本的功能是作为键值存储,它允许用户存储和......
  • 在K8S中,etcdctl如何使用?
    在Kubernetes(K8s)中,etcdctl是用于直接与etcd集群交互的命令行工具,主要用于管理和调试etcd存储中的键值对数据。etcd是K8s集群的核心组件之一,它作为一个高可用的分布式键值存储系统,用于保存集群的所有重要配置数据。以下是如何在Kubernetes环境中使用etcdctl的基本......
  • k8s架构解析
    Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Kubernetes由多个组件组成,每个组件都扮演着不同的角色。以下是Kubernetes中一些主要组件的详细说明:kube-apiserver:API服务器是Kubernetes集群的中心,提供了资源操作的唯一入口。它负责接收......
  • k8s 跨空间通讯(内外部)
    四层代理创建ExternalName类型的Service应用场景:跨名称空间访问需求:default名称空间下的pod想要访问cheng-svc-pod名称空间下的pod服务cheng-svc-pod下有一个svc服务,default想访问就要下完成的名称Service_name.svc_namespace.svc.cluster.local,名称太长不好记,后面......
  • 在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
    在Kubernetes中,当Pod的业务量比较大时,可以通过水平伸缩(HorizontalPodAutoscaling,HPA)和扩容(Scaling)来实现动态的资源管理。以下是实现水平伸缩和扩容的一些步骤和方法:1.水平伸缩(HorizontalPodAutoscaling,HPA)水平伸缩允许你根据一些指标(如CPU使用率、内存使用率、自定义......
  • 在K8S中,worke节点启动阶段包括什么?
    在Kubernetes(K8S)中,Worker节点启动阶段大致包括以下几个关键步骤:系统初始化:Worker节点操作系统启动,加载基础系统服务和配置。安装必备软件,如Docker或containerd作为容器运行时环境。kubelet启动:kubelet是Kubernetes在每个节点上的代理程序,它会在启动时加载其配置文件(通......
  • 在K8S中,如何查看Pod中某个容器日志?
    在Kubernetes(K8s)中,若要查看Pod中某个容器的日志,可以使用kubectllogs命令,并通过-c或--container参数指定容器名称。以下是命令格式:kubectllogs<pod_name>-c<container_name>这里的<pod_name>是你想要查看日志的Pod名称,而<container_name>则是你具体想要......
  • 在K8S中,svc关联pod失败原因有哪些?
    在Kubernetes(K8S)中,Service(svc)与Pod关联失败的原因可能有多种。以下是一些常见的原因:网络问题:kube-proxy配置问题:如果kube-proxy没有正确配置或未开启masquerade,可能导致Pod发出的包无法被正确伪装成Service的IP和MAC地址,从而导致Service无法与Pod关联。网络策略限制:如果启用......