[minikube 文档中文翻译] 手册 - 推送镜像

手册 - 推送镜像

比较将镜像 Push 推送到 minikube 集群的 8 种方法。

词汇表:

Pull 拉取 意味着直接从远程注册表下载容器镜像。

Push 推送 意味着将容器映像直接上传到远程注册表。

Load 加载 获取可用作存档的图像,并使其在集群中可用。

Save 保存 将镜像保存到存档中。

Build 构建 需要一个“构建上下文”(目录)并从中在集群中创建一个新镜像。

Tag 标签 意味着分配名称和标记。

不同方法的比较表

将镜像推送到 minikube 的最佳方法取决于您构建集群时使用的容器运行时(默认为 docker)。以下是帮助您选择的比较表:

方法支持的运行时性能加载构建
docker-env command仅 docker支持支持
cache command所有可以支持不支持
podman-env command仅 cri-o支持支持
registry addon所有可以支持不支持
minikube ssh所有最佳支持*支持*
ctr/buildctl command仅 containerd支持支持
image load command所有可以支持不支持
image build command所有可以不支持支持

注意 1:minikube 上的默认容器运行时是“docker”。

注意2:“无”驱动程序(裸机)不需要将映像推送到集群,因为您系统上的任何映像都已可供 kubernetes 使用。

注意 3:使用 ssh 运行命令时,要加载或构建的文件必须已经在节点上可用(不仅在客户端主机上)。

1. 直接推送到集群内的 Docker 守护进程(docker-env)

这类似于 podman-env,但仅适用于 Docker 运行时。使用容器或 VM 驱动程序(除无驱动程序外的所有驱动程序)时,您可以在 minikube 集群内重用 Docker 守护程序。这意味着您不必在主机上构建并将映像推送到 docker 注册表中。您可以在与 minikube 相同的 docker 守护进程中构建,从而加快本地实验。

要让您的终端使用 minikube 中的 docker 守护进程,请运行以下命令:

Linux

  • 1
    eval $(minikube docker-env)

macOS

  • 1
    eval $(minikube docker-env)

Windows

PowerShell

1
& minikube -p minikube docker-env --shell powershell | Invoke-Expression

cmd

1
@FOR /f "tokens=*" %i IN ('minikube -p minikube docker-env --shell cmd') DO @%i

现在,您在当前终端中运行的任何 docker 命令都将针对 minikube 集群内的 docker 运行时。
因此,如果您执行以下命令,它将显示 minikube 内、minikube 的 VM 或 Container 内的容器。

1
docker ps

现在,您可以在 minikube 内对 docker 进行“构建”,Kubernetes 集群可以立即访问该 docker。

1
docker build -t my_image .

要验证您的终端是否使用 minikube 的 docker-env,您可以检查环境变量 MINIKUBE_ACTIVE_DOCKERD 的值以反映集群名称。

提示 1:记得在 yaml 文件中关闭 imagePullPolicy:Always(使用 imagePullPolicy:IfNotPresent 或 imagePullPolicy:Never)。否则 Kubernetes 不会使用你本地构建的镜像,它会从网络中拉取。

提示 2:评估 docker-env 仅对当前终端有效。通过关闭终端,您将回到使用自己系统的 docker 守护进程。

提示 3:在 Docker 或 Podman 等基于容器的驱动程序中,每次重启 minikube 集群时都需要重新执行 docker-env。

有关 docker-env - https://minikube.sigs.k8s.io/docs/commands/docker-env/ 的更多信息

2. 使用 cache 命令推送镜像

从您的主机可以将 Docker 映像直接推送到 minikube。此镜像将被缓存并自动拉入机器上创建的所有未来 minikube 集群中

1
minikube cache add alpine:latest

add 命令会将请求的镜像存储到 $MINIKUBE_HOME/cache/images 中,并自动将其加载到 minikube 集群的容器运行环境中。

提示 1:如果您的镜像在缓存后发生变化,您需要进行“缓存重新加载”。

