问题描述
在使用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上运行一个注册表,并将镜像推送到内部注册表,然后从内部注册表访问它们。希望这些解决方案对你有帮助!