如何使主机上的Docker镜像可用于k8s Deployment

38次阅读
没有评论

问题描述

在使用k8s时遇到一个问题,他想要在k8s的pod中使用主机上的Docker镜像。他发现,要使主机上的Docker镜像在pod中可用,他要么必须将镜像作为pod运行,要么在部署开始时运行一个Docker拉取脚本。然而,Docker的拉取API在一段时间后会限制访问频率,并且这些镜像并不适合在没有输入的情况下运行。因此,他想知道是否有其他方法可以将主机的Docker暴露给pod,或者获取对这些镜像的访问权限。

他目前正在尝试暴露本地Docker套接字,但似乎无法从本地Docker实例访问Deployment。他通过在Deployment和主机上运行docker images命令来测试,以查看镜像是否匹配,结果发现它们并不匹配。

以下是他在minikube上的挂载方式:

volumeMounts:
  - mountPath: /var/run/docker.sock:ro
    name: docker-sock
volumes:
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock

他还使用minikube进行了挂载:

minikube start --memory='5000MB' --mount --mount-string='/:/k8s' --cpus='4'

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据minikube的README,你可以重用Minikube的Docker守护进程,使用eval $(minikube docker-env)命令设置环境变量。

要在不上传镜像的情况下使用镜像,可以按照以下步骤进行操作:
1. 使用eval $(minikube docker-env)命令设置环境变量。
2. 使用Minikube的Docker守护进程构建镜像(例如,docker build -t my-image .)。
3. 在pod的spec中设置镜像,就像构建标签一样(例如,my-image)。
4. 将imagePullPolicy设置为Never,否则Kubernetes将尝试下载镜像。

重要提示:你必须在每个要使用的终端上运行eval $(minikube docker-env)命令,因为它只为当前的shell会话设置环境变量。

方案2

使用k3s上的注册表,并将这些镜像显式推送到内部注册表(然后从内部注册表访问它们,而不是使用上游引用)。

用户建议在k3s上运行一个注册表,并将这些镜像显式推送到内部注册表,然后从内部注册表访问它们,而不是使用上游引用。

以上是两种解决方案,你可以根据实际情况选择适合你的方式。

总结

在使用k8s时,如果你想要在pod中使用主机上的Docker镜像,你可以通过重用Minikube的Docker守护进程来实现。另外,你还可以在k3s上运行一个注册表,并将镜像推送到内部注册表,然后从内部注册表访问它们。希望这些解决方案对你有帮助!

正文完