在 k8s 中使用没有注册表设置的本地 docker 镜像

Wak*_*nka 4 docker kubernetes

我已经根据官方教程设置了单节点 kubernetes 。

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

kubectl taint nodes --all node-role.kubernetes.io/master-
Run Code Online (Sandbox Code Playgroud)

残疾人驱逐限制:

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
Run Code Online (Sandbox Code Playgroud)

并为 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
Run Code Online (Sandbox Code Playgroud)

我试过以下:

docker build -t localhost:5000/my-image .
kubectl run -it --rm --restart=Always --image=localhost:5000/my-image my-image
Run Code Online (Sandbox Code Playgroud)

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

是否可以使用本地图像(发布后已经可用docker images)而无需设置本地存储库,推送到该存储库然后从中拉取?

mar*_*rio 6

您只需将规范imagePullPolicy中的Pod模板设置containerNever. 否则kubelet会尝试拉取镜像。示例Pod定义可能如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: uses-local-image
      image: local-image-name
      imagePullPolicy: Never
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多相关信息

默认情况下,kubelet 会尝试从指定的注册表中拉取每个镜像。但是,如果imagePullPolicy 容器的 属性设置为 IfNotPresentNever,则使用本地图像(分别优先或专门)。

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

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

所有 pod 都可以读取任何预先提取的图像。