【问题标题】:How to prevent Minikube to redeploy, when resuming the VM with `minikube start`?使用“minikube start”恢复 VM 时,如何防止 Minikube 重新部署?
【发布时间】:2021-08-13 21:12:15
【问题描述】:

暂停和恢复我的虚拟机确实会破坏 k8s 部署

当我使用 minikube stop 暂停,然后使用 minikube start 恢复虚拟机时,Minikube 会从头开始重新部署我的应用程序。

我在高于 v1.18 的新版 Minikube 中看到了这种行为(我在 v1.19 上运行)。


设置:

  • Kubernetes 部署通过hostPath 使用我的主机中的源代码安装一个卷。\
  • 我还有一个initContainers 的容器来设置应用程序。

由于发生了新的“恢复时重新部署行为”,init-container 中断了我的部署,如果我的代码中有工作中的代码主机..

问题:

现在,如果我有临时/非完美运行的代码,我不能再在工作日之间暂停未完成工作的机器;因为每次我恢复它时Minikube 都会尝试再次部署,但代码损坏并以Init:CrashLoopBackOff 失败。

解决方法:

现在,每次我需要恢复机器时

  1. 存储/提交我的 WIP 代码
  2. 使用有效部署检查最后一次提交
  3. 运行部署并等待它完成初始化(分钟...)
  4. checkout/stash-pop 保存在 1) 处的代码。

我可以活下来,但工作流程很糟糕。

如何恢复旧行为?

  • 如何让我的部署在暂停 VM 时按预期保持不变,而不是每次恢复时都重新部署?

【问题讨论】:

  • 您能描述一下您使用的操作系统吗? minikube 到底是如何设置的?它使用哪个驱动程序?自从您能够minikube stop and start 之后,您的环境发生了哪些变化,并且它对您没有任何问题?
  • 详细信息在标签(MacOS 和 VirtualBox 驱动程序)和问题中。 Minikube 设置是默认设置(加上 ingress-addon)。在我的环境中,我只从 1.18 升级到 1.19
  • 我想确保 minikube 使用 VritualBox 而不是 dockerHyperKit。你用minikube start --driver=virtualbox 开始minikube 吗?另请检查两个或一个配置文件中实际使用的驱动程序:~/.minikube/profiles/minikube/config.json 和/或~/.minikube/machines/minikube/config.json
  • Virtualbox 无处不在。

标签: macos kubernetes deployment virtualbox minikube


【解决方案1】:

简而言之,有两种方法可以实现您想要的:

  • 在当前版本的minikubevirtualbox 上,您可以直接在虚拟框中使用save state 选项。
  • 将 initContianer 的代码移至单独的 job

更多关于 minikube + 虚拟盒子的细节

我有一个带有 minikube 版本 1.20、virtual box 6.1.22(从昨天开始)和 MacOS 的环境。 minikube驱动也设置为virtualbox

首先是minikube + VirtualBox。不同的场景:

minikube stop 执行以下操作:

停止本地 Kubernetes 集群。此命令停止底层 VM 或容器,但保持用户数据完整。

设置 minikube 的虚拟机会完全停止。 minikube start 启动 VM 和其中的所有进程。所有容器也都启动了,所以如果你的 pod 有一个 init-container,它无论如何都会首先运行。

minikube pause 暂停所有进程并释放 CPU 资源,同时仍将分配内存。 minikube unpause 收回 CPU 资源并从暂停状态继续执行容器。

基于我尝试使用 minikube 的不同场景,仅使用 minikube 命令是无法实现的。为避免由于主机重新启动或需要停止 VM 以获取更多资源而导致 minikube 环境中的任何状态丢失,您可以在 UI 或 cli 中使用 VirtualBox 中的 save state 功能。下面是它的作用:

VBoxManage controlvm savestate:将VM的当前状态保存到磁盘,然后停止VM。

虚拟盒子创建类似快照的东西,其中所有内存内容都包含在此快照中。虚拟机重启后,Virtual box会将虚拟机的状态恢复到保存虚拟机时的状态。

另一个假设是,如果这在 1.20 版中以相同的方式工作 - 这是预期的行为,而不是错误(否则它已经被修复)

初始化容器和作业

您可以考虑将您的 init-container 的代码移动到一个单独的 job,这样您就可以避免任何与意外 pod 重新启动和在主容器中停止部署有关的问题。此外,建议让 init-container 的代码具有幂等性。 这是官方文档的引述:

因为初始化容器可以重新启动、重试或重新执行, 初始化容器代码应该是幂等的。特别是,代码 写入EmptyDirs 上的文件应该为这种可能性做好准备 输出文件已经存在。

这可以通过在 Kubernetes 中使用 jobs 来实现,您可以在需要时手动运行它。 为确保遵循工作流程,您可以检查 Job completion 或数据卷上的特定文件到部署的 pod init 容器,以表明代码正在运行,部署会很好。

更多信息的链接:

【讨论】:

  • 还没有。我仍然想知道是什么让我的集群的行为发生了变化:在我没有经历这种重新初始化之前。然而,鉴于@moonkotte 的良好解释,我认为将操作从initContainer 转移到K8S Job 更有意义,因为我对第一个操作的理解不准确。
猜你喜欢
  • 2019-02-16
  • 2020-09-09
  • 2021-04-15
  • 2017-11-22
  • 2019-01-05
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多