如何防止 Minikube 在使用"minikube start"恢复 VM 时重新部署?



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

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

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

<小时 />

设置:

  • Kubernetes部署通过hostPath.\ 从我的主机挂载一个包含源代码的卷
  • 此外,我还有一个用于设置应用程序的initContainers容器。

由于发生了新的"恢复时重新部署行为">如果我的主机上有正在进行的代码,初始化容器会中断我的部署

问题:

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

解决方法:

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

  1. 存储/提交我的 WIP 代码
  2. 使用工作部署签出上次提交
  3. 运行部署并等待它完成初始化(分钟...
  4. 结帐/存储-弹出保存在第1点的代码)。

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

如何恢复旧行为?

  • 如何使部署保持不变,如挂起 VM 时所预期的那样,而不是每次恢复时都重新部署?

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

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

有关迷你库贝+虚拟盒子的更多详细信息

我有一个带有minikube版本1.20,虚拟盒子6.1.22(从昨天开始)和MacOS的环境。此外,minikube驱动程序设置为virtualbox

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

minikube stop执行以下操作:

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

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

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

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

VBox管理控制虚拟机保存:将虚拟机的当前状态保存到磁盘,然后停止虚拟机。

Virtual box 创建类似快照的内容,其中包含此快照中的所有内存内容。重新启动虚拟机时,Virtual box 会将 VM 的状态还原到保存 VM 时的状态。

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

初始化容器和作业

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

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

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

包含更多信息的链接:

  • 虚拟盒子save state

  • 初始化容器

  • Kubernetes 职位

最新更新