使用Minikube时无法从私有仓库拉取Docker镜像

12

我正在尝试使用Minikube进行本地的Kubernetes开发。如建议所述,我已经设置了我的Docker环境,以便使用提供的Minikube VM(boot2docker)中运行的docker守护进程。

eval $(minikube docker-env)

它设置了这些环境变量:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/jasonwhite/.minikube/certs"

当我尝试从我们的私有 docker 仓库拉取镜像时:

docker pull oururl.com:5000/myimage:v1

我收到了这个错误:

Error response from daemon: Get https://oururl.com:5000/v1/_ping: x509: certificate signed by unknown authority

看起来我需要以某种方式添加可信的CA根证书,但是迄今为止我的尝试都没有成功。

使用我们的CA根证书,我可以通过curl顺利访问存储库:

curl --cacert /etc/ssl/ca/ca.pem https://oururl.com:5000/v1/_ping

你是想在本地机器上拉取镜像,还是想创建一个 Kubernetes Pod,可以从 VM 内部拉取镜像? - springle
当我尝试创建一个需要从私有仓库拉取镜像以创建的Pod时,我首次遇到了这个问题,因此在运行时VM尝试拉取镜像时遇到了无法验证x509证书的问题。 - Jason White
8个回答

4

我一直找不到将证书传递到minikube虚拟机的方法。不过,minikube有一个命令行参数可以传递一个不安全的镜像仓库。

minikube start --insecure-registry=<HOST>:5000 

然后,在注册表上配置身份验证,创建一个密钥。

kubectl create secret docker-registry tp-registry --docker-server=<REGISTRY>:5000 --docker-username=<USERNAME> --docker-password=<PASSWORD> --docker-email=<EMAIL> --insecure-skip-tls-verify=true

按照Kubernetes文档所述,将密钥添加到默认服务帐户中。


这个方法很好,但是我必须先运行 minikube delete。如果机器已经存在(即使它已经停止),--insecure-registry 标志将被忽略。如果您想要新的标志生效,您必须首先运行 minikube delete - heez

3

我结合以下资源的建议,想出了一个解决方法:

https://github.com/docker/machine/issues/1799

https://github.com/docker/machine/issues/1872

我登录到Minikube虚拟机(minikube ssh),并编辑了/usr/local/etc/ssl/certs/ca-certificates.crt文件,将我的CA证书追加在文件末尾。

然后,在虚拟机内部重新启动docker守护进程:sudo /etc/init.d/docker restart

这种方法不太优雅,因为如果我重新启动Minikube虚拟机,每次都需要重复这些手动步骤。

作为另一种选择,我还尝试在DOCKER_OPTS环境变量中设置--insecure-registry myurl.com:5000选项(重新启动了docker),但这对我没有起作用。


1
现在您可以使用 minikube start --insecure-registry='<registry_url>' 但您需要首先运行 minikube delete 以获得新的集群。 - KyleHodgetts

3
最近,Minikube添加了一个插件,使得访问私有容器注册表更加容易:

(链接)


minikube addons configure registry-creds
minikube addons enable registry-creds

1
对于http注册表,这些步骤适用于我:
1)minikube ssh 2)编辑/var/lib/boot2docker/profile并将--insecure-registry yourdomain.com:5000添加到$EXTRA_ARGS
3)重启docker守护进程sudo /etc/init.d/docker restart

0

关于此问题,Kubernetes的文档非常好。

根据您的私有Docker仓库托管位置,解决方案会有所不同。文档详细说明了如何处理每种类型的仓库。

如果您想要自动化处理此身份验证过程,您需要使用Kubernetes secret并为您的Pod指定imagePullSecrets


谢谢您的回复,但我遇到了问题,无法让Minikube VM中运行的docker守护程序连接到我们的repo(更不用说任何建立在其上的Kubernetes功能)。我相信我需要以某种方式让Minkube VM中的docker守护程序使用我可以提供的CA证书。 - Jason White

0

听起来你的问题更多与Docker有关,而不是Kubernetes。Docker CLI支持许多与TLS相关的选项。由于你已经拥有CA证书,类似这样的操作应该可以解决:

docker --tlsverify --tlscacert=/etc/ssl/ca/ca.pem pull oururl.com:5000/myimage:v1

谢谢您的回复。我尝试了您提供的命令,但是仍然出现“x509:证书由未知机构签名”的错误。我甚至取消了DOCKER_TLS_VERIFY和DOCKER_CERT_PATH,但仍然出现相同的错误。我只能假设在VM中运行的Docker守护程序是在这里使事情变得复杂。 - Jason White

0
  • 登录账户 minikube

  • vi ~/.minikube/machines/<PROFILE_NAME>/config.json(在我的情况下是vi ~/.minikube/machines/minikube/config.json

  • InsecureRegistry属性(json路径:HostOptions.EngineOptions.InsecureRegistry)上添加私有仓库

  • 再次运行minikube start


0

你需要编辑/etc/default/docker文件,使其看起来像这样:

# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/admin/systemd/
#

# Customize location of Docker binary (especially for development testing).
#DOCKERD="/usr/local/bin/dockerd"

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--insecure-registry oururl.com:5000"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp"

请确保执行sudo service docker stopsudo docker start以应用更改。然后,您应该能够推送/拉取到您的注册表。


1
此文件不存在,minikube v0.22.2。 - Anthony Dahanne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接