7

我有一个新的 Docker 映像,理想情况下,我希望对其进行平滑升级,要么忘记以前部署的版本,要么只保留以前的版本,而不是所有以前部署的版本。

Kubernetes Pods 将在重新启动时检索最新的镜像(如果它被标记为:latestimagePullPolicy: Always.

但是,除非镜像标签发生变化,kubectl apply否则kubectl replace不会重启 Pod,因此不会触发拉取最新镜像。标记它意味着一个复杂的脚本总是删除旧的标记图像(没用的人在这里有一个技巧)。

kubectl rolling-update ... --image ...如果每个 pod 只有一个容器,则可以这样做。

有效且最终干净且始终获得最新的方法是删除命名空间并重新创建所有 pods/rc/services...

即使每个 Pod 有多个容器,我如何才能要求 Kubernetes 很好地使用我的新镜像?

4

2 回答 2

5

肮脏的解决方法(未经测试):您可以将 rc 缩小到 0,然后缩小到原始大小 => 它将是“pod”重新启动。或者您可以使用 2 个主动(非 0 大小)/被动(0 大小)rc,它们将包含在同一个服务中。你将放大/缩小它们。

标记它意味着一个复杂的脚本总是删除旧的标记图像(没用的人在这里有一个技巧)。

标记是一个很好的显式过程。Kubernetes 垃圾收集会自动删除你的旧镜像。希望您知道,如果您只使用最新标签,那么回滚是不可能的。我建议设置标签系统,例如:latest_stable, :latest_dev, :2nd_latest_stable, ....

这些标签将只是“指针”,您的 CI 将移动它们。然后您可以定义和编写一些智能注册表删除标签策略,例如所有旧的标签2nd_latest stable都可以安全删除。您了解您的应用程序,因此您可以设置适合您的需求和发布策略的策略。

标记示例 - 起始点构建 1/2/3(构建 id、git id、构建时间,...) - 构建 1 是:production并且:canary,所有标签都被推送:

# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
image                                       3                   a21348af4283        37 seconds ago      125.1 MB
image                                       2                   7dda7c549d2d        50 seconds ago      125.1 MB
image                                       production          e53856d910b8        58 seconds ago      125.1 MB
image                                       canary              e53856d910b8        58 seconds ago      125.1 MB
image                                       1                   e53856d910b8        58 seconds ago      125.1 MB

构建 2 将是:canary

# docker tag -f image:2 image:canary
# docker push image:canary
# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
image                                       3                   a21348af4283        6 minutes ago       125.1 MB
image                                       canary              7dda7c549d2d        6 minutes ago       125.1 MB
image                                       2                   7dda7c549d2d        6 minutes ago       125.1 MB
image                                       production          e53856d910b8        7 minutes ago       125.1 MB
image                                       1                   e53856d910b8        7 minutes ago       125.1 MB

测试 OK,build 2 是稳定的 - 它将是:production

# docker tag -f image:2 image:production
# docker push image:production
# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
image                                       3                   a21348af4283        9 minutes ago       125.1 MB
image                                       2                   7dda7c549d2d        9 minutes ago       125.1 MB
image                                       canary              7dda7c549d2d        9 minutes ago       125.1 MB
image                                       production          7dda7c549d2d        9 minutes ago       125.1 MB
image                                       1                   e53856d910b8        10 minutes ago      125.1 MB

作业:实际上构建 2 不稳定 -> 设置:production为构建 1(回滚)和:canary构建 3(构建 3 中的测试修复)。如果你只使用:latest,这个回滚是不可能的

kubectl滚动更新/回滚将使用显式:id,您的清理脚本可以使用策略:所有旧标签:production都可以删除。

不幸的是,我没有 Kubernetes 部署的经验。

于 2016-02-20T22:07:59.793 回答
0

如何使用标签标记部署,该标签的值是时间戳或提交哈希,然后kubectl apply像往常一样使用。更改模板中的标签应再次触发拉取图像(如果imagePullPolicy: Always已设置)和滚动升级(取决于配置)。

于 2018-07-24T19:16:44.657 回答