前端项目部署 K8S 的最佳实践是什么?

2023-04-24 17:00:12 +08:00
 xhldtc

小弟有一个项目要准备往 Azure 的 k8s 环境上部署,目前在前端服务的部署上碰到了一些困惑,有两种部署方式:

1. 前端 React 使用 nginx 做为基础镜像,打成一个可独立运行的 image ,部署在 k8s ingress 的后面,这样的话相当于有两个 nginx 了,镜像里有一个,然后 ingress 其实也是一个 nginx ,在镜像里和 ingress 上都要配路由规则。
2. 前端只是将静态资源和 js 代码打成 image ,不包含 nginx, 然后部署在 k8s ingress 后面,静态资源和后端服务的路由都在 ingress 里配置。

第一种方式之前实践过,是可行的,但是这样的话环境里相当于有两个 nginx ,感觉怪怪的,第二种方式是我个人想法,还没有测试过,但是从架构上来说相对简洁一些,不知是否可行。本人之前是搞后端的,对前端这块的实践不大了解,问了下 ChatGPT 说推荐用第二种方式,然后 Google 搜了下没找到类似的问题。有没有大佬在 k8s 生产环境上实践过类似的部署?还望不吝赐教。

4825 次点击
所在节点    Kubernetes
32 条回复
shanch
2023-04-24 17:18:50 +08:00
我们目前是第一种
cydysm
2023-04-24 17:20:13 +08:00
第一种不怪
Judoon
2023-04-24 17:20:37 +08:00
ingress 不能直接读取静态文件,只能转发流量到具体服务端口,所以你的方案二还是会需要一个 web server 来提供服务


静态文件不如直接丢 cdn
mypchas6fans
2023-04-24 17:22:03 +08:00
印象中第二种没问题的。前司的前端镜像里就是 PM2 start 啥的。但我也不是前端,细节不太清楚了。
nerocho
2023-04-24 17:29:06 +08:00
@Judoon index.html 还是要放 pod 的
killva4624
2023-04-24 17:32:38 +08:00
第二种没有 web server ,无法响应 HTTP 请求。
第二种是通常的做法,不算奇怪:前面一个是 Ingress 负责流量入口,后面一个作为你的前端“服务”。
StoneHuLu
2023-04-24 17:43:17 +08:00
op 想的太洁癖了,以.net core 项目举例,项目本身是自带一个 Kestrel 做 Webserver 的,java 不了解是不是也自带一个,印象中 spring 好像有,这个 Kestrel 本质上就是个超轻量级的 webserver ,所以说你前端项目放个 nginx 完全正常,因为后端项目实际上也有 webserver 的,只是它不是 nginx ,所以你就无视了
anonydmer
2023-04-24 18:21:21 +08:00
第一种方法没有什么怪得,不要从技术栈的角度看问题; web 容器里的 nginx 只是为了伺服静态文件,你完全可以用其他的,caddy ,甚至在需要 ssr 的时候用 node ; k8s 的 ingress 是为了处理流量和路由,没有说一定要用 nginx ,各种 ingress 实现多了去了,Azure 上的 ingress 实现还真不一定是 nginx 吧。 不过这样建议楼主你说的 web 容器里的 nginx 还有负责路由,这个可以去掉。
IvanLi127
2023-04-24 18:23:33 +08:00
第一种,都用容器了,可以不用在意多一个 nginx 。实在在意的话。。。换成 serve 作为 web 服务,看起来会不会舒服很多🤣
bogun
2023-04-24 18:27:31 +08:00
第二种的话,前端的 pod 负责 build 静态文件,并将静态文件映射出去,ingress 挂载该目录,在 ingress 的配置文件里面配置该目录即可。
perfectlife
2023-04-24 18:27:33 +08:00
不用 ingress 的话,前端服务的 svc 用 loadblance 也可以
FrankAdler
2023-04-24 18:27:48 +08:00
@killva4624
@nerocho
类似对象存储这种,是可以直接不经过所谓的 web server 直接响应请求的,输出 html 内容后,再请求后端就可以了,也可以用上 cdn ,现公司前公司都是这么干的,前端 build 完直接推送 oss
SKYNE
2023-04-24 18:31:04 +08:00
也可以将 index.html 放入 nginx 镜像,其他都自动上传到 oss ,然后用域名加资源路径来加载静态文件。
yzqn
2023-04-24 19:18:34 +08:00
@SKYNE 我就是这样做的
knightgao2
2023-04-24 19:48:27 +08:00
1 个 pod 里打 2 个容器,一份放文件 一份放服务
realpg
2023-04-24 20:02:46 +08:00
@SKYNE #13
index.html 也直接传 oss 才是王道
联动部署自动上传,同时自动给 cdn 通知刷新 index.html 的节点缓存
chendy
2023-04-24 20:14:25 +08:00
小东西直接扔 nginx
大项目 oss cdn
除非是 ssr ,否则纯静态的东西放 k8s 实在想不出有啥优势
xiaoxiongwu
2023-04-24 20:18:11 +08:00
@shanch
ll0504
2023-04-24 20:56:49 +08:00
ingress 是做路由转发的,这个一般是针对整个服务集群匹配路由到哪个具体服务,类似于你去 ktv 消费,有迎宾给你引导到某个包房,这个 ingress 就是个迎宾。nginx 是做静态服务的,相当于你点的公主或者牛郎,在包厢里陪你唱歌喝酒。整个 ktv 就像个 k8s 集群,迎宾跟公主角色要分离开,各自负责好自己的职责,共同为这个 ktv 高效运转提供服务,这叫高内聚低耦合。当然迎宾按理说也很漂亮,也可以直接提供服务满足客户需求,但是迎宾都去满足客户了,谁来把大堂里的客户接待了
OldCarMan
2023-04-24 21:35:22 +08:00
@ll0504 感觉我抢了你的名字。😂

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

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

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

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

© 2021 V2EX