【问题标题】:How to set Kubernetes image pull retry limit如何设置 Kubernetes 镜像拉取重试限制
【发布时间】:2019-04-03 22:33:53
【问题描述】:

当从镜像存储库中清除为容器指定的镜像时,Kubernetes 会以长时间运行的 pod 结束。这些部署由持续集成系统创建,有时会在清除映像后运行或重新运行管道。

来自kubectl get pods 的状态显示为ImagePullBackOff

应该在 kube 配置 yaml 文件中设置什么来阻止这些 pod 运行数天?理想情况下,我们只希望图像被拉几次,如果不成功就失败。

pod 定义是

apiVersion: v1
kind: Pod
metadata:
  name: test-missing-image

spec:
  containers:

  - image: missingimage

    name: test
    resources:
      limits:
        memory: "10000Mi"
    readinessProbe:
      httpGet:
        port: 5678
        path: /somePath
      initialDelaySeconds: 360
      periodSeconds: 30
      timeoutSeconds: 30

  restartPolicy: Never
  terminationGracePeriodSeconds: 0

谢谢!

【问题讨论】:

  • 为什么需要它?我真的无法理解。有什么k8s资源,比如Deployment或者StatefulSet,不能启动,但是存在集群中?
  • 我们正在创建 kubernetes 部署,作为我们持续集成管道的一部分。因此,有时如果依赖图像超过阈值年龄,它们就会丢失。

标签: kubernetes kubernetes-container


【解决方案1】:

AKAIK,在撰写本文时,控制此问题的唯一方法是使用容器规范中的 imagePullPolicy

您可以将其设置为Never,但您的 pod 将不会运行,因为该图像不存在于本地。或者您可以将其设置为IfNotPresent,但不知何故,您必须在 K8s 节点中本地创建具有该特定标签的图像。任何一种选择都不理想,但我相信将其放入 ImagePullBackOff 可能是有道理的:人们想知道他们的 pod 没有运行的原因。

所以 IMO 更大的问题是,为什么要删除/使 docker 注册表中仍在集群中运行的图像无效?为什么不在 docker 注册表(也称为部署)中删除或使图像无效之前使用最新图像更新 pods/deployments/daemonsets/replicasets/statefulsets

一般做法可能是这样的:

create new image => deploy it => make sure everything is ok => 
{
  ok => invalidate the old image tag.
  not ok => rollback => delete new image tag => go back to create new image => create new image tag.
}

注意,图层和图像不会在 docker 注册表中删除。您可以删除或覆盖标签:How to delete images from a private docker registry?

【讨论】:

  • 谢谢,我们会在创建 pod 之前查询图像是否存在。
猜你喜欢
  • 2017-09-06
  • 2016-01-11
  • 2018-07-13
  • 2021-01-21
  • 2018-08-09
  • 2016-08-20
  • 2018-11-16
  • 2022-08-09
  • 1970-01-01
相关资源
最近更新 更多