Kubernetes:通过本地部署从内部注册表中提取映像

mpa*_*bo7 8 docker kubernetes

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 名称。

您可以尝试使用以下解决方案之一:

  1. 使用“docker-registry”服务描述中字段的 IP 地址ClusterIP作为 docker 注册表名称。在您重新创建服务之前,该地址是静态的。此外,您还可以将此 IP 地址添加到/etc/hosts每个节点上。

    例如,您可以将my-docker-registry 10.11.12.13行添加到/etc/hosts文件中。因此,您可以使用10.11.12.13:5000my-docker-registry:5000作为imagePod 描述中字段的 docker 注册表名称。

  2. 使用 . 在集群外部公开“docker-registry”服务type: NodePort。比使用localhost:<exposed_port><one_of_nodes_name>:<exposed_port>作为imagePod 描述中字段的 docker 注册表名称。