如何解决Kubernetes:从ClusterIP专用注册表中提取映像?
我一直在为Kubernetes进行设置(同时学习Kubernetes),但遇到一个障碍,我想暗示我想做的事情是不可能的。我的设置在此处进行了详细说明:Can a self-signed cert secure multiple CNs / FQDNs?
使用SAN生成自签名证书并配置注册表 ,并设置DaemonSet以信任群集中所有节点上的自签名证书后,我遇到了一个新问题: Kubernetes找不到主机“ docker-registry”
有一个名为“ docker-registry”的ClusterIP服务,它指向Docker注册表。当我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本身无法点击该主机名。我已经定义了一个像这样的pod:
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-registry
上访问我的注册表,但Kubernetes的 节点 无法因为它不是有效的主机或在/etc/hosts
文件中定义。
我尝试了一些初步的Google搜索,并找到了以下Kubernetes文档:https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-services/
这表明访问集群内部运行的服务的唯一方法(例如我的Docker注册表)是
- 使用NodePort(这不好,因为它将使我的Docker注册表暴露于互联网)
- 使用Proxy Verb(我不清楚该方法的确切工作方式或身份验证的处理方式,但是听起来我可以用一个长且难以记忆的URL替换
docker-registry
像https://<node-ip>/api/v1/namespaces/default/services/docker-registry
) - 从集群中的Pod进行访问(这不好,因为我需要Kubernetes来执行图像拉取,而我没有手动完成)
可能无法完成我想要的事情(有一个Docker注册表可用于群集中的任何节点,但 不可 可用于公共互联网),但我想在StackOverflow上询问我是否缺少任何东西。
如果我想要的 不可能,那么我的最后一招(在为Docker Hub付费之前)将是尝试将我的注册表公开给公共互联网,但要利用Docker身份验证和一个拉密(还有可能将我的注册表放在防火墙后面以阻止来自群集外部的流量)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。