Kubernetes中Web应用组件应采用单服务还是多服务部署?
Kubernetes 多组件应用部署方案选择最佳实践
这类场景的通用最佳实践为选择方案1:将indiaWeb应用、postgres-india数据库、redis-india缓存分别作为独立的Deployment(有状态服务推荐用StatefulSet)部署,同时为每个组件创建独立的Service,具体原因如下:
- 符合Pod的核心设计原则:Kubernetes中同一个Pod内的所有容器会共享生命周期、绑定同一节点调度、强制同步扩缩容。你的三个组件的运行特性完全不匹配该场景:Web应用需要根据访问量独立扩缩容,数据库和缓存不需要和Web同步扩缩容;如果Web进程崩溃重启,不需要连带重启数据库和缓存,若三者同Pod,任意容器故障都会触发整个Pod重建,会导致缓存、数据库不必要的启停,甚至出现数据丢失风险。
- 适配不同服务的部署要求:
india属于无状态Web服务,使用普通Deployment即可部署;postgres、redis属于有状态服务,生产环境需要使用StatefulSet部署,要配置独立的持久化存储、稳定的内部网络标识,和无状态服务的部署配置差异极大,放在同一个Pod内无法做差异化配置。 - 不会额外暴露不必要的服务:你只需要对外暴露Web服务入口的需求,和多Service的部署方式完全不冲突。postgres和redis的Service可以设置为ClusterIP类型,仅允许集群内部访问,仅将Web应用的Service通过NodePort/LoadBalancer/Ingress对外暴露即可。
- 符合社区标准工具的默认逻辑:
kompose默认生成方案1的配置,就是遵循Kubernetes社区的标准设计规范,docker-compose中每个独立service对应独立的Kubernetes工作负载+Service,是绝大多数生产场景的标准实现。
仅当你是在本地开发快速验证、或者做临时演示场景,对服务可用性、扩展性无任何要求时,才可以选择方案2临时部署,生产环境严禁使用方案2。
内容的提问来源于stack exchange,提问作者user2490003
相关产品推荐
相关产品推荐

