k8s云集群混搭模式,可能帮你节省50%以上的服务成本
现在大部分中小企业或团队都是使用云平台来部署自己的服务,如阿里云,亚马逊云等。一般来说,业务的负载都具备一定的规律,比如每天集中在某几个小时,或呈现时间段周期性波峰、波谷交替的现象,如下图
如果使用ECS来部署服务,则可能大部分时间ECS的资源没有得到充分利用,造成成本浪费,尤其对于像GPU之类成本较高的资源就更加了。这个时候,我们可以考虑使用云集群的混搭模式来节约成本。
业务场景
假设有一个这样的业务场景,包括如下特点及要求:
整个系统包括业务服务与两层视觉服务
各层服务之间调用需做负载均衡
每天的业务量主要集中在上午几个小时
平时业务量较低时仍要保证服务可用
尽可能降低成本,尤其是GPU服务器成本(GPU贵啊)

k8s云集群混搭模式
现在各大云平台都已经提供容器云服务,如阿里云有基于ECI(弹性容器实例)的Serverless Kubernetes集群服务,基于ECS节点不需要提供master的Kubernetes托管版集群服务,及自己提供master的Kubernetes专有版集群服务等。为了迎合类似上述业务场景的需求,也提供了Kubernetes + virtual node(虚拟节点)的混合集群服务,如下图所示

其中的虚拟节点基于ECI支持多种功能,如GPU容器实例、大规格容器实例等,增强了Kubernetes集群的弹性,使集群不局限于ECS节点的资源,做到弹性无限扩容。
部署方案
结合前面的业务场景,我们可以采用k8s的混合集群服务来部署我们的项目,如下图

