Docker Kubernetes:从ClusterIP私有注册表中提取图像?
我一直在为Kubernetes做一个设置(同时学习Kubernetes),我遇到了一个障碍,我认为我想做的事情是不可能的。此处详细介绍了我的设置: 在使用SAN生成自签名证书并配置我的注册表和设置守护程序以信任群集中所有节点上的自签名证书后,我遇到了一个新问题:Kubernetes找不到主机“docker registry” 有一个名为“docker registry”的ClusterIP服务正在运行,它指向docker注册表。当我Docker Kubernetes:从ClusterIP私有注册表中提取图像?,docker,kubernetes,docker-registry,Docker,Kubernetes,Docker Registry,我一直在为Kubernetes做一个设置(同时学习Kubernetes),我遇到了一个障碍,我认为我想做的事情是不可能的。此处详细介绍了我的设置: 在使用SAN生成自签名证书并配置我的注册表和设置守护程序以信任群集中所有节点上的自签名证书后,我遇到了一个新问题:Kubernetes找不到主机“docker registry” 有一个名为“docker registry”的ClusterIP服务正在运行,它指向docker注册表。当我kubectl exec为调试目的在集群中的pod上安装外壳时,
kubectl exec
为调试目的在集群中的pod上安装外壳时,我可以看到KubeDNS正在工作并定位此服务:
root@debug:/# ping docker-registry
PING docker-registry.default.svc.cluster.local (10.245.46.24) 56(84) bytes of data.
^C
--- docker-registry.default.svc.cluster.local ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2039ms
我假设数据包丢失是因为服务只响应端口443上的流量,而不响应ping。重要的是主机名已解析为IP地址
不过,我的问题是:这个主机名只能从集群内的pod中解析。Kubernetes本身无法访问此主机名。我定义了这样一个豆荚:
apiVersion: v1
kind: Pod
metadata:
name: test-docker
labels:
name: test
spec:
containers:
- name: test
image: docker-registry/my-ubuntu
当我尝试创建这个pod(kubectl create-f pods/test.yml
)时,我得到以下错误:
...
Failed to pull image "docker-registry/my-ubuntu": rpc error: code = Unknown desc = Error response from daemon: pull access denied for docker-registry/my-ubuntu, repository does not exist or may require 'docker login'
...
直觉上,这是有道理的。虽然其他POD可以访问主机docker注册表中的我的注册表,但Kubernetes节点不能访问,因为这不是有效的主机或在/etc/hosts
文件中定义
我尝试了一些初步的谷歌搜索,发现了以下Kubernetes文档:
这表明访问集群内运行的服务的唯一方法(如my Docker registry)是:
使用NodePort(这不好,因为它会将Docker注册表暴露给internet)
使用代理动词(我不清楚这个方法是如何工作的,也不清楚身份验证是如何处理的,但听起来好像我可以用一个长得离谱、难以记忆的URL来代替docker registry
)https:///api/v1/namespaces/default/services/docker-registry
)
如果我想要的不可能,那么我的最后一个办法(在支付Docker Hub之前)将是尝试将我的注册表公开到公共internet上,但利用Docker身份验证和pull secret(还有可能将我的注册表置于防火墙后,以阻止来自集群外部的流量)您可能需要检查该@Nirav文档,该文档描述了如何从可通过internet访问但利用Docker auth将其设置为“私有”的注册表中提取。我对运行一个无法通过互联网访问的注册表感兴趣。基本上与运行本地注册表相同,只是需要群集中的所有节点都可以访问它,而不仅仅是主节点。为什么NodePort服务会将您的注册表公开给Internet?您在哪里运行群集?@Howard_Roark群集正在DigitalOcean上运行,使用他们的托管Kubernetes服务。如果您知道节点IP地址,则可以访问位于
:
的任何节点端口服务。集群前面还有一个负载平衡器,其域名被手动配置为仅转发某些端口,负载平衡器允许30000以下的端口。因此,我通常在nodeport 30080上运行一个web服务器,然后配置负载平衡器将流量从端口80重定向到群集端口30080。然后我可以在http://example.com
@Howard_Roark Per Kubernetes自己关于使用NodePort的文档:“根据您的群集环境,这可能只是将服务公开给您的公司网络,也可能公开给internet。请考虑公开的服务是否安全。”--我确实陷入了“它可能会将其暴露在互联网上”的境地。您可能想检查一下@Nirav,该文档描述了如何从可通过互联网访问的注册表中提取,但利用Docker auth将其设置为“私有”。我对运行一个无法通过互联网访问的注册表感兴趣。基本上与运行本地注册表相同,只是需要群集中的所有节点都可以访问它,而不仅仅是主节点。为什么NodePort服务会将您的注册表公开给Internet?您在哪里运行群集?@Howard_Roark群集正在DigitalOcean上运行,使用他们的托管Kubernetes服务。如果您知道节点IP地址,则可以访问位于:
的任何节点端口服务。集群前面还有一个负载平衡器,其域名被手动配置为仅转发某些端口,负载平衡器允许30000以下的端口。因此,我通常在nodeport 30080上运行一个web服务器,然后配置负载平衡器将流量从端口80重定向到群集端口30080。然后我可以在http://example.com
@Howard_Roark Per Kubernetes自己关于使用NodePort的文档:“根据您的群集环境,这可能只是将服务公开给您的公司网络,也可能公开给internet。请考虑公开的服务是否安全。”--我肯定会陷入“它可能会暴露在互联网上”的境地