如何在 Kubernetes 中回收 pod

问题描述 投票:0回答:5

我希望我的 pod 在一定时间(例如每周或每月)后能够从我的部署中优雅地回收。我知道如果我知道 Kubernetes 命令,我可以为此添加一个 cron 作业。

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

非常感谢您在这件事上帮助我。

kubernetes kubectl kubernetes-pod
5个回答
5
投票

正如 OP rayhan 发现,并且如

kubernetes/kubernetes
问题 13488 中所述,环境变量的 kubectl 补丁就足够了。

但是...K8s 1.15 将带来

kubectl rollout restart
...那就是 PR 77423 被接受并合并。

kubectl rollout restart
现在适用于守护进程集和状态集。


4
投票

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

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

可能有一个

kubectl patch
的单行代码可以做到这一点;如果您使用像 这样的部署管理器,那么您只需将当前日期作为“值”(配置字段)传递并为您注入即可。

但是,如果您想考虑更大:各种基础映像通常都会有安全更新和小错误修复,并且如果您每月一次左右

docker pull ubuntu:18.04
,您将获得这些更新。如果你主动知道你想每月重新启动你的 pod,并且你已经设置了良好的 CI/CD 管道,请考虑在 Jenkins 中设置一个预定作业或任何重建和重新部署所有内容的作业,即使没有任何更改底层源代码树。这将导致
image:
得到更新,这将导致所有 Pod 被销毁并重新创建,并且您将始终获得最新的安全更新。


2
投票

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

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

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 将自己报告为不健康 - 既因为它们可以自动重新启动,也因为它将帮助您监控代码问题并解决它们。


-1
投票

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

选项:

  • 通过 kubectl apply -f --prune 使用声明式格式

  • 使用 CI/CD 工具,例如 Gitlab 或 Spinakar

  • 使用Ksonnet

  • 使用 Knative

  • 编写您自己的 CI/CD 工具来实现自动化

© www.soinside.com 2019 - 2024. All rights reserved.