我已经根据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
之后已经可用)而无需设置本地存储库,先推送到该存储库再从中拉出?
答案 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
属性 容器设置为IfNotPresent
或Never
,然后是本地图像 (分别是首选或专有)使用。如果您要依靠预拉映像代替注册表 身份验证,您必须确保集群中的所有节点都具有相同的 预拉图像。
这可以用于预加载某些图像以提高速度或 替代对私人注册表进行身份验证的方法。
所有吊舱都将具有对任何预拉图像的读取权限。
答案 1 :(得分:3)
马里奥的答案是正确的。虽然可以完成命令。因此,您要按如下方式创建部署:
kubectl run -it --rm --restart Always DEPLOYMENT_NAME --image my-image --image-pull-policy IfNotPresent COMMAND
注意:如果您有多个节点,则需要确保在所有节点上都有一个具有该名称的图像,因为该存储库不存在,并且会失败。