minikube 在每次启动时刷新缓存图像。但是,要按需重新加载所有缓存的图像,请运行以下命令:

1
minikube cache reload

提示 2:如果您有多个集群,缓存命令将为所有集群加载图像。

要显示您已添加到缓存中的图像:

1
minikube cache list

此列表不包括 minikube 的内置系统映像。

1
minikube cache delete <image name>

有关更多信息,请参阅:

参考:缓存命令 - https://minikube.sigs.k8s.io/docs/commands/cache/

3.直接推送到集群内CRI-O。 (podman-env)

Linux

这类似于 docker-env 但仅适用于 CRI-O 运行时。要直接推送到 CRI-O,请使用 shell 中的 podman-env 命令在主机上配置 Podman 客户端:

1
eval $(minikube podman-env)

您现在应该能够在主机上的命令行上使用 Podman 客户端与 minikube VM 内的 Podman 服务进行通信:

1
podman-remote help

现在,您可以针对 minikube 内部的存储“构建”,Kubernetes 集群可以立即访问该存储。

1
podman-remote build -t my_image

注意:在 macOS 上,远程客户端称为podman-remote,因为没有可用的本地podman程序。

macOS

这类似于 docker-env 但仅适用于 CRI-O 运行时。要直接推送到 CRI-O,请使用 shell 中的 podman-env 命令在主机上配置 Podman 客户端:

1
eval $(minikube podman-env)

您现在应该能够在主机上的命令行上使用 Podman 客户端与 minikube VM 内的 Podman 服务进行通信:

1
podman help

现在,您可以针对 minikube 内部的存储“构建”,Kubernetes 集群可以立即访问该存储。

1
podman build -t my_image

注意:在 macOS 上,远程客户端称为podman,因为没有可用的本地podman程序。

Windows

这类似于 docker-env 但仅适用于 CRI-O 运行时。 要直接推送到 CRI-O,请使用 shell 中的 podman-env 命令在主机上配置 Podman 客户端:

PowerShell

1
& minikube -p minikube podman-env --shell powershell | Invoke-Expression

cmd

1
@FOR /f "tokens=*" %i IN ('minikube -p minikube podman-env --shell cmd') DO @%i

您现在应该能够在主机上的命令行上使用 Podman 客户端与 minikube VM 内的 Podman 服务进行通信:
现在,您可以针对 minikube 内部的存储“构建”,Kubernetes 集群可以立即访问该存储。

1
2
3
podman help

podman build -t my_image .

注意:在 Windows 上,远程客户端称为podman,因为没有可用的本地podman程序。
记得关闭 imagePullPolicy:Always(使用 imagePullPolicy:IfNotPresentimagePullPolicy:Never),否则 Kubernetes 不会使用你在本地构建的镜像。

4. 使用注册表附加组件推送到集群内

为了便于说明,我们假设 minikube VM 具有来自 192.168.39.0/24 子网的 IP 之一。 如果您没有按照网络指南 - https://minikube.sigs.k8s.io/reference/networking/覆盖这些子网,您可以在此处 - https://github.com/kubernetes/minikube/blob/dfd9b6b83d0ca2eeab55588a16032688bc26c348/pkg/minikube/cluster/cluster.go#L408找到 minikube 用于特定操作系统和驱动程序组合的默认子网,这可能会发生变化。 在适用的情况下,将 192.168.39.0/24 替换为适合您环境的值。

确保将 docker 配置为使用 192.168.39.0/24 作为不安全的注册表。 有关说明,请参阅此处 - https://docs.docker.com/registry/insecure/

确保 192.168.39.0/24 在 minikube 中启用为不安全的注册表。 有关说明,请参阅此处 - https://minikube.sigs.k8s.io/docs/handbook/registry/#enabling-insecure-registries/

启用 minikube 注册表插件:

1
minikube addons enable registry

构建 docker 镜像并适当地标记它:

