Kubernetes:从ClusterIP专用注册表中提取映像?

时间:2020-11-03 14:49:07

标签: docker kubernetes docker-registry

我一直在为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注册表)是

  1. 使用NodePort(这不好,因为它将使我的Docker注册表暴露于互联网)
  2. 使用Proxy Verb(我不清楚该方法的确切工作方式或身份验证的处理方式,但是听起来我可以用一个长且难以记忆的URL替换docker-registryhttps://<node-ip>/api/v1/namespaces/default/services/docker-registry
  3. 从集群中的Pod进行访问(这不好,因为我需要Kubernetes来执行图像拉取,而我没有手动完成)

可能无法完成我想要的事情(有一个Docker注册表可用于群集中的任何节点,但 不可 可用于公共互联网),但我想在StackOverflow上询问我是否缺少任何东西。

如果我想要的 不可能,那么我的最后一招(在为Docker Hub付费之前)将是尝试将我的注册表公开给公共互联网,但要利用Docker身份验证和一个拉密(还有可能将我的注册表放在防火墙后面以阻止来自群集外部的流量)

0 个答案:

没有答案