请教下各位大佬,弹性伸缩代码部署问题

2020-08-15 16:09:06 +08:00
 skymei

最近在调研阿里云的弹性伸缩服务,目前对于代码部署这块有点疑问:
1.怎么保持所有实例的一致性
2.在伸缩过程中部署了代码,那怎么更新所有实例
看了下阿里云的文档,推荐是建立自启动脚本来做代码的更新工作,那怎么保证在代码更新完成之后才正式提供服务呢?有推荐放共享存储的,实例只有运行环境,那哪种共享存储合适呢?以前有共享块存储,现在阿里云官网看不到这个产品了,用 NAS 是否有读写性能问题?希望有经验的大佬指教下。

2630 次点击
所在节点    云计算
14 条回复
0bit
2020-08-15 16:26:04 +08:00
推荐入一下 Kubernetes 的坑,以及尽量保证后端服务是 Stateless 的,涉及到状态的地方(数据库、缓存、队列、文件存储等)都直接用阿里云提供的服务,这样的话只要让程序运行好就行了。
也推荐了解一下 12 factor 。
lhx2008
2020-08-15 16:29:23 +08:00
尽可能无状态,需要共享存储用云 NAS 或者 OSS
opengps
2020-08-15 16:33:22 +08:00
弹性伸缩主旨是:制作一台自定义镜像,然后自动克隆增加机器。

如果你想动态更新代码,那么你得在主机内部部署一套启动自动拉取更新发布文件的脚本
skymei
2020-08-15 16:44:55 +08:00
@opengps 在模板镜像里面部署好环境和基础代码,然后定时去跑自动更新部署代码的脚本吗,对于脚本语言 PHP 这种来说,git pull 就差不多的了,像 go 这种咋办呢,编译完之前应该是不想提供服务的,这时候实例可能已经创建好,配置好负载均衡开始提供服务了。有点不清楚这个咋办
skymei
2020-08-15 16:46:00 +08:00
@lhx2008 我想的也是这样,不知道 NAS 可靠不,代码放一起,有点担心单点故障
skymei
2020-08-15 16:46:42 +08:00
@0bit 这块不太懂,目前也不敢贸然用
opengps
2020-08-15 16:50:59 +08:00
举个例子,程序源文件放在私有 oss 或者 nas 里,然后模板系统启动后干的事情是:
1,建立空项目目录(模板机里可以提前建好,为了方便管理,建议直接用系统盘)
2,从局域网拉取程序文件(更新程序的动作脱离弹性环境,弹性机器只知道拉取某些文件,然后启动固定路径的 exe 即可)
3,调用启动获取到的程序
最后判断依据:slb 的健康检查结果通过,扩容算作完成
opengps
2020-08-15 16:51:59 +08:00
当然还得有定时检测逻辑,用来检测到更新,主动杀死进程,拉取新文件替换,然后启动新程序
skymei
2020-08-15 17:12:16 +08:00
@opengps 好的,谢谢。SLB 健康检查,以前用的 AWS 可以自定义提供接口去检查,阿里云的不太熟,我去看看
wejsve
2020-08-15 19:05:14 +08:00
你所说的这些使用微服务+K8S 即可解决
wdlth
2020-08-15 22:38:47 +08:00
一般不会一次性更新所有实例的,大都是灰度发布,蓝绿部署。
594duck
2020-08-15 22:43:26 +08:00
你先看你公司有多大,什么业务的。

弹性伸缩,伸简单缩要配合 API GW 都能缩。

业务场景什么都不问,先叫你上 K8s,哈哈哈哈。我觉得你很快就会陷入“我到底是做什么的问题”
lhx2008
2020-08-16 10:44:06 +08:00
@skymei #4 NAS 这个名字阿里云没取好显得很 low,其实一般都是三副本的,你存一份其实在三个地方都存了。
至于拉代码这个事情,肯定是用 CI 啊,CI 侧就把代码从 Git 拉出来,打包镜像,上传镜像到 Docker Hub 了,然后再发布一下(就是改一下镜像版本号)就可以了
ReallllQCloud
2020-08-16 13:48:39 +08:00
指出一个 V2EX 几乎所有初次接触弹性伸缩的人都出现的问题
--- 混淆了 「固定机器 CD 模式」和「 云 AS CD 模式」

『固定机器模式』:默认认为机器不变,增减都是人工处理,环境是机器初始化时人肉装好,CD 主要指的是通过配置工具(比如 ansible )将「代码包」 push 到「现网机器」,然后替换旧的代码,重启服务这个过程
「云 AS CD 模式」:天然要接受「机器是变的 变的 变的」,环境是通过「 AS 启动配置」配置的镜像 ID+实例启动脚本定义,CD 主要指的是将「代码包 => 镜像制作机器 /服务」,然后通过「制作新的镜像」,这时候最大区别来了,不是 push 「代码包到现网机器」,而是将集群(也就是 AS 伸缩组)内实例通过重装 /重建的方式全部更换为「新镜像』

--- 90%的人理解的 CD 都是「固定机器模式」,所以楼主先理解了上面 2 个区别,再来谈如何用 AS 这个服务

--- 你提到的用 NAS 存储「代码包」,本质上是用「 NAS 」代替「镜像」来存储代码包,手段和目的差不多,当然面临的问就是你意识到的如何保证流程的顺序性以及容错机制
--- 回答一下问题,1.更新代码是更新启动配置,也就是更新镜像,镜像+启动脚本一致实例就一致了 2.重建 /重装镜像

PS:回答 from QCloud 员工,从我们的实践云的模式是绝对优于固定机器模式,但目前 90%以上人无法正确理解和过渡到云的模式,我们正在做一些尝试,后续可以关注下新发布

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX