【问题标题】:Forcing Kubernetes to redeploy a deployment YAML if docker image updates? [duplicate]如果 docker 映像更新,是否强制 Kubernetes 重新部署部署 YAML? [复制]
【发布时间】:2021-03-10 11:04:18
【问题描述】:

我有这个工作流程,我在其中编写了一些代码,并在latest 下部署了一个 docker 映像。目前,它部署到我的容器注册表,然后我在容器部署后运行 kubectl apply file.yaml,但 K8s 似乎没有意识到它需要重新拉取并使用新拉取的镜像推出新的部署。

我怎样才能基本上输入我的部署的 YAML 规范,然后重新启动部署?

或者,有没有更好的方法?我无条件地以这种方式在我的所有部署中推出部署重启。

【问题讨论】:

  • 你不应该定位latest。您应该始终遵循正确的容器版本控制策略。
  • @DanielMann 所以基本上只是将版本输入到 yaml 规范中,然后 k8s 会检测到我很好吗?
  • 或者使用 rollout,或者考虑使用 Helm 或 Kustomize 之类的东西。

标签: docker kubernetes gitlab gitlab-ci


【解决方案1】:

@daniel-mann 不鼓励使用 :latest 是正确的。

当您看到标签latest 时,不要阅读“最新”一词。这是一个默认标签,它破坏了确定图像内容是否已更改的能力。

一个更好的机制是用一些不变的值来标记你的图像……例如,你的代码的哈希值。这就是 Docker 对其图像哈希所做的事情,这是识别图像的最佳(但不是最简单的)方法:[[image]]@sha256:....

您可以使用一些 SemVer 值。另一种常见的机制是使用代码的 git commit 作为其标签:git rev-parse HEAD 或类似的。

那么,假设您现在通过标签唯一标识图像,如何更新部署?文档提供了各种方法:

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#updating-a-deployment

但是这些对于健壮的部署并不好(小写-D)。您还应该做的是在每次更改映像时创建唯一的部署清单。然后,如果你犯了一个错误并且无意中部署了一些令人不快的东西,你有一份你所做的事情的副本,你可以更正它(制作另一个清单)并应用它。这是不可变基础架构背后的原则。

所以...

TAG=$(git rev-parse HEAD)

docker build \
--tag=${REPO}/${IMAGE}:${TAG} \
...

docker push ${REPO}/${IMAGE}:${TAG}

然后更改清单(并将更改提交到源代码管理):

sed --in-place "s|image: IMAGE|image: ${REPO}/${IMAGE}:${TAG}|g" path/to/manifest.yaml

git add /path/to/manifest.yaml
git commit --message=...

然后将修改后的(但唯一的!)清单应用到集群:

kubectl apply \
--filename=/path/to/manifest.yaml \
--namespace=${NAMESPACE}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2020-06-05
    • 1970-01-01
    • 2018-08-24
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多