强制删除StatefulSet中的Pods
本文介绍如何删除StatefulSet管理的Pods,并解释这样操作时需要记住的注意事项。
在开始之前
StatefulSet注意事项
在StatefulSet的正常操作中,永远不需要强制删除StatefulSet管理的Pod。StatefulSet控制器负责创建、扩缩和删除StatefulSet管理的Pods。它尝试确保指定数量的从序数0到N-1的Pod处于活跃状态并准备就绪。StatefulSet确保在任何时候,集群中最多只有一个具有给定标识的Pod。这就是所谓的由StatefulSet提供的*最多一个(AtMostOne)*的语义。
应谨慎进行手动强制删除操作,因为它可能会违反StatefulSet固有的至多一个的语义。StatefulSets可用于运行分布式和集群级的应用,这些应用需要稳定的网络标识和可靠的存储。这些应用通常配置为具有固定标识固定数量的成员集合。具有相同身份的多个成员可能是灾难性的,并且可能导致数据丢失(例如:票选系统中的脑裂场景)。
删除Pods

你可以使用下面的命令执行体面地删除Pod:
kubectl delete pods
为了让上面操作能够体面地终止Pod,Pod一定不能设置
pod.Spec.TerminationGracePeriodSeconds
为0。将
pod.Spec.TerminationGracePeriodSeconds
设置为0s的做法是不安全的,强烈建议StatefulSet类型的Pod不要使用。体面删除是安全的,并且会在kubelet从API
服务器
中删除资源名称之前确保体面地结束pod。
当某个节点不可达时,不会引发自动删除Pod。在无法访问的节点上运行的Pod在超时后会进入’Terminating’或者‘Unknown’状态。当用户尝试体面地删除无法访问的节点上的Pod时Pod也可能会进入这些状态。从API服务器上删除处于这些状态Pod的仅有可行方法如下:
推荐使用第一种或者第二种方法。如果确认节点已经不可用了(比如,永久断开网络、断电等),则应删除Node对象。如果节点遇到网裂问题,请尝试解决该问题或者等待其解决。当网裂愈合时,kubelet将完成Pod的删除并从API服务器上释放其名字。
通常,Pod一旦不在节点上运行,或者管理员删除了节点,系统就会完成其删除动作。你也可以通过强制删除Pod来绕过这一机制。
强制删除
强制删除不会等待来自kubelet对Pod已终止的确认消息。无论强制删除是否成功杀死了Pod,它都会立即从API服务器中释放该名字。这将让StatefulSet控制器创建一个具有相同标识的替身Pod;因而可能导致正在运行Pod的重复,并且如果所述Pod仍然可以与StatefulSet的成员通信,则将违反StatefulSet所要保证的最多一个的语义。
当你强制删除StatefulSet类型的Pod时,你要确保有问题的Pod不会再和StatefulSet管理的其他Pod通信并且可以安全地释放其名字以便创建替代Pod。
如果要使用kubectl1.5以上版本强制删除Pod,请执行下面命令:
kubectl delete pods --grace-period=0 --force
如果你使用kubectl的1.4以下版本,则应省略选项:
kubectl delete pods --grace-period=0
如果在这些命令后Pod仍处于状态,请使用以下命令从集群中删除Pod:
kubectl patch pod -p '{"metadata":{"finalizers":null}}'
请始终谨慎地执行强制删除StatefulSet类型的pods,并完全了解所涉及地风险。
Kubernetes是一个开源项目,它把谷歌的集群管理工具引入到虚拟机和裸机场景中。 它可以完美运行在现代的操作系统环境(比如CoreOS和Red Hat Atomic),并提供可以被你管控的轻量级的计算节点。 Kubernetes使用Golang开发,具有轻量化、模块化、便携以及可扩展的特点。 我们(Kubernetes开发团队)正在和一些不同的技术公司(包括维护着Mesos项目的MesoSphere)合作来把Kubernetes升级为一种与计算集群交互的标准方式。 Kubernetes重新实现了Google在构建集群应用时积累的经验。 这些概念包括如下内容:Pods:一种将容器组织在一起的方法;Replication Controllers:一种控制容器生命周期的方法(译者注:Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行);Labels:一种可以找到和查询容器的方法;Services:一个用于实现某一特定功能的容器组;因此,只要使用Kubernetes你就能够简单并快速的启动、移植并扩展集群。 在这种情况下,集群就像是类似虚拟机一样灵活的资源,它是一个逻辑运算单元。 打开它,使用它,调整它的大小,然后关闭它,就是这么快,就是这么简单。 Mesos和Kubernetes的愿景差不多,但是它们在不同的生命周期中各有不同的优势。 Mesos是分布式系统内核,它可以将不同的机器整合在一个逻辑计算机上面。 当你拥有很多的物理资源并想构建一个巨大的静态的计算集群的时候,Mesos就派上用场了。 有很多的现代化可扩展性的数据处理应用都可以在Mesos上运行,包括Hadoop、Kafka、Spark等,同时你可以通过容器技术将所有的数据处理应用都运行在一个基础的资源池中。 在某个方面来看,Mesos是一个比Kubernetes更加重量级的项目,但是得益于那些像Mesosphere一样的贡献者,Mesos正在变得更加简
发表评论