实现步骤:
创建Kubernetes托管版集群
加入已有ECS节点
添加一个虚拟节点,通过添加应用 ack-virtual-node 来实现
分别创建无状态的业务Deployment、AI-1 Deployment、AI-2 Deployment(对应三层服务)
分别在业务Deployment上创建公网SLB,AI-1 Deployment、AI-2 Deployment上创建内网SLB
分别在各Deployment上根据CPU或内存使用阈值配置弹性水平伸缩HPA
根据需要可以在某个或某些Deployment上配置定时伸缩,通过添加应用 ack-kubernetes-cronhpa-controller 来实现
因为水平伸缩一般需要一定时间,延迟可能会对业务造成影响,所以在业务负载比较规律的时候,可以通过定时伸缩(就是定时扩展到多少个容器,再定时收缩到多少个容器)来改善;目前定时伸缩配置的查看与更新只能通过kubectl命令行进行。
总结
按照官方文档的计费方式,一个普通的2核8G的ECS一年大概费用是2600左右,如果通过容器服务的方式(按秒计费),假设每天起8小时,则一年大概费用1550左右,如果业务负载再集中到几个小时,费用会更低,对于比较稀缺又昂贵的GPU服务就更加了。但是如果服务全部按容器24小时租赁,其成本就又比ECS贵了(一年约4600),所以在平时业务负载较低的时候,可以将容器调度到ECS上保障服务的提供,业务负载高时,通过HPA或cronHPA的方式动态伸缩到虚拟节点上。对于业务负载具有一定规律的服务来说,采用这种混搭的部署方式将极大地降低你的云服务成本。不过目前k8s云集群服务应该推出时间不久,产品的易用性还比较低,对不具备一定容器与编排基础的人使用门槛相对较高。
欢迎关注我的微信公众号:jboost-ksxy (一个不只有实战干货的技术公众号,及时获取更新内容)
———————————————————————————————————————————————————————————————
k8s云集群混搭模式,可能帮你节省50%以上的服务成本的更多相关文章
- k8s云集群混搭模式落地分享
在 <k8s云集群混搭模式,可能帮你节省50%以上的服务成本>一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰.波谷交替规律的业务节约成本,提高服务伸缩效率的部署 ...
- kubernetes实战-交付dubbo服务到k8s集群(六)使用blue ocean流水线构建dubbo-consumer服务
我们这里的dubbo-consumer是dubbo-demo-service的消费者: 我们之前已经在jenkins配置好了流水线,只需要填写参数就行了. 由于dubbo-consumer用的gite ...
- 11.实战交付一套dubbo微服务到k8s集群(4)之使用Jenkins进行持续构建交付dubo服务的提供者
1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4. 添加参数 # 参数 . name: git_repo type: string description: 项目在 ...
- 实战交付一套dubbo微服务到k8s集群(5)之使用Jenkins进行持续构建交付dubo服务的提供者
1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4.添加第一个参数:设置项目的名称 5.添加第二个参数:docker镜像名称 6.添加第三个参数:项目所在的git中央 ...
- 实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署
基础架构 主机名 角色 IP地址 mfyxw10.mfyxw.com K8S代理节点1,zk1 192.168.80.10 mfyxw20.mfyxw.com K8S代理节点2,zk2 192.168 ...
- 冰河教你一次性成功安装K8S集群(基于一主两从模式)
写在前面 研究K8S有一段时间了,最开始学习K8S时,根据网上的教程安装K8S环境总是报错.所以,我就改变了学习策略,先不搞环境搭建了.先通过官网学习了K8S的整体架构,底层原理,又硬啃了一遍K8S源 ...
- [k8s]zookeeper集群在k8s的搭建(statefulset模式)-pod的调度
之前一直docker-compose跑zk集群,现在把它挪到k8s集群里. docker-compose跑zk集群 zk集群in k8s部署 参考: https://github.com/kubern ...
- 关于K8s集群器日志收集的总结
本文介绍了kubernetes官方提供的日志收集方法,并介绍了Fluentd日志收集器并与其他产品做了比较.最后介绍了好雨云帮如何对k8s进行改造并使用ZeroMQ以消息的形式将日志传输到统一的日志处 ...
- k8s 集群部署--学习
kubernetes是google开源的容器集群管理系统,提供应用部署.维护.扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母) Pod:若 ...
随机推荐
- php编写刷网课自助下单系统(第三方支付实例)
此项目是由于本人刚刚入门php且在校代刷网课而编写的,由于在上课时间不方便接单,故特意写一个自助下单系统来实现客户自助下单.本项目主要实现以下功能:1.用户下单2.用户支付3.用户通过账号查询订单4. ...
- redis集群(单机6节点实现)
Redis集群搭建与简单使用 1.介绍安装环境与版本: 1)Redis使用的是Redis-3.2.8版本. 2)用一台虚拟机模拟6个节点,三个master节点,三个slave节点.虚拟机使用CentO ...
- liunx某台服务器无法访问其他服务器!!!!!!!!
针对于可以ping通ip地址,但是无法访问端口!!! 访问端口卡死,未响应, 例如mysql出现当前主机无法远程连接数据库,而其他主机都可以 前提条件:防火墙,mysql账号ip限制问题已经解决 问题 ...
- 微信小程序 setData 数组 渲染问题 删除之后的数组渲染不正确
list: [ { id: , mode: , src: ' }, { id: , mode: , src: ' }, { id: , mode: , src: ' } ], onDelete(e) ...
- sublime 如何安装插件实现高效输入,如何支持markdown 语法,并实时预览
啊,一直想鼓捣markdown的语法,但是配置什么的有点麻烦.不过用起来的话,真心顺手.无需考虑格式与语法点来点去影响效率, 用心去搬砖,用脚修bug 一.初识 Package Control 首先, ...
- luogu题解 P3388 【【模板】割点(割顶)】
外加定义:在一个无向图中,如果删掉点 x 后图的连通块数量增加,则称点 x 为图的割点. 外加图示 开始思路为割桥上的点为割点,后来证明的确正确. 不过可惜的是他的逆定理错了(gg了),不过数据很弱以 ...
- JasperReport报表
最近在做报表工作,公司要求使用正版免费的报表软件,想想还是用JasperReport. JasperReport是一个纯Java写的开源免费报表工具库,在java开源免费报表中,排在前列. 可是开源免 ...
- 单调栈&单调队列
最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用 ...
- web前端开发-博客目录
web前端开发是一个新的领域,知识连接范围广,处于设计与后端数据交互的桥梁,并且现在很多web前端相关语言标准,框架库都在高速发展.在学习过程中也常常处于烦躁与迷茫,有时候一直在想如何能够使自己更加系 ...
- Java核心技术(卷一)读书笔记——第一章(概述)
1.Java不提供多重继承,通过接口来实现.一个类只能继承一个父类,但是可以同时实现多个接口. 2.Java中的int类型的大小是固定的32位,以避免代码移植时候的不兼容问题.唯一的限制是int类型的 ...