Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 在Kubernetes中更新部署映像_Docker_Kubernetes_Minikube - Fatal编程技术网

Docker 在Kubernetes中更新部署映像

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

我对Kubernetes非常陌生,使用K8SV1.4、Minikube v0.15.0和Spotify maven 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