我一直在为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注册表)是
docker-registry
像https://<node-ip>/api/v1/namespaces/default/services/docker-registry
)可能无法完成我想要的事情(有一个Docker注册表可用于群集中的任何节点,但 不可 可用于公共互联网),但我想在StackOverflow上询问我是否缺少任何东西。
如果我想要的 不可能,那么我的最后一招(在为Docker Hub付费之前)将是尝试将我的注册表公开给公共互联网,但要利用Docker身份验证和一个拉密(还有可能将我的注册表放在防火墙后面以阻止来自群集外部的流量)