版本回滚是否应该把配置也一起回滚?

原创 吴就业 154 0 2024-03-08

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/ece06e5258e04c02b84088de5b7d159a

作者:吴就业
链接:https://wujiuye.com/article/ece06e5258e04c02b84088de5b7d159a
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

最近跟同事们争论的一个问题:一个应用发布平台,版本回滚是否应该支持把配置一同回滚?

针对这个事情的讨论,我们分成了两派,一边是赞成派,一边反对派。

赞成派的观点

“举个真实例子,我这边在配置健康检查的时候配置错了或者端口改错了,导致线上不可用,我想快速回滚线上Pod。”

“主要是改了很多东西,不知道改了啥,想先快速恢复线上环境。”

所以强烈坚持应该一起回滚这一观点!

反对派的观点

“镜像版本的回滚和配置的回滚应该是分开的,不能说回滚一下,把配置也自动给回滚了。 ”

“举个例子: 我想回滚到前几个版本,但是这几个版本之间,有修改过一些配置,比如运维告诉我,要换个端口,然后这几个版本不涉及配置问题,就是一些bug fix。假如回滚把配置也回滚,由于运维把域名回源端口换了,并且已经通知过我们改了。那么回滚后就会出现域名无法访问的问题。 “

镜像是构造阶段的产物,而配置是运行时所需,配置在运行的过程中会随时改动,而镜像构建出来就不会变。

所以强烈坚持配置不能一起回滚这一观点!

我个人观点

其实我就是那个反对派!

我认为不能为了解决一个问题,而引入另一个问题。

如果一个产品功能存在无法替用户做决定的情况下,那么就不应该替用户做任何决定,可以把选择权交给用户,例如回滚的时候给用户选择是否回滚配置。如果一个功能可提供可不提供,而默认提供会给用户造成不必要的问题,那首选就是不要提供。

竞品的做法

有时候我们也可以看看竞品是怎么做的。当然,也只是参考,毕竟不是竞品做的就是正确的。

作为Railway的铁粉用户,我们来看看Railway是如何抉择的。

如下图,这是我在Railway上部署的博客系统。

截屏2024-03-08 16.06.39

在当前版本,我加入了GitHub授权登录才能对文章评论,所以配置项我加入了GITHUB_CLINET_ID和GITHUB_CLIENT_SECRET两个新的配置项。

截屏2024-03-08 16.01.39

现在我操作回滚到一个月前的一个版本。

截屏2024-03-08 16.07.42

回滚完成:

截屏2024-03-08 16.08.21

查看配置:

截屏2024-03-08 16.08.30

可以看到,配置并没有任何回滚。所以Railway的选择是,不回滚配置。

或许我们对配置的理解不一样

仔细思考赞成派的话,或者我们对配置的理解不一样。

健康检查这个例子,配置是针对容器的,不属于应用配置,属于平台配置,平台提供的部署配置。套到k8s的话,就是k8s提供的Deployment配置。跟应用配置是两码事。

如果是这样的话,那确实应该随镜像一起回滚,不但没有任何副作用,这样才能确保回滚能正常部署起来,因为是平台部署配置!

本文经「原本」原创认证,作者吴就业,访问yuanben.io查询【2Y5HRVZB】获取授权信息。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Kubernetes可观测之Metrics API,什么是Metrics API?

不禁感叹,k8s这个底座设计的太牛了,我们不仅可以通过CRD + 控制器做扩展,还可以自定义APIService去做扩展。k8s,牛啊!

通过预测Pod的request实现超卖,如果是java感觉容易大面积重启?

超卖其实就是赌徒思想,堵的就是概率。一个节点上的个别Pod异常突增的概率都很小,同时很多Pod一起异常突增的概率更小。

k8s 自定义调度器禁用了某个评分插件,对默认调度器是否有影响?

不会影响到默认调度器,只会影响到scheduler-plugins调度器本身。默认调度器不会因为自定义调度器的配置而改变。

我开源了一款k8s命令行工具,提供命令输入提示和自动补全功能

kubectlx是一款基于go-prompt库开发的k8s命令行工具,目的是简化kubectl工具的一些常用命令的使用, 并提供命令输入提示、自动补全。

Serverless服务日记收集,你们采用哪种方案?

Serverless帮助我们实现了自动扩缩容,但要实现真正的按需付费,就要使用弹性的物理节点,例如AWS的Fargate,使用EKS将Pod调度到Fargate上。这也注定了不会有固定的Node去运行Pod,因此在Node上以DaemonSet部署日记收集容器的方案就走不通了。

为什么java不适合云原生

云原生的优势在于利用Serverless技术优化基础设施成本,要求应用启动速度快且内存占用低。然而,Java应用在自动弹性扩缩容和内存消耗方面存在问题。文章以部署个人项目的视角,通过比较小明使用Go语言和小聪使用Java语言开发的博客系统的部署情况,展示了Java的启动速度慢和内存占用大的不适应性。