[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 | podman help |
注意:在 Windows 上,远程客户端称为podman
,因为没有可用的本地podman
程序。
记得关闭 imagePullPolicy:Always
(使用 imagePullPolicy:IfNotPresent
或 imagePullPolicy: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 | sudo ctr images import |
有关 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-env
和 podman-env
但仅适用于 Containerd 运行时。
目前它需要启动守护进程并手动设置隧道。
ctr 指令
要访问 containerd,您需要以 root 身份登录。 这需要将 ssh 密钥添加到 /root/authorized_keys…
1 | docker@minikube:~$ sudo mkdir /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 | buildctl --addr unix://buildkitd.sock build \ |
现在您可以针对 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/