kubernetes 重新创建更新策略与简单卸载、安装之间的区别

Difference between kubernetes recreate update strategy vs simply uninstall, install

在决定 kubernetes 应用程序的更新策略时,可以选择使用 Recreate 策略。

这与仅卸载和安装应用程序有何不同?

Recreate 策略将删除您的 Pods 然后添加新的 Pods - 您将获得较短的停机时间,但另一方面您在升级期间不会使用太多额外资源。

您通常需要 RollingUpgrade,因为一次需要几个 Pods,并且您可以在不停机的情况下部署无状态应用程序。

我假设 “只需卸载并安装应用程序” 你的意思是完全删除你的部署,例如:

kubectl delete deployment nginx-deployment

并再次创建它:

kubectl apply -f nginx-deployment.yaml

请注意,当使用 Recreate 策略时,不会完全删除部署,因此这里存在根本区别。通过选择此策略,您仅通知 kubernetes 在您更新它们时(例如,您更新容器的图像版本)应删除并重新创建由您的部署管理的所有 pods,而不是删除并重新创建它们的新版本使用 RollingUpdate 策略时发生的时间。通过这种方式,您可以确保在更新发生时,一定数量的 pods 服务于旧版本的应用程序仍然可用,并且 pods 出现新版本的图像。

当您删除部署并创建新部署时,新部署与旧部署无关。换句话说,将创建全新的 Deployment 资源,并且不会保留您所做更改的历史记录。

我相信解释事物的最好方式永远是一个例子。那么让我们继续下一个。

假设您已经根据您的 yaml 清单创建了一个新的 nginx 部署:

kubectl apply -f nginx-deployment.yaml

然后您决定更新映像版本,方法是编辑 nginx-deployment.yaml 清单并重新应用它,或者通过以下方式:

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.161 --record=true

无论哪种情况,您都可以通过 运行:

check rollout history
kubectl rollout history deployment nginx-deployment

你应该会看到类似这样的内容:

$ kubectl rollout history deployment nginx-deployment 
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=nginx-deployment.yaml --record=true
2         kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true

当您拥有推出历史记录时,您可以撤消您的最新更改并返回到之前的修订版:

kubectl rollout undo deployment.v1.apps/nginx-deployment

现在,此部署的部署历史可能如下所示:

$ kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
2         kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true
3         kubectl apply --filename=nginx-deployment.yaml --record=true

当您简单地删除您的部署并再次重新创建它时,您将不会在新创建的部署的推出历史记录中看到任何内容,并且您将无法以如此简单的方式将其回滚到某个旧版本。