自从我开始使用 docker 之后,我就有一个问题,到目前为止我还没有得到一个好的答案。
假设我有一个指定 k8s 部署的 .yaml 文件。我们正在本地构建服务器上构建我们的 docker 镜像,它们被推送到本地注册表,例如 registry.mycompany.com,它只能在我们本地公司网络中访问。因此,在我的 .yaml 中,我将使用“image:registry.mycompany.com/myrepo/myimage:1.0”引用该图像。
现在,当我在本地 k8s 集群上部署它时,它可以正常工作,因为域名得到解析并且可以拉取图像。现在我想在任何云中部署相同的内容。好吧,它不会工作,因为注册表不可用。如果我想在我的一个客户位置部署相同的 .yaml 也是如此,他们也有充分的理由无法访问我的本地注册表。
这种事情一般是怎么解决的?现在,我在我的客户或云帐户中设置另一个注册表,重新标记我的所有图像并将它们推送到该注册表,并且当我在客户位置或云中部署时更改 .yamls 中的所有图像引用。因此,必须维护大量 99% 相同的文件集。那不是它应该如何工作吗?
我的“愿望”是我可以只指定图像名称和标签“myimage:1.0”,如果他能找到图像并拉取它,k8s 集群只会检查所有可用的注册表。但我也知道没有“知名注册表列表”,您可以在映像名称中指定注册表或将其省略,然后将查询 docker hub。但是,如果我可以指定只是
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: MyDeployment
spec:
replicas: 1
template:
metadata:
labels:
app: myimage
spec:
containers:
- name: myimage
image: 'myimage:1.0'
ports: []
和注册表列表:
registries:
- registry.mycompany.com
- registry.cloud.com
- registry.localcustomer.com
但没有那样的事,对吧?
我能想到的唯一其他解决方案是将所有内容构建到 helm 图表中,使图像的第一部分引用一个变量并将注册表作为变量传递给图表。
欢迎任何想法和信息。提前致谢 :)
有一些解决方法可以达到您在问题中描述的结果:
头盔图
正如你在问题中所说:
从主观上讲,这是为
Deployment
.它的示例可能如下所示:
deployment.yaml
:a 中的值
template
可以通过以下方式提供:values.yaml
文件:$ helm
命令如:$ helm install ubuntu . --set=image.repo=eu.gcr.io/
自定义
您还可以使用它们各自的存储库和图像
kustomize
来“渲染” 。Deployment
在下面的博客文章中有关于如何完成的相当广泛的解释:
这种解决方案的示例(通过以下链接)可以归结为:
deployment.yaml
custom-image.yaml
kustomization.yaml
运行上述示例后:
kustomize build
您应该看到图像的变化:
image: foo/bar:latest
image: eu.gcr.io/ubuntu:latest
您还可以查看此 StackOverflow 答案:
登记处
您还可以查看注册表项目,例如Harbor。
你可以在他们的 github 页面上阅读:
有了它,您可以:
除此之外,您还可以查看 Docker Registry 代理,如下所示:
其他资源: