每当Pod重新启动时,我都会一次又一次下载并安装软件包,因此如何使它自动化。 我希望Pod在Pod重新启动时自动安装或下载软件包。如何在Kubernetes中进行安装?
答案 0 :(得分:2)
选项1(最佳做法):
如果要在程序包启动时将其下载并安装到Pod内的容器中,则必须使用Dockerfile
指令将这些下载和安装说明添加到RUN
中。 / p>
如果您使用的是公共映像,而不是您自己的自定义映像,那么您将要创建一个Dockerfile
并将该公共映像用作基础映像来创建并推送您自己的自定义Docker映像到图像存储库。您可以通过添加FROM
指令作为Dockerfile的第一行来实现。
关于如何使用Dockerfile构建映像并将其推送到Kubernetes使用的存储库中,有大量教程。这是Docker的官方documentation,解释了上述指令以及创建Dockerfile,将它们构建到Docker映像并将它们推送到Docker Hub之类的映像存储库中所需的其他知识。
简而言之,您将得到一个看起来像这样的Dockerfile,该文件添加了将软件包下载并将其安装到基本映像的说明:
FROM <base image (i.e. the image you’re currently using)>
RUN <download command>
RUN <install command>
链接的文档告诉您如何构建Docker映像并将其推送到存储库,然后只需更新Pod清单中的image
字段即可。
现在,只要您的Pod重新启动,便已经安装了软件包。
选项2(不建议使用反模式):
警告:之所以加入此选项,是因为OP不想使用选项1,所以我提供了一种可能的理论选择。
您可以使用初始化容器来完成此操作。初始化容器需要为您的应用容器下载并安装软件包,然后将其放入由初始化容器和应用容器共享的已安装emptyDir
volume中。可以使用init容器中的command
属性来完成此工作。
运行init容器后,您的应用容器可以通过已安装的共享emptyDir
卷访问该软件包。
More about sharing data between containers。
出于这种反模式的原因,我想起了很多原因:
这会减慢Pod的启动时间。
您的emptyDir
卷是可变的,如果您以某种方式删除或破坏了该程序包,并且您的应用容器(而非Pod)崩溃,则您的Pod将会崩溃,因为您的初始化容器仅在Pod重新启动时运行,不会重新启动容器。
它不必要地使您的Pod清单复杂化。
答案 1 :(得分:1)
吊舱应该完整-不需要下载和安装软件包。实际上,您实际上是在尝试在Pod启动期间执行“构建步骤”,这几乎可以肯定是一种反模式。
如果您使用的映像不包含软件包,则应构建自己的映像并将其部署到Docker注册表或寻找包含所需软件包的其他Docker映像。
ericstaples在解释如何滚动自己的docker映像并将其推送到docker存储库方面做得很好。
如果您编辑问题并提供当前使用的图像repo:tag以及要安装的软件包,则可能会得到更好的答复。