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