第七星尘的独立博客

k8s集群结合公有云函数计算运行网站的方案

前言

本文主要介绍思路和方向,不涉及代码等操作细节。如果有疑问可另行探讨。
先说一下背景。我的网站目前主体运行在k8s集群上,该集群的前端是一个公用出口,由一台云服务自建nginx实现的网关。网络请求的链路是这样子的:

自建nginx网关 -> k8s集群

结合函数计算

为了实现对搜索引擎友好的SEO,我后面引入了服务端渲染SSR功能,即服务器端生成html网页返回给用户浏览器。这个渲染过程非常消耗服务器资源,且消耗的资源可能大也可能小(取决于用户访问量),大波动性可能会对整个集群的稳定性产生影响。比如说,访问量突然增大,集群资源吃紧,其他服务可能因资源限制而运行异常。但如果为了保证服务正常,预留了太多计算资源,则在闲时造成明显了资源空跑与浪费。所以,我打算利用公有云的函数计算服务来承载服务器渲染那部分服务功能。
函数计算服务的好处是可以动态扩容,按需使用和计费。它非常适合一些使用资源波动大、访问量有明显高峰谷底的应用。不过我也要说明的一点,长期稳定型的服务不建议使用函数计算,费用成本将高于包年包月的ESC服务器。一个更好的解决方案是,把网站主体服务在ESC服务器的k8s集群,然后一些耗资源任务放到函数计算。
首先在函数计算服务后台新建并运行起一个容器,并设置http触发器。这将得到一个可内网访问的http地址。然后,在k8s里起一个容器,此容器的里面装一个nginx,通过反向代理转发到函数计算的http内网网址上。链路是这样的:
自建nginx网关 -> k8s集群的反向代理容器 -> 函数计算
这种方式里,相当于把函数计算抽象成了k8s的一个负载,其他像什么绑定域名之类的操作,都跟原k8s使用方式一致,可以直接在k8s上操作而不需要带来额外的操作维护成本。

容灾

虽然说我使用了函数计算服务,但是我并没有完全依赖它。如果它挂了或者我不想使用函数计算了,那么,可以很轻松在k8s的负载均衡那块,配置流量从“反向代理”的负载转发到其他负载(比如在使用函数计算之前的原有SSR负载)。如果想自动容灾切换,还可以在“反向代理”负载这一层做负载均衡,把流量分别分发到原有的SSR负载和函数计算,这样函数计算如果挂掉的话,就会自动使用原有的k8s SSR负载支撑。
链路是这样的:
自建nginx网关 -> k8s集群的反向代理容器 -> ( 函数计算 or 原SSR服务)

 如无特殊说明,本站皆为原创。转载请注明来自第七星尘的独立博客《k8s集群结合公有云函数计算运行网站的方案》

评论