首页 新闻 会员 周边 捐助

关于 k8s 中 ConfigMap 版本管理的问题:如何回退 ConfigMap

0
悬赏园豆:100 [已解决问题] 解决于 2020-01-22 14:27

假设这样一个发布场景,线上跑的应用版本是 v1.0 ,现在要发布 v2.0 ,v2.0 的配置文件与 v1.0 不兼容。

发布时先修改 ConfigMap 对应 v2.0 的配置文件,然后部署更新 pod ,发布后出现了故障,需要立即回退,通过下面的命令将 deployment 回退至上一版本 v1.0 。

kubectl rollout undo deployment blog-web

但是由于 ConfigMap 中的配置文件与 v1.0 不兼容,需要再次修改 ConfigMap 才能让回退的 pod 正常运行。

请问有没有办法像回退 deployment 那样回退 ConfigMap ?

k8s
dudu的主页 dudu | 高人七级 | 园豆:29570
提问于:2020-01-20 17:10
< >
分享
最佳答案
1

一般使用 Helm 进行安装或者升级新版本。例如, 现在是一个空的k8s环境,可能会涉及到以下步骤:

1、举例目前是在安装博客园新闻站点

helm install cnblogs-news stable/cnblogs-news

其中 cnblogs-news 为 release 的名称,stable/cnblogs-news 为 helm 的 charts 包名称。

通常情况下,我们会在 stable/cnblogs-news 中编写 yaml 来初始化 k8s 需要的所有资源,包括命名空间,服务,部署,作业,ConfigMaps 等等。除了这些可能还会有一些依赖的包,如果你的应用依赖这些环境并且你想一键生成可运行的环境,那么也需要被定义为依赖项。

在安装之前确保 helm search repo cnblogs-news 能够正确被找到。

安装成功后,如果想卸载那么对应的相反操作为 :

helm uninstall cnblogs-news

2、升级 cnblogs-news 环境

例如现在需要将环境升级为 v2 版本,那么你需要编写 v2 版本的 helm charts 包,和 v1 版本包的区别是 v2 中的内容是针对于 v2 的应用编写的,其中依然会包含所有 v1 的定义外加改动的部分。

接下来,需要将新版本的包上传到 helm 仓库中。

在升级之前,你可能需要运行以下命令来获取到最新版本的 helm 包到本地。

helm repo update

使用以下命令来升级环境。

helm upgrade cnblogs-news stable/cnblogs-news --version=v2.0

helm 在升级的过程中,会自动对比当前的 yaml 脚本和已经发布的 yaml 脚本,然后使用最小改动原则来在 k8s 中执行滚动升级。

3、回滚 cnblogs-news 环境

helm rollback cnblogs-news 1

其中 1 代表修订版本,每次递增1,也就是说向前回滚一个版本。

需要向你说明的是, 由于 helm 在发布/升级的时候是将元数据存储到自己的 configmap 中的,然后才进行应用。所以回滚时,会依据内部的元数据信息,将整个 k8s 环境恢复到先前的版本。

收获园豆:100
Savorboard | 小虾三级 |园豆:629 | 2020-01-22 14:17

感谢如此详细的讲解,看了之后立即想到了解决方法,在“编写 v2 版本的 helm charts 包”时使用针对这个版本的 ConfigMap ,比如 cnblogs-news-appsettings-v2

dudu | 园豆:29570 (高人七级) | 2020-01-22 14:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册