tl;drPod当镜像来自托管在同一 k8s 集群上的私有 docker 注册表且没有单独的注册表 DNS 条目时,如何在 Kubernetes 中引用该镜像?
在本地 Kubernetes 部署中,我使用stable/docker-registry helm 图表和自签名证书设置了一个私有 Docker 注册表。这是本地部署的,我无法设置 DNS 记录来为注册表提供其自己的 URL。我希望使用这些清单作为模板,因此我不想对任何特定于环境的配置进行硬编码。
docker 注册表服务的类型ClusterIP如下所示:
apiVersion: v1
kind: Service
metadata:
name: docker-registry
labels:
app: docker-registry
spec:
type: ClusterIP
ports:
- port: 443
protocol: TCP
name: registry
targetPort: 5000
selector:
app: docker-registry
Run Code Online (Sandbox Code Playgroud)
如果我手动将图像推送到此注册表(或将来通过 Jenkins 构建管道),我将如何在规范中引用该图像Pod?
我努力了:
containers:
- name: my-image
image: docker-registry.devops.svc.cluster.local/my-image:latest
imagePullPolicy: IfNotPresent
Run Code Online (Sandbox Code Playgroud)
但我收到了有关节点主机无法解析的错误docker-registry.devops.svc.cluster.local。我认为 k8s 节点上的 Docker 守护进程无法解析该 URL,因为它是内部 k8s DNS 记录。
Warning Failed 20s (x2 over 34s) kubelet, ciabdev01-node3
Failed to pull image "docker-registry.devops.svc.cluster.local/hadoop-datanode:2.7.3":
rpc error: code = Unknown desc = Error response from daemon: Get https://docker-registry.devops.svc.cluster.local/v2/: dial tcp: lookup docker-registry.devops.svc.cluster.local: no such host
Warning Failed 20s (x2 over 34s) kubelet, node3 Error: ErrImagePull
Run Code Online (Sandbox Code Playgroud)
那么,在这个本地场景中,我如何引用内部托管的 docker 注册表上的图像呢?
我唯一的选择是使用 类型的服务NodePort,在规范中引用节点的主机名之一Pod,然后配置每个节点的 docker 守护进程以忽略自签名证书?
Art*_*aev 11
Docker 使用节点上配置的 DNS 设置,默认情况下,它不会看到 Kubernetes 集群中声明的 DNS 名称。
您可以尝试使用以下解决方案之一:
使用“docker-registry”服务描述中字段的 IP 地址ClusterIP作为 docker 注册表名称。在您重新创建服务之前,该地址是静态的。此外,您还可以将此 IP 地址添加到/etc/hosts每个节点上。
例如,您可以将my-docker-registry 10.11.12.13行添加到/etc/hosts文件中。因此,您可以使用10.11.12.13:5000或my-docker-registry:5000作为imagePod 描述中字段的 docker 注册表名称。
使用 . 在集群外部公开“docker-registry”服务type: NodePort。比使用localhost:<exposed_port>或<one_of_nodes_name>:<exposed_port>作为imagePod 描述中字段的 docker 注册表名称。
| 归档时间: |
|
| 查看次数: |
3520 次 |
| 最近记录: |