如何让Kubernetes很好地检索更新的图像?

如何让Kubernetes很好地检索更新的图像?,kubernetes,google-kubernetes-engine,google-container-registry,Kubernetes,Google Kubernetes Engine,Google Container Registry,我有一个新的Docker映像,我希望能够顺利升级到它,或者忘记以前部署的版本,或者只保留以前的版本,而不是所有以前部署的版本 Kubernetes Pods将在重新启动时检索最新图像,如果它被标记为:latest或imagePullPolicy:Always 但是,除非更改图像标签,否则执行kubectl apply或kubectl replace不会重新启动Pods,因此不会触发提取最新图像。标记它意味着一个复杂的脚本,总是删除旧的标记图像(无用的人有一个技巧在这里) 正在执行kubectl滚

我有一个新的Docker映像,我希望能够顺利升级到它,或者忘记以前部署的版本,或者只保留以前的版本,而不是所有以前部署的版本

Kubernetes Pods将在重新启动时检索最新图像,如果它被标记为
:latest
imagePullPolicy:Always

但是,除非更改图像标签,否则执行
kubectl apply
kubectl replace
不会重新启动Pods,因此不会触发提取最新图像。标记它意味着一个复杂的脚本,总是删除旧的标记图像(无用的人有一个技巧在这里)

正在执行
kubectl滚动更新--图像…
如果每个吊舱只有一个容器,则可以使用

有效且最终干净且总是最新的是删除名称空间并重新创建所有pod/rc/services

即使每个Pod有多个容器,我如何让Kubernetes很好地使用我的新图像?

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

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

标记是一个很好的显式过程。将自动删除旧图像。希望您知道,如果您只使用最新的标记,那么回滚是不可能的。我建议设置标签系统,例如
:latest\u stable,:latest\u dev,:2nd\u latest\u stable,

这些标记将只是“指针”,您的CI将移动它们。然后,您可以定义和编写一些智能注册表删除标记策略,例如,所有早于
2nd\u latest stable
的标记都可以安全删除。你知道你的应用程序,所以你可以设置符合你需要的策略和发布策略

标记示例-起始点构建1/2/3(构建id、git id、构建时间等)-构建1是
:生产
: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
测试正常,构建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
,并且您的清理脚本可以使用策略:可以删除所有早于
:生产
的标记


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

如何使用标签标记部署,标签的值是timestamp或commit hash,然后像通常一样使用
kubectl apply
。更改模板中的标签应再次触发拉取映像(如果设置了
imagePullPolicy:Always
)和滚动升级(取决于配置)。

GC可能适用于群集,但Docker注册表不会自动清理。假设我使用git commit的hash作为标记(我觉得最简单),它也会保留所有以前的提交。谢谢更新。您是否有一个更完整的示例,用于执行完整部署和重新标记?像推新的
:canary
,然后替换以前的
:production
,包括Docker推?我认为新的实验性部署应该允许自动进行,但尚未发布。我确实知道如何推送映像,但从我看到的情况来看,我需要有多个kubernetes.yml,具有不同的标签,首先进行滚动更新,然后我想在重新标记之后,做一个kubectl应用或类似的,但这是我不确定的部分。此外,据我所知,注册表不支持从现有标记远程添加标记,因此每次构建需要额外20秒的开销,等等。@jan garaj您的答案有许多有趣的想法和一些有用的建议,但看到以“家庭作业…”开头的代码片段令人不快因为看起来你是老师,你在给你的学生做作业。据我所知,这在StackOverflow上不是一个正确的行为,因为这是一个回答问题的地方,而不是提供教学和家庭作业的地方。如果我理解错误,我很抱歉。另一个问题是终点线,你说你没有k8s部署的经验:那你为什么要给出k8s部署的建议?欧欧欧