如何在Kubernetes中回收Pod

时间:2018-12-22 19:01:22

标签: kubernetes kubectl kubernetes-pod

我希望在某些时间段(例如每周或每月)之后,从我的部署中正常回收Pod。我知道如果知道Kubernetes命令,可以为此添加cron作业。

问题是在Kubernetes中执行此操作的最佳方法是什么?哪个命令可以让我实现这个目标?

非常感谢您帮助我解决这个问题。

5 个答案:

答案 0 :(得分:2)

您应该通过Deployment或StatefulSet之类的更高级别的控制器来管理Pod。如果这样做,并且更改了嵌入式Pod规范的任何详细信息,Deployment / StatefulSet / ...将为您重新启动所有Pod。可能最简单的方法是在pod规范中添加注释,说明上次部署的时间:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      annotations:
        deployed-at: 20181222

可能有一个kubectl patch单行代码可以做到这一点;如果您使用的是之类的Deployment Manager,则只需将当前日期作为“值”(配置字段)传递,并为您注入它即可。

但是,如果您想做得更大一点:各种基础映像通常都会进行安全性更新和较小的错误修复,并且如果您每月docker pull ubuntu:18.04一次左右,那么您将获得这些更新。如果您积极地知道无论如何都要每月重新启动Pod,并且您已经建立了良好的CI / CD管道,请考虑在Jenkins或任何可以重建和重新部署所有内容的工作中进行设置,即使其中没​​有任何更改。基础源代码树。这将导致image:得到更新,这将导致所有吊舱都被销毁并重新创建。 您将始终在安全性更新方面保持最新。< / p>

答案 1 :(得分:1)

由于OP rayhan具有found out,并且正如kubernetes/kubernetes issue 13488中所述,环境变量的kubectl补丁就足够了。

但是... K8s 1.15将带来kubectl rollout restart ...,即PR 77423被接受并合并。

  

kubectl rollout restart现在可用于守护程序集和状态集。

答案 2 :(得分:0)

如果您需要手动重新启动Pod,则可以运行

'kubectl get pods | grep somename | awk'{print $ 1}'| xargs -i sh -c'kubectl delete pod -o name {} && sleep 4'

根据KIVagant在https://github.com/kubernetes/kubernetes/issues/13488#issuecomment-372456851

中建议的基于计时器的作业(例如,来自您的CI系统)

该GitHub线程揭示了目前还没有唯一的最佳方法,并且人们在提出不同的建议。我提到这是因为它最接近您的建议,是您必须这样做的简单解决方案。通常同意的是,您应该尝试避免重新启动作业,并使用探针以确保不正常的Pod自动重新启动。

定期升级(相对于重新启动)非常好,尤其是滚动升级时。但是,如果这样做,请注意所有升级都不会掩盖问题。如果您的Pod内存泄漏或长时间运行耗尽了连接池,那么您想尝试让不健康的Pod报告为不健康-既可以自动重新启动它们,又可以帮助您监视代码问题并解决。

答案 3 :(得分:0)

您永远不会手动回收容器,这是使用kuberentes的明显反模式。

选项:

  • 在kubectl apply -f --prune

  • 中使用描述性格式
  • 使用CI / CD工具,例如Gitlab或Spinakar

  • 使用Ksonnet

  • 使用Knative

  • 编写自己的自动化CI / CD工具

答案 4 :(得分:0)

到目前为止,我发现以下一行命令可以很好地达到我的目的。成功构建后,我将从Jenkins运行它。

kubectl patch deployment {deployment_name} -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"