1
docker build --tag $(minikube ip):5000/test-img .

将 docker 镜像推送到 minikube 注册表:

1
docker push $(minikube ip):5000/test-img

5. 使用 SSH 在 minikube 内构建镜像

使用 minikube ssh 在 minikube 节点内运行命令,并直接在那里运行构建命令。 您在那里运行的任何命令都将针对 kubernetes 集群正在使用的同一个守护进程/存储运行。

对于 Docker,使用:

1
docker build

有关 docker build 命令的更多信息,请阅读 Docker 文档 - https://docs.docker.com/engine/reference/commandline/build/ (docker.com)。
对于 CRI-O,请使用:

1
sudo podman build

有关 podman build 命令的更多信息,请阅读 Podman 文档 - https://github.com/containers/podman/blob/master/docs/source/markdown/podman-build.1.md (podman.io)。

对于 Containerd,请使用:

1
2
3
sudo ctr images import

sudo buildctl build

有关 ctr images 命令的更多信息,请阅读 containerd 文档 - https://containerd.io/docs/getting-started/ (containerd.io)

有关 buildctl build 命令的更多信息,请阅读 Buildkit 文档 - https://github.com/moby/buildkit#quick-start(mobyproject.org)。
要退出 minikube ssh 并返回您的终端:

1
exit

6.直接推送到集群内containerd(buildkitd)

这类似于 docker-envpodman-env 但仅适用于 Containerd 运行时。
目前它需要启动守护进程并手动设置隧道。

ctr 指令

要访问 containerd,您需要以 root 身份登录。 这需要将 ssh 密钥添加到 /root/authorized_keys…

1
2
3
4
docker@minikube:~$ sudo mkdir /root/.ssh
docker@minikube:~$ sudo chmod 700 /root/.ssh
docker@minikube:~$ sudo cp .ssh/authorized_keys /root/.ssh/authorized_keys
docker@minikube:~$ sudo chmod 600 /root/.ssh

请注意 ssh 命令所需的标志。

1
minikube --alsologtostderr ssh --native-ssh=false

从主机将 containerd 套接字通过隧道连接到主机。 (使用上面的 ssh 标志(最明显的是 -p 端口和 root@host))

1
ssh -nNT -L ./containerd.sock:/run/containerd/containerd.sock ... &

现在您可以通过 ssh 对这个 unix 套接字运行命令。

1
ctr --address ./containerd.sock help

Kubernetes 集群可以访问 k8s.io命名空间中的镜像。

buildctl 指令

使用 containerd 后端启动 BuildKit 守护进程。

请注意 ssh 命令所需的标志。

1
minikube --alsologtostderr ssh --native-ssh=false

从机器将 containerd 套接字隧道连接到主机。 (使用上面的 ssh 标志(最明显的是 -p 端口和 root@host))

1
ssh -nNT -L ./containerd.sock:/run/containerd/containerd.sock ... &

之后,现在应该可以使用 buildctl:

1
2
3
4
5
buildctl --addr unix://buildkitd.sock build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=k8s.gcr.io/username/imagename:latest

现在您可以针对 minikube 内部的存储“构建”。 Kubernetes 集群可以立即访问它。

7.直接加载到集群内容器运行时

minikube 客户端将直接与集群中的容器运行时交互,并在那里运行加载命令——针对同一个存储。

1
minikube image load my_image

有关更多信息,请参阅:

参考:图片加载命令 - https://minikube.sigs.k8s.io/docs/commands/image/#minikube-image-load

8. 将镜像构建到集群内容器运行时

minikube 客户端将直接与集群中的容器运行时对话,并在那里运行构建命令——针对同一个存储。

1
minikube image build -t my_image .

有关更多信息,请参阅:

参考:镜像构建命令 - https://minikube.sigs.k8s.io/docs/commands/image/#minikube-image-build


原文链接

Pushing images | minikube - https://minikube.sigs.k8s.io/docs/handbook/pushing/