Docker k8s使用服务DNS名称从私有注册表中提取映像

Docker k8s使用服务DNS名称从私有注册表中提取映像,docker,kubernetes,docker-registry,Docker,Kubernetes,Docker Registry,我在kubernetes集群中部署了一个注册表:2(在docker for win、WSL2上运行)。我为这个吊舱提供两项服务,如下所示: apiVersion:v1 种类:服务 元数据: 名称:注册表外部 规格: 类型:节点端口 选择器: 应用程序:注册表 端口: -协议:TCP 港口:5000 节点端口:32020 --- 版本:v1 种类:服务 元数据: 姓名:注册处 规格: 选择器: 应用程序:注册表 端口: -名称:http 协议:TCP 港口:2100 目标港:5000 因此,第一

我在kubernetes集群中部署了一个
注册表:2
(在docker for win、WSL2上运行)。我为这个吊舱提供两项服务,如下所示:

apiVersion:v1 种类:服务 元数据: 名称:注册表外部 规格: 类型:节点端口 选择器: 应用程序:注册表 端口: -协议:TCP 港口:5000 节点端口:32020 --- 版本:v1 种类:服务 元数据: 姓名:注册处 规格: 选择器: 应用程序:注册表 端口: -名称:http 协议:TCP 港口:2100 目标港:5000 因此,第一个用于从集群外部访问注册表(在端口32020上,因此我可以在主机上
docker login localhost:32020
),另一个用于从集群内部访问注册表(在端口2100上)

从外部登录工作正常。我已经通过集群上的
nslookup registry
验证了可以在
registry.default.svc.cluster.local
上访问注册表。因此,我创造了我的形象拉秘密

{
“授权”:{
“registry.default.svc.cluster.local:2100”:{
“授权”:“…”
},
...
}
当我尝试使用此映像部署pod时,拉取机密和映像
registry.default.svc.cluster.local:2100/animage:latest
它失败了

dial tcp: lookup registry.default.svc.cluster.local on 192.168.65.1:53: no such host

我对此感到困惑:URL在图像拉取时不应该有效吗?

这里的问题是拉取是在kubernetes群集DNS不可用的环境中执行的,即群集节点,而不是群集pod(如果kubernetes on docker for win,则在与主机相同的网络上执行)

由于注册表也通过
NodePort
服务公开,因此可以在本地主机上的
NodePort
端口32020上访问注册表。因此,需要将映像提取机密调整为

{
“授权”:{
“本地主机:32020”:{
“授权”:“…”
},
...
}

要拉取的映像将变成
localhost:32020/animage:latest

这里的问题是,拉取是在kubernetes群集DNS不可用的环境中执行的,即群集节点,而不是群集pod(如果kubernetes on docker for win,则在与主机相同的网络上执行)

由于注册表也通过
NodePort
服务公开,因此可以在本地主机上的
NodePort
端口32020上访问注册表。因此,需要将映像提取机密调整为

{
“授权”:{
“本地主机:32020”:{
“授权”:“…”
},
...
}

要拉取的映像将变成
localhost:32020/animage:latest

主机
注册表。default.svc.cluster.local
是Kubernetes DNS管理的主机名。当工作节点拉取映像时,它使用工作节点DNS。您是否尝试在工作节点上解析主机
注册表。default.svc.cluster.local
minal(不在吊舱内)。这将有助于复制该问题。我怀疑您需要为节点提供端口和主机。谢谢您的评论,@JustinTamblyn。这听起来可能是问题所在。您知道如何在docker for win上的k8s群集中的工作节点上执行nslookup吗?整个k8s设置是自动的,因此我不熟悉如何执行直接与工作节点交互。嗯。这很难。我喜欢Docker Desktop K8s,但恐怕我不知道如何在那里运行命令。我怀疑这与在桌面上运行命令是一样的?这会导致连接被拒绝,但我想这可能是因为缺少图像拉取机密。我会尝试添加它。可能会发布这篇文章s作为答案-将来可能会有人从中受益:)主机
注册表.default.svc.cluster.local
是Kubernetes DNS管理的主机名。当工作节点提取映像时,它使用工作节点DNS。您是否尝试在终端中的工作节点上解析主机
注册表.default.svc.cluster.local
(不在吊舱内)。这将有助于复制该问题。我怀疑您需要为节点提供端口和主机。谢谢您的评论,@JustinTamblyn。这听起来可能是问题所在。您知道如何在docker for win上的k8s群集中的工作节点上执行nslookup吗?整个k8s设置是自动的,因此我不熟悉如何执行直接与工作节点交互。嗯。这很难。我喜欢Docker Desktop K8s,但恐怕我不知道如何在那里运行命令。我怀疑这与在桌面上运行命令是一样的?这会导致连接被拒绝,但我想这可能是因为缺少图像拉取机密。我会尝试添加它。可能会发布这篇文章答案是:将来有人会从中受益:)