镜像仓库

如何与镜像仓库交互

使用私有镜像仓库

GCR/ECR/ACR/Docker: minikube 有一个插件 registry-creds,它将凭据映射到 minikube 中,以支持从 Google Container Registry (GCR)、Amazon 的 EC2 Container Registry (ECR)、Azure Container Registry (ACR) 和私有 Docker 镜像仓库拉取镜像。 您需要运行 minikube addons configure registry-credsminikube addons enable registry-creds 才能启动并运行。下面是一个示例:

$ minikube addons configure registry-creds
Do you want to enable AWS Elastic Container Registry? [y/n]: n

Do you want to enable Google Container Registry? [y/n]: y
-- Enter path to credentials (e.g. /home/user/.config/gcloud/application_default_credentials.json):/home/user/.config/gcloud/application_default_credentials.json

Do you want to enable Docker Registry? [y/n]: n

Do you want to enable Azure Container Registry? [y/n]: n
registry-creds was successfully configured
$ minikube addons enable registry-creds

Google Artifact Registry: minikube 有一个插件 gcp-auth,它将凭据映射到 minikube 中,以支持从 Google Artifact Registry 拉取镜像。 运行 minikube addons enable gcp-auth 来配置身份验证。 您可以参考完整的文档此处

有关私有容器镜像仓库的更多信息,请参阅此页面

我们建议您使用ImagePullSecrets,但如果您想在 minikube 虚拟机上配置访问权限,您可以将 .dockercfg 放在 /home/docker 目录中,或将 config.json 放在 /var/lib/kubelet 目录中。请确保使用 sudo systemctl restart kubelet 重新启动您的 kubelet(对于 kubeadm)进程。

启用不安全的镜像仓库

minikube 允许用户配置 docker 引擎的 --insecure-registry 标志。

您可以在 minikube start 命令中使用 --insecure-registry 标志,以启用 docker 引擎和监听来自 CIDR 范围请求的镜像仓库之间的不安全通信。

一种巧妙的方法是允许在 minikube 中运行的 kubelet 与部署在集群内部的 pod 中的镜像仓库进行通信,而无需使用 TLS 证书。由于默认的服务集群 IP 可在 10.0.0.1 上使用,用户可以通过使用 minikube start --insecure-registry "10.0.0.0/24" 创建集群,从部署在集群内部的镜像仓库中拉取镜像。请确保在使用 --insecure-registry 标志启动之前使用 minikube delete 删除集群。

macOS 上的 Docker

快速指南,用于在 macOS 上配置 minikube 和 docker,使 docker 能够将镜像推送到 minikube 的镜像仓库。

第一步是启用 registry 插件

minikube addons enable registry

注意:Minikube 将生成一个端口,并在启用 registry 时请求您使用该端口。该说明与本指南无关。

启用后,registry 插件会在 minikube 的虚拟机上公开其端口 5000。

为了使 docker 接受将镜像推送到此镜像仓库,我们必须将 docker 虚拟机上的端口 5000 重定向到 minikube 机器上的端口 5000。我们可以(滥用)docker 的网络配置,在 docker 的主机上实例化一个容器,并在那里运行 socat

docker run --rm -it --network=host alpine ash -c "apk add socat && socat TCP-LISTEN:5000,reuseaddr,fork TCP:$(minikube ip):5000"

一旦 socat 运行,就可以将镜像推送到 minikube 镜像仓库

docker tag my/image localhost:5000/myimage
docker push localhost:5000/myimage

推送镜像后,在 kubectl 规范中通过 localhost:5000/{name} 引用它。

Windows 上的 Docker

快速指南,用于在 Windows 上配置 minikube 和 docker,使 docker 能够将镜像推送到 minikube 的镜像仓库。

第一步是启用 registry 插件

minikube addons enable registry

启用后,registry 插件会在 minikube 的虚拟机上公开其端口 80。您可以通过以下方式确认:

kubectl get service --namespace kube-system
> NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
> kube-dns   ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP   54m
> registry   ClusterIP   10.98.34.133   <none>        80/TCP,443/TCP           37m

为了使 docker 接受将镜像推送到此镜像仓库,我们必须将 docker 虚拟机上的端口 5000 重定向到 minikube 镜像仓库服务上的端口 80。不幸的是,docker 虚拟机无法直接看到 minikube 虚拟机的 IP 地址。要解决此问题,您必须添加一个额外的重定向级别。

使用 kubectl port-forward 将您的本地工作站映射到 minikube 虚拟机

kubectl port-forward --namespace kube-system service/registry 5000:80

现在,在您的本地机器上,您应该能够使用 curl http://localhost:5000/v2/_catalog 访问 minikube 镜像仓库

从这一点开始,我们可以(滥用)docker 的网络配置,在 docker 的主机上实例化一个容器,并在那里运行 socat,将 docker 虚拟机的端口 5000 的流量重定向到您主机工作站上的端口 5000。

docker run --rm -it --network=host alpine ash -c "apk add socat && socat TCP-LISTEN:5000,reuseaddr,fork TCP:host.docker.internal:5000"

一旦 socat 运行,就可以从您的本地工作站将镜像推送到 minikube 镜像仓库

docker tag my/image localhost:5000/myimage
docker push localhost:5000/myimage

推送镜像后,在 kubectl 规范中通过 localhost:5000/{name} 引用它。