Docker 在Kubernetes中更新部署映像
我对Kubernetes非常陌生,使用K8SV1.4、Minikube v0.15.0和Spotify maven Docker插件。Docker 在Kubernetes中更新部署映像,docker,kubernetes,minikube,Docker,Kubernetes,Minikube,我对Kubernetes非常陌生,使用K8SV1.4、Minikube v0.15.0和Spotify maven Docker插件。 我的项目的构建过程创建了一个Docker映像,并将其直接推送到Minikube的Docker引擎中 POD由我创建的部署创建(使用副本集),策略设置为type:RollingUpdate 我在文档中看到了这一点: 注意:仅当部署的pod模板(即规范模板)更改时,才会触发部署的卷展栏 我正在寻找一种简单的方法/解决方案来自动化流程: 构建触发>推送新的Docker
我的项目的构建过程创建了一个Docker映像,并将其直接推送到Minikube的Docker引擎中 POD由我创建的部署创建(使用副本集),策略设置为
type:RollingUpdate
我在文档中看到了这一点:
注意:仅当部署的pod模板(即规范模板)更改时,才会触发部署的卷展栏
我正在寻找一种简单的方法/解决方案来自动化流程: 构建触发>推送新的Docker映像(无需更改版本)>部署将更新pod>服务将公开新pod。
如果不更改容器图像名称或标记,您只需将应用程序缩放到0,然后使用类似以下内容恢复到原始大小:
kubectl scale --replicas=0 deployment application
kubectl scale --replicas=1 deployment application
如注释中所述,配置中需要始终
ImagePullPolicy:Always
在更改图像时,我发现这是更新图像最直接的方法
kubectl set image deployment/application app-container=$IMAGE
如果不更改图像,那么在出现问题的情况下,您就没有什么可依靠的了。因此,我不建议在开发环境之外使用它
编辑:小奖励-前后保持比例同步可能看起来像:
replica_spec=$(kubectl get deployment/applicatiom -o jsonpath='{.spec.replicas}')
kubectl scale --replicas=0 deployment application
kubectl scale --replicas=$replica_spec deployment application
如果您至少有1.15版本,请使用以下功能
kubectl rollout restart deployment/deployment-name
请在此处阅读更多信息我很好奇您为什么不更改图像版本(: 另一个选项(kubectl卷展栏重新启动旁边)是使用: 使用此命令,您可以灵活地更改部署规范中的特定字段,如标签选择器、pod标签、环境变量等 (*)另一个更适合调试但值得一提的选项是检查卷展栏的修订历史记录:
$ kubectl rollout history deployment my-dep
deployment.apps/my-dep
REVISION CHANGE-CAUSE
2 <none>
4 <none>
5 <none>
6 <none>
11 <none>
12 <none>
然后再回到新的
(**)更改原因是
,因为您应该使用--record
标志运行更新,如所述:
(***)不推荐使用此标志有一个问题。如果您根本不更改映像,则无法确保在每个pod中获得新映像,除非您设置
ImagePullPolicy:Always
并杀死每个pod并让部署人员重新创建它。但是,如果您每次都创建一个新的docker映像,这将是有意义的o同时更新标记。@AnirudhRamanathan,因为我没有创建“新”每次更新图像时,我都会使用第一种方法,因此有一种方法可以自动杀死旧的POD吗?ImagePullPolicy:Always
不处理本地图像,所以同时我手动删除带有特定标签的POD,然后复制集使用更新的图像创建它们。不知道是否有有什么方法可以自动完成吗。有一种方法可以用Kubernetes API完成同样的操作吗?再次您好-请参阅:如果您先缩小规模,然后再增大规模,您的应用程序不会停机吗?如果是,我如何避免停机?是的,会停机-这是2017年的答案,还有其他方法可以触发更新,例如kubectl重新启动…
i在我的情况下,当从同一分支部署开发/登台环境时,我们不会更改映像版本。标记/版本只是分支段塞。这样我们可以更轻松地进行清理并节省注册表中的空间。但我完全同意更好的方法:)我建议使用git commit(或像我一样的前8位数字)作为映像标记,通过这种方式,您可以很容易地找到相应的commit,并强制k8s获得正确的版本。注意:如果您只是在映像中更改应用程序的src,则注册表中占用的空间将仅为src的大小,而不是映像的完整大小
$ kubectl rollout history deployment my-dep
deployment.apps/my-dep
REVISION CHANGE-CAUSE
2 <none>
4 <none>
5 <none>
6 <none>
11 <none>
12 <none>
$kubectl rollout undo deployment my-dep --to-revision=11
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record