持久化卷变化:在 Kubernetes 容器中重启一个服务
Persistence volume change: Restart a service in Kubernetes container
我有一个 HTTP 应用程序 (Odoo)。此应用动态支持 install/updating 个模块(插件)。
我想 运行 这个应用程序在 Kubernetes 集群中。我想动态 install/update 模块。
这个问题我有两个解决方案。但是,我想知道是否还有其他解决方案。
方案一:
- 在 Docker 图片中包含带有应用程序的自定义模块
- 每次我在自定义模块中进行更改并将其推送到 git 存储库时。 Jinkins 拉取更改并创建新镜像,然后将新更改应用到 Kubernetes 集群。
优点:我可以管理docker镜像版本,如果有什么事可以重启镜像
缺点:这个解决方案对生产来说还不错,但是所有自定义模块存储库的列表都应该包含在 docker 文件中。假设我在其存储库中各有两个自定义模块,对其中一个的更改将导致重建整个 docker 映像。
方案二:
- 有一个只包含自定义模块的持久卷。
- 如果对自定义模块进行了更改,则会在持久卷中进行更新。
- 更改需要应用到每个 pod 运行安装应用程序(我不知道是否可以重新启动)
优点:小改动不会触发镜像构建。我们不需要每次都重新创建 pods。
缺点:控制每次更新的版本比较困难(不知道Kubernetes有没有对persistent volume的版本控制)
问题:
- 是否有其他方法可以解决这个问题?
- 对于这两种方法,都应执行一条命令以考虑模块更改
odoo --update "module_name"
。此命令应包含模块名称。对于解决方案2,如何在每个pod中执行一个命令?
- 对于解决方案 2,重启应用程序服务 (odoo) 比重启所有节点更好吗?意思是,如果我们可以在每个 pod 上执行一个命令,我们就可以重新启动应用程序的服务。
非常感谢。
您的第一个解决方案可能会更好。特别是如果您已经拥有所有工具链来重建和部署图像。您可以更轻松地回滚到以前的版本并进行故障排除(因为您确切知道每个 pod 中 运行 的版本)。
有一个替代解决方案有时用于在 Web 服务器上配置静态资产:您可以向 pod 添加一个 emptyDir 卷和一个 sidecar 容器。 sidecar 以固定的时间间隔将插件存储库中的更改拉入 emptyDir。最后,您的应用程序容器,共享相同的 emptyDir 卷将可以访问插件。
无论如何运行更新插件的命令会很复杂。您可以按固定的时间间隔执行此操作,但您的应用可能不喜欢它。
我有一个 HTTP 应用程序 (Odoo)。此应用动态支持 install/updating 个模块(插件)。
我想 运行 这个应用程序在 Kubernetes 集群中。我想动态 install/update 模块。
这个问题我有两个解决方案。但是,我想知道是否还有其他解决方案。
方案一:
- 在 Docker 图片中包含带有应用程序的自定义模块
- 每次我在自定义模块中进行更改并将其推送到 git 存储库时。 Jinkins 拉取更改并创建新镜像,然后将新更改应用到 Kubernetes 集群。
优点:我可以管理docker镜像版本,如果有什么事可以重启镜像
缺点:这个解决方案对生产来说还不错,但是所有自定义模块存储库的列表都应该包含在 docker 文件中。假设我在其存储库中各有两个自定义模块,对其中一个的更改将导致重建整个 docker 映像。
方案二:
- 有一个只包含自定义模块的持久卷。
- 如果对自定义模块进行了更改,则会在持久卷中进行更新。
- 更改需要应用到每个 pod 运行安装应用程序(我不知道是否可以重新启动)
优点:小改动不会触发镜像构建。我们不需要每次都重新创建 pods。
缺点:控制每次更新的版本比较困难(不知道Kubernetes有没有对persistent volume的版本控制)
问题:
- 是否有其他方法可以解决这个问题?
- 对于这两种方法,都应执行一条命令以考虑模块更改
odoo --update "module_name"
。此命令应包含模块名称。对于解决方案2,如何在每个pod中执行一个命令? - 对于解决方案 2,重启应用程序服务 (odoo) 比重启所有节点更好吗?意思是,如果我们可以在每个 pod 上执行一个命令,我们就可以重新启动应用程序的服务。
非常感谢。
您的第一个解决方案可能会更好。特别是如果您已经拥有所有工具链来重建和部署图像。您可以更轻松地回滚到以前的版本并进行故障排除(因为您确切知道每个 pod 中 运行 的版本)。
有一个替代解决方案有时用于在 Web 服务器上配置静态资产:您可以向 pod 添加一个 emptyDir 卷和一个 sidecar 容器。 sidecar 以固定的时间间隔将插件存储库中的更改拉入 emptyDir。最后,您的应用程序容器,共享相同的 emptyDir 卷将可以访问插件。
无论如何运行更新插件的命令会很复杂。您可以按固定的时间间隔执行此操作,但您的应用可能不喜欢它。