Kubernetes上的私有Docker注册表

时间:2019-04-13 00:54:32

标签: kubernetes docker-registry

我正在尝试使用官方Docker镜像在Kubernetes上部署私有Docker注册表。但是,我在部署时收到一些警告,并且也无法在pod中访问它。

注册表容器的输出:

time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_PORT" 
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_PORT_5000_TCP"  
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_PORT_5000_TCP_ADDR" 
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_PORT_5000_TCP_PORT" 
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_PORT_5000_TCP_PROTO" 
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_SERVICE_HOST" 
time="2019-04-12T18:40:21Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_SERVICE_PORT" 
time="2019-04-12T18:40:21.145278902Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.11.2 instance.id=988660e4-d4b9-4d21-a42e-c60c82d00a73 service=registry version=v2.7.1 
time="2019-04-12T18:40:21.145343563Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=988660e4-d4b9-4d21-a42e-c60c82d00a73 service=registry version=v2.7.1 
time="2019-04-12T18:40:21.149771291Z" level=info msg="Starting upload purge in 2m0s" go.version=go1.11.2 instance.id=988660e4-d4b9-4d21-a42e-c60c82d00a73 service=registry version=v2.7.1 
time="2019-04-12T18:40:21.163063574Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=988660e4-d4b9-4d21-a42e-c60c82d00a73 service=registry version=v2.7.1 
time="2019-04-12T18:40:21.163689856Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=988660e4-d4b9-4d21-a42e-c60c82d00a73 service=registry version=v2.7.1 

在Kubernetes上部署的yaml文件:

104 apiVersion: extensions/v1beta1
105 kind: Deployment
106 metadata:
107   name: registry
108   namespace: docker
109 spec:
110   replicas: 1
111   template:
112     metadata:
113       labels:
114         name: registry
115     spec:
116       containers:
117       - resources:
118         name: registry
119         image: registry:2
120         ports:
121         - containerPort: 5000
122         volumeMounts:
123         - mountPath: /var/lib/registry
124           name: images
140       volumes:
141       - name: images
142         hostPath:
143           path: /mnt/nfs/docker-local-registry/images
150       nodeSelector:
151         name: master
152 ---
153 apiVersion: v1
154 kind: Service
155 metadata:
156   name: registry
157   namespace: docker
158 spec:
159   ports:
160   - port: 5000
161     targetPort: 5000
162   selector:
163     name: registry

即使我忽略这些警告,也无法使用registry.docker:5000/image_nameregistry.docker.svc.cluster.local/image_name访问pod级别的注册表,因为无法解析主机。我不想公开注册表。我想要的是能够使吊舱从那里拉出图像。

2 个答案:

答案 0 :(得分:2)

不确定,我完全了解您的用例,但是如果您要启动基于内部注册表提供的映像的Pod,那么一定要了解,不是Pod,而是集群节点上的dockerd拉图像。内部DNS名称(例如* svc.cluster.local)无法在此处解析。至少在许多K8s环境中都是这种情况。 有人在这里讨论此问题:https://github.com/knative/serving/issues/1996 如果发布您正在使用的Kubernetes提供程序(GKE,EKS等),可能会有所帮助。 解决方案是配置群集节点以解析这些名称,或使用入口在外部公开注册表。

答案 1 :(得分:0)

好像您将注册表映像打包到部署中而不检查要求。使用您的部署,我遇到了同样的错误。经过一段时间尝试正确打包并在docker hub上阅读requirements。该图像需要一些其他设置。您需要存储htpasswd,为HTPASSWD创建证书并为图像创建目录。另外,您将需要指定env var并在容器中创建相应的路径。

REGISTRY_AUTH 
REGISTRY_AUTH_HTPASSWD_REALM 
REGISTRY_AUTH_HTPASSWD_PATH 
REGISTRY_HTTP_TLS_CERTIFICATE 
REGISTRY_HTTP_TLS_KEY

这是我使用并成功部署了注册表的tutorial。如果您有问题,请更新问题,我们将尽力提供帮助。同样,这种媒介article可以为您提供一些想法(但是请注意,因为docker compose文件需要进行一些编辑,因为它不能以本文中发布的形式起作用)。