我有一个工作流,在这个工作流中,我编写了一些代码,并在latest下部署了一个坞映像。目前,它部署到我的容器注册中心,然后在容器部署之后运行这个kubectl apply file.yaml,但是K8s似乎没有意识到它需要重新拉出并使用新拉出的映像展开一个新的部署。
我如何才能在部署的YAML规范中提供基本信息,然后重新启动部署呢?
或者,是否有更好的办法?我正以这种方式无条件地展开部署,重新启动我的所有部署。
发布于 2021-03-09 22:41:24
@daniel劝阻使用:latest是正确的。
当你看到标签latest时,不要读“最新”这个词。这是一个默认标记,它破坏了判断图像内容是否发生变化的能力。
一个更好的机制是用一些不变的值标记你的图像..。例如,您的代码是散列表。这是Docker对其图像散列所做的事情,这是识别图像的最好(但不容易)的方法:[[image]]@sha256:....。
您可以使用一些SemVer值。另一种常见的机制是使用代码的git提交来标记: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}https://stackoverflow.com/questions/66555295
复制相似问题