API发起的驱逐
API发起的驱逐是一个先调用EvictionAPI创建Eviction对象,再由该对象体面地中止Pod的过程。
你可以通过直接调用EvictionAPI发起驱逐,也可以通过编程的方式使用API服务器的客户端来发起驱逐,比如kubectldrain命令。此操作创建一个Eviction对象,该对象再驱动API服务器终止选定的Pod。
API发起的驱逐将遵从你的PodDisruptionBudgets和terminationGracePeriodSeconds配置。
使用API创建Eviction对象,就像对Pod执行策略控制的DELETE操作
调用EvictionAPI
你可以使用Kubernetes语言客户端来访问KubernetesAPI并创建Eviction对象。要执行此操作,你应该用POST发出要尝试的请求,类似于下面的示例:
或者,你可以通过使用curl或者wget来访问API以尝试驱逐操作,类似于以下示例:
curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json
API发起驱逐的工作原理
当你使用API来请求驱逐时,API服务器将执行准入检查,并通过以下方式之一做出响应:
如果你想驱逐的Pod不属于有PodDisruptionBudget的工作负载,API服务器总是返回200OK并且允许驱逐。
如果API服务器允许驱逐,Pod按照如下方式删除:
API服务器中的Pod资源会更新上删除时间戳,之后API服务器会认为此Pod资源将被终止。此Pod资源还会标记上配置的宽限期。 本地运行状态的Pod所处的节点上的kubelet注意到Pod资源被标记为终止,并开始优雅停止本地Pod。 当kubelet停止Pod时,控制面从Endpoint和EndpointSlice对象中移除该Pod。因此,控制器不再将此Pod视为有用对象。 Pod的宽限期到期后,kubelet强制终止本地Pod。 kubelet告诉API服务器删除Pod资源。 API服务器删除Pod资源。解决驱逐被卡住的问题
在某些情况下,你的应用可能进入中断状态,在你干预之前,驱逐API总是返回429或500。例如,如果ReplicaSet为你的应用程序创建了Pod,但新的Pod没有进入Ready状态,就会发生这种情况。在最后一个被驱逐的Pod有很长的终止宽限期的情况下,你可能也会注意到这种行为。
如果你注意到驱逐被卡住,请尝试以下解决方案之一: