【问题标题】:Do locally built Docker image need to be built on every Kubernetes worker?是否需要在每个 Kubernetes worker 上构建本地构建的 Docker 镜像?
【发布时间】:2020-10-26 13:47:41
【问题描述】:

我正在从事一个个人项目,以便最终学习 Kubernetes。经过一番努力,我设法让基本的nginx Docker 映像(来自 Docker Hub)在 pod 上运行并作为 NodePort 服务公开。现在我有兴趣将nginx Docker 映像换成我自己的应用程序。

此时大多数在线教程都说“将您的映像推送到 Docker Hub”,然后您告诉 Kubernetes 从 Docker Hub 加载您的映像。但是,只要有可能,我宁愿避免对第三方服务的任何依赖(如果 5 年后 Docker Hub 出现故障,而我有一家公司的整个基础设施都依赖它呢?这是不太可能的情况,但这只是我为什么喜欢保持事物自足、孤立和独立)

我做了一些阅读,发现要加载自定义 Docker 映像没有 Docker Hub,您必须“在 Kubernetes 节点上”构建映像。但是,如果我有一个由 2 个或更多节点组成的集群怎么办?镜像是否需要在集群中的每个节点上构建?或者,如果一个人知道镜像(可能是主镜像),它能否将文件系统层传递给其他人?

我会自己尝试一下,看看会发生什么,但我可能还需要几天的时间才能知道如何尝试。我还没有弄清楚如何在我的 Kubernetes 集群中运行任意 shell 命令——我只能创建 pod、副本集、部署和服务。在深入学习如何在我的 Kubernetes 节点上构建映像的兔子洞之前,我想弄清楚这是否值得我花时间。

【问题讨论】:

  • 您需要一种机制来使图像在每个节点上都可用。它可能是一个存储库(可以是某个公共存储库,也可以是您自己托管的),否则 - 您需要自己在每个节点上构建它。 Kubernetes 根本不关心图像,它是你的 docker 守护进程。
  • 这个答案解释了如何pre-pull每个节点上的图像,并避免从注册表stackoverflow.com/questions/50671576/… 中提取图像。但我认为这是一个非常具体的用例的解决方案,最好的解决方案是部署和使用私有注册表,要么是要测试的东西 (docs.docker.com/registry/deploying),要么是企业级解决方案(有许多不同的解决方案可用)。
  • 我想说一个注册表几乎是必需的——手动将每个图像的每个版本推送到每个节点不会很好地扩展——但它并不特别需要是 Docker Hub,而且有很多替代品。

标签: docker kubernetes


【解决方案1】:

如果您的目标是不依赖注册表作为服务,如 docker hub,那么您可以按照此处的 docker 说明安装您自己的私有本地注册表:

https://docs.docker.com/registry/deploying/

然后您可以配置 Kubernetes 以从本地注册表中提取您的图像。这是我在 Google 快速搜索中找到的示例:

https://tortuemat.gitlab.io/blog/2018/03/18/kubernetes-with-local-registry/

说了这么多,我应该指出,此时 docker hub 已经成为标准,它不会很快消失。就好像 npm 或 apk 消失了

【讨论】:

  • 这可能需要一个单独的问题(或两个),但我想在我打扰之前看看你是否有一个简单的答案:Kubernetes 可以配置为从 two 中提取图像 i> 存储库(例如“主”和“备份”),如果是这样,在我与注册表一起服务的 Kubernetes 集群中运行我的私有注册表是否可行?
  • 您可以从不同的注册表中提取图像。您只需要将注册表名称与容器名称一起放在部署清单中,例如 image.registry.example/imagename。如果不输入注册表名称,则默认为 docker hub。关于你的第二个问题,很遗憾我没有尝试过这样做
猜你喜欢
  • 2018-09-28
  • 2021-04-01
  • 2017-10-20
  • 2018-12-03
  • 2020-10-06
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多