镜像仓库
使用私有镜像仓库
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-creds 和 minikube 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 VM 上配置访问权限,可以将 .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 插件将其端口 5000 暴露在 minikube 的虚拟机上。
为了让 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 插件将其端口 80 暴露在 minikube 的虚拟机上。你可以通过以下方式确认
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 registry 服务上的端口 80。不幸的是,docker vm 无法直接看到 minikube vm 的 IP 地址。要解决此问题,你需要添加另一层重定向。
使用 kubectl port-forward 将本地工作站映射到 minikube vm
kubectl port-forward --namespace kube-system service/registry 5000:80
在本地机器上,你现在应该能够使用 curl https://:5000/v2/_catalog 访问 minikube registry
从这一点开始,我们可以(滥用)docker 的网络配置,在 docker 的主机上实例化一个容器,并在那里运行 socat,将流向 docker vm 端口 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 registry
docker tag my/image localhost:5000/myimage
docker push localhost:5000/myimage
镜像推送后,在 kubectl 规范中通过 localhost:5000/{name} 引用它。