【问题标题】:Persistent Volume claims attached to deployment throws an error when deployment image is updated更新部署映像时附加到部署的持久卷声明会引发错误
【发布时间】:2018-04-27 08:05:42
【问题描述】:

我有一个使用谷歌计算引擎磁盘的持久卷声明的部署配置。

我注意到,当我部署更新映像时,集群会尝试拉入最新映像,但这样做时,它会卡住容器创建状态并出现此错误:

来自服务器的错误(BadRequest):容器中的容器“tita-api” “tita-api-7569bd99d7-z44dg”正在等待启动:ContainerCreating。 进一步检查我看到磁盘资源被另一个节点使用。 卷“app-pv”的AttachVolume.Attach失败:googleapi:错误400:磁盘资源“projects/tita-canary/zones/us-central1-a/disks/app-disk”已被“projects/tita”使用-canary/zones/us-central1-a/instances/gke-tita-staging-default-pool-2cae0006-sxgk'

我正在使用 1.8 kubernetes,目前我所做的是更改我的部署策略以重新创建此工作,但需要一些时间来更新 pod。我真的很喜欢使用滚动更新策略来工作。

【问题讨论】:

  • 您在kubectl describe pod tita-api-7569bd99d7-z44dg 中看到了哪些错误事件?
  • 用确切的答案更新了问题,请检查上面

标签: kubernetes google-kubernetes-engine


【解决方案1】:

根据 Saad-Ali 7 月 14 日在此 Kubernetes issue 中的评论,您必须使用:MaxSurge=0MaxUnavailable=1

“在进行滚动更新时:

i) 使用“重新创建”策略,确保在创建新 pod 之前杀死旧 pod(有一个错误 #27362 在某些情况下无法正常工作,显然已经修复了很长时间以前)

ii) 对MaxSurge=0MaxUnavailable=1 使用“RollingUpdate”策略。

如果没有为部署指定策略,则默认为 RollingUpdate。滚动更新策略有两个参数maxUnavailable和maxSurge;如果未指定,它们分别默认为 1 和 1。这意味着在滚动更新期间,它至少需要保留旧部署中的一个 pod,并允许创建一个额外的新 pod(超出请求的副本数量)。发生这种情况时,如果新 pod 位于不同的节点上,由于旧 pod 以读写方式连接磁盘,因此新 pod 将无法启动。”

【讨论】:

  • 我已经尝试过滚动更新策略,我观察到滚动更新策略只是停止在容器创建消息无法挂载 pvcs 时。我目前正在使用重新创建策略,但它会导致暂时停机。
  • 根据您发布的错误,您正在部署的新 POD 似乎被安排在没有附加 PD 的节点中。因此无法安装该卷。我想使用“MaxSurge=0 和 MaxUnavailable=1”进行汇总。会帮助你,但你可能仍然会遇到停机时间(旧的 POD 会在新的 POD 出现之前被杀死 span )。也许使用Node Selector 强制在同一节点中进行新部署可以工作。
猜你喜欢
  • 2019-03-21
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多