如何解决使用 `minikube start` 恢复 VM 时,如何防止 Minikube 重新部署?
暂停和恢复我的虚拟机确实会破坏 k8s 部署
当我使用 minikube stop
暂停,然后使用 minikube start
恢复虚拟机时,Minikube 会从头开始重新部署我的应用。
我在高于 v1.18 的较新版本 Minikube 上看到了这种行为(我在 v1.19 上运行)。
设置:
由于新的“恢复时重新部署行为”发生,init-container中断我的部署,如果我的代码上有正在进行的代码主机...
问题:
现在,如果我有临时/非完美运行的代码,我不能再在工作日之间暂停机器未完成的工作;因为每次我恢复它时 Minikube 都会尝试再次部署但代码损坏 并以 Init:CrashLoopBackOff
失败。
解决方法:
现在,我每次恢复机器时都需要
我能活下来,但工作流程很糟糕。
如何恢复旧行为?
- 如何让我的部署在挂起虚拟机时保持不变,而不是每次恢复时都重新部署?
解决方法
简而言之,有两种方法可以实现您想要的:
- 在当前版本的
minikube
和virtualbox
上,您可以直接在 Virtual box 中使用save state
选项。 - 将 initContianer 的代码移至单独的
job
。
关于 minikube + virtual box 的更多细节
我的环境有 minikube 版本 1.20、虚拟盒 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:将虚拟机的当前状态保存到磁盘,然后停止虚拟机。
虚拟框创建类似快照的东西,其中包含此快照中的所有内存内容。当虚拟机重新启动时,Virtual box 会将虚拟机的状态恢复到虚拟机保存时的状态。
另一个假设是,如果这在 v. 1.20 中以相同的方式工作 - 这是预期的行为而不是错误(否则它已经被修复了)
初始化容器和作业
您可以考虑将 init-container 的代码移到单独的 job
中,这样您就可以避免因意外 pod 重新启动和停止在主容器中部署而出现的任何问题。此外,建议使 init-container 的代码具有幂等性。
以下是官方文档中的引用:
因为init容器可以重新启动、重试或重新执行,
init 容器代码应该是幂等的。特别是,代码
写入 EmptyDirs
上的文件应该为这种可能性做好准备
输出文件已经存在。
这可以通过在 Kubernetes 中使用 jobs
来实现,您可以在需要时手动运行它。
为确保遵循工作流程,您可以将数据卷上的 Job completion
或特定文件检查到部署的 pod init 容器,以指示代码正在运行,部署将没问题。
包含更多信息的链接:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。