推送镜像
词汇表
Pull 表示直接从远程注册表下载容器镜像。
Push 表示直接将容器镜像上传到远程注册表。
Load 将以存档形式提供的镜像加载到集群中使其可用。
Save 将镜像保存到存档中。
Build 获取一个“构建上下文”(目录),并从中在集群中创建一个新镜像。
Tag 表示分配一个名称和标签。
不同方法的比较表
将镜像推送到 minikube 的最佳方法取决于您构建集群时使用的容器运行时(默认为 docker)。这是一个比较表,可帮助您选择
方法 | 支持的运行时 | 性能 | 加载 | 构建 | ||
---|---|---|---|---|---|---|
docker-env 命令 | docker & containerd | 良好 | 是 | 是 | ||
缓存命令 | 全部 | 尚可 | 是 | 否 | ||
podman-env 命令 | 仅限 cri-o | 良好 | 是 | 是 | ||
registry 插件 | 全部 | 尚可 | 是 | 否 | ||
minikube ssh | 全部 | 最佳 | 是* | 是* | ||
ctr/buildctl 命令 | 仅限 containerd | 良好 | 是 | 是 | ||
image load 命令 | 全部 | 尚可 | 是 | 否 | ||
image build 命令 | 全部 | 尚可 | 否 | 是 |
- 注意 1:minikube 上的默认容器运行时是
docker
。 - 注意 2:
none
驱动程序(裸机)不需要将镜像推送到集群,因为系统上的任何镜像都已可用于 Kubernetes 集群。 - 注意 3:当使用 ssh 运行命令时,要加载或构建的文件必须已在节点上可用(不仅仅在客户端主机上)。
1. 直接推送到集群内的 Docker 守护进程 (docker-env)
这类似于 podman-env,但仅适用于 Docker 运行时。当使用容器或 VM 驱动程序(除 none 之外的所有驱动程序)时,您可以重用 minikube 集群内的 Docker 守护进程。这意味着您不必在主机上构建并将镜像推送到 docker 注册表。您只需在与 minikube 相同的 docker 守护进程内构建,这会加快本地实验的速度。
要将您的终端指向使用 minikube 内的 docker 守护进程,请运行以下命令
eval $(minikube docker-env)
eval $(minikube docker-env)
PowerShell
& minikube -p minikube docker-env --shell powershell | Invoke-Expression
cmd
@FOR /f "tokens=*" %i IN ('minikube -p minikube docker-env --shell cmd') DO @%i
现在,您在此当前终端中运行的任何“docker”命令都将针对 minikube 集群内的 docker 运行。
因此,如果您执行以下命令,它将向您显示 minikube 内部、minikube 的 VM 或容器内的容器。
docker ps
现在,您可以针对 minikube 内的 docker 进行“构建”,kubernetes 集群可以立即访问它。
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 的更多信息
2. 使用“cache”命令推送镜像。
您可以从主机直接将 Docker 镜像推送到 minikube。此镜像将被缓存,并自动拉取到在该机器上创建的所有未来的 minikube 集群中
minikube cache add alpine:latest
add 命令会将请求的镜像存储到 $MINIKUBE_HOME/cache/images
,并将其自动加载到 minikube 集群的容器运行时环境中。
提示 1:如果您的镜像在缓存后发生更改,则需要执行“cache reload”。
minikube 会在每次启动时刷新缓存的镜像。但是,要按需重新加载所有缓存的镜像,请运行以下命令
minikube cache reload
提示 2:如果您有多个集群,则缓存命令将为所有集群加载镜像。
要显示您添加到缓存的镜像
minikube cache list
此列表不包括 minikube 的内置系统镜像。
minikube cache delete <image name>
有关更多信息,请参阅
3. 直接推送到集群内的 CRI-O。(podman-env)
这类似于 docker-env,但仅适用于 CRI-O 运行时。要直接推送到 CRI-O,请在您的 shell 中使用 podman-env 命令在您的主机上配置 podman 客户端
eval $(minikube podman-env)
您现在应该能够在主机上的命令行中使用 podman 客户端与 minikube VM 内的 podman 服务进行通信
podman-remote help
现在,您可以针对 minikube 内的存储进行“构建”,kubernetes 集群可以立即访问它。
podman-remote build -t my_image .
注意:在 Linux 上,远程客户端称为“podman-remote”,而本地程序称为“podman”。
这类似于 docker-env,但仅适用于 CRI-O 运行时。要直接推送到 CRI-O,请在您的 shell 中使用 podman-env 命令在您的主机上配置 Podman 客户端
eval $(minikube podman-env)
您现在应该能够在主机上的命令行中使用 Podman 客户端与 minikube VM 内的 Podman 服务进行通信
podman help
现在,您可以针对 minikube 内的存储进行“构建”,kubernetes 集群可以立即访问它。
podman build -t my_image .
注意:在 macOS 上,远程客户端称为“podman”,因为没有可用的本地“podman”程序。
这类似于 docker-env,但仅适用于 CRI-O 运行时。要直接推送到 CRI-O,请在您的 shell 中使用 podman-env 命令在您的主机上配置 Podman 客户端
PowerShell
& minikube -p minikube podman-env --shell powershell | Invoke-Expression
cmd
@FOR /f "tokens=*" %i IN ('minikube -p minikube podman-env --shell cmd') DO @%i
您现在应该能够在主机上的命令行中使用 Podman 客户端与 minikube VM 内的 Podman 服务进行通信
现在,您可以针对 minikube 内的存储进行“构建”,kubernetes 集群可以立即访问它。
podman help
podman build -t my_image .
注意:在 Windows 上,远程客户端称为“podman”,因为没有可用的本地“podman”程序。
请记住关闭 imagePullPolicy:Always
(使用 imagePullPolicy:IfNotPresent
或 imagePullPolicy:Never
),否则 Kubernetes 将不会使用您本地构建的镜像。
4. 使用 Registry 插件推送到集群内
为了说明,我们将假设 minikube VM 具有 192.168.39.0/24
子网中的一个 IP。如果您没有按照 网络指南覆盖这些子网,您可以在 此处找到 minikube 用于特定操作系统和驱动程序组合的默认子网,该子网可能会发生变化。请在适用情况下将 192.168.39.0/24
替换为适合您环境的值。
确保 docker 配置为使用 192.168.39.0/24
作为不安全的注册表。有关说明,请参阅此处。
确保在 minikube 中将 192.168.39.0/24
启用为不安全的注册表。有关说明,请参阅此处。
启用 minikube registry 插件
minikube addons enable registry
构建 docker 镜像并对其进行适当标记
docker build --tag $(minikube ip):5000/test-img .
将 docker 镜像推送到 minikube 注册表
docker push $(minikube ip):5000/test-img
5. 使用 SSH 在 minikube 内部构建镜像
使用 minikube ssh
在 minikube 节点内运行命令,并在那里直接运行构建命令。您在那里运行的任何命令都将针对 kubernetes 集群正在使用的相同守护进程/存储运行。
对于 Docker,请使用
docker build
有关 docker build
命令的更多信息,请阅读 Docker 文档 (docker.com)。
对于 CRI-O,请使用
sudo podman build
有关 podman build
命令的更多信息,请阅读 Podman 文档 (podman.io)。
对于 Containerd,请使用
sudo ctr images import
sudo buildctl build
有关 ctr images
命令的更多信息,请阅读 containerd 文档 (containerd.io)
有关 buildctl build
命令的更多信息,请阅读 Buildkit 文档 (mobyproject.org)。
要退出 minikube ssh 并返回终端,请输入
exit
6. 直接推送到集群内的 containerd (buildkitd)
这类似于 docker-env 和 podman-env,但仅适用于 Containerd 运行时。
目前,它需要手动启动守护程序并设置隧道。
ctr
指令
为了访问 containerd,您需要以 root
用户身份登录。这需要在 /root/authorized_keys
中添加 SSH 密钥。
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
命令所需的标志。
minikube --alsologtostderr ssh --native-ssh=false
从机器将 containerd 套接字隧道传输到主机。(使用上面的 SSH 标志(最重要的是 -p 端口和 root@host))
ssh -nNT -L ./containerd.sock:/run/containerd/containerd.sock ... &
现在,您可以针对通过 SSH 隧道传输的此 Unix 套接字运行命令。
ctr --address ./containerd.sock help
“k8s.io” 命名空间中的镜像可供 Kubernetes 集群访问。
buildctl
指令
使用 containerd 后端启动 BuildKit 守护程序。
docker@minikube:~$ sudo -b buildkitd --oci-worker=false --containerd-worker=true --containerd-worker-namespace=k8s.io
使普通用户可以访问 BuildKit 套接字。
docker@minikube:~$ sudo groupadd buildkit
docker@minikube:~$ sudo chgrp -R buildkit /run/buildkit
docker@minikube:~$ sudo usermod -aG buildkit $USER
docker@minikube:~$ exit
请注意 ssh
命令所需的标志。
minikube --alsologtostderr ssh --native-ssh=false
从机器将 BuildKit 套接字隧道传输到主机。(使用上面的 SSH 标志(最重要的是 -p 端口和 user@host))
ssh -nNT -L ./buildkitd.sock:/run/buildkit/buildkitd.sock ... &
之后,现在应该可以使用 buildctl
了
buildctl --addr unix://buildkitd.sock build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=registry.k8s.io/username/imagename:latest
现在,您可以针对 minikube 内部的存储进行“构建”。该存储可以立即供 Kubernetes 集群访问。
7. 直接加载到集群内的容器运行时
minikube 客户端将直接与集群中的容器运行时通信,并在那里针对相同的存储运行加载命令。
minikube image load my_image
有关更多信息,请参阅
8. 将镜像构建到集群内的容器运行时
minikube 客户端将直接与集群中的容器运行时通信,并在那里针对相同的存储运行构建命令。
minikube image build -t my_image .
有关更多信息,请参阅