在k8s中使用本地docker镜像而不进行注册表设置

时间:2020-02-14 14:53:33

标签: docker kubernetes

我已经根据official tutorial设置了单节点kubernetes。

除了官方文档,我还设置了单节点集群:

kubectl taint nodes --all node-role.kubernetes.io/master-

强制驱逐限制:

cat << EOF >> /var/lib/kubelet/config.yaml
evictionHard:
  imagefs.available: 1%
  memory.available: 100Mi
  nodefs.available: 1%
  nodefs.inodesFree: 1%
EOF

systemctl daemon-reload
systemctl restart kubelet

并为Docker设置systemd驱动程序:

cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

systemctl daemon-reload
systemctl restart docker

我尝试了以下操作:

docker build -t localhost:5000/my-image .
kubectl run -it --rm --restart=Always --image=localhost:5000/my-image my-image

但是在pod日志中,我看到了ImagePullBackOff。如果我设置本地存储库并在构建映像后执行docker push localhost:5000/my-image,则一切正常。

是否可以使用本地映像(在发布docker images之后已经可用)而无需设置本地存储库,先推送到该存储库再从中拉出?

2 个答案:

答案 0 :(得分:5)

您只需要将imagePullPolicy规范中Pod模板中的container设置为Never。否则, kubelet 将尝试拉出图像。示例Pod的定义可能如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: uses-local-image
      image: local-image-name
      imagePullPolicy: Never

更多信息,您可以找到here

默认情况下,kubelet将尝试从指定的列表中提取每个图像 注册表。但是,如果...的imagePullPolicy属性 容器设置为IfNotPresentNever,然后是本地图像 (分别是首选或专有)使用。

如果您要依靠预拉映像代替注册表 身份验证,您必须确保集群中的所有节点都具有相同的 预拉图像。

这可以用于预加载某些图像以提高速度或 替代对私人注册表进行身份验证的方法。

所有吊舱都将具有对任何预拉图像的读取权限。

答案 1 :(得分:3)

马里奥的答案是正确的。虽然可以完成命令。因此,您要按如下方式创建部署:

kubectl run -it --rm --restart Always DEPLOYMENT_NAME --image my-image --image-pull-policy IfNotPresent COMMAND

注意:如果您有多个节点,则需要确保在所有节点上都有一个具有该名称的图像,因为该存储库不存在,并且会失败。