k8s云集群混搭模式落地分享
在 《k8s云集群混搭模式,可能帮你节省50%以上的服务成本》一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰、波谷交替规律的业务节约成本,提高服务伸缩效率的部署方案。本文对该方案的具体落地步骤与基本运行维护进行分享,为有此需求者提供参考。
部署要求
- 应能24小时不间断提供服务
- 在业务高峰期到来前能自动扩展指定数量的容器(提前对业务负载进行评估与压测,确定容器数)
- 在业务高峰期过后能自动收缩到指定数量的容器
- 能根据服务负载情况自动弹性伸缩,避免业务突发情况下服务能力跟不上

基本概念
Docker
容器:应用运行的形式
镜像:容器的定义,或打包形式
容器镜像服务:镜像仓库

k8s云混合集群
集群 —— 托管版、专有版、Serverless版
节点 —— Master Node、Worker Node
命名空间(Namespace)
Pod
副本控制器 (Replication Controller)
副本集(Replica Set)
部署(Deployment)
服务(Service)
标签(Labels)
存储卷(Volume)—— PV、PVC
Ingress

镜像准备
Dockerfile定义,这里因为涉及到分布式session的支持(参考[redission-tomcat:快速实现从单机部署到多机部署]),所以加了一些相应的jar依赖与替换配置,根据自身实际情况编写Dockerfile。
FROM tomcat:8.5.43-jdk8-openjdk
# 清除无用或需替换的文件,修改容器时区为上海时区
RUN rm -rf /usr/local/tomcat/webapps/* && \
rm -f /usr/local/tomcat/conf/context.xml && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 复制配置文件
COPY ./target/classes/redisson-tomcat/* /usr/local/tomcat/conf/
# 复制需要依赖的jar包
COPY ./dockerimage-depends/*.jar /usr/local/tomcat/lib/
# 替换catalina.sh 解决时区问题
COPY ./dockerimage-depends/catalina.sh /usr/local/tomcat/bin/
# 复制部署war包
COPY ./target/biz-server.war /usr/local/tomcat/webapps/EXPOSE 8080
# 启动时运行tomcat,覆盖默认的启动指令
# 使用catalina.sh run 则catalina.out中日志打印不充分, 使用startup.sh 因为是后台运行,执行就退出了,docker容器也退出了,所以添加tail -F 让其保持前台运行
#CMD ["catalina.sh", "run"]
CMD /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/logs/catalina.out
创建集群(托管版)
参考:https://help.aliyun.com/document_detail/85903.html
专有网络VPC:同一个专有网络中的节点之间,Pod之间可互联
虚拟交换机:多选择几个不同可用区的虚拟交换机
SNAT:如果VPC 不具备公网访问能力,选中配置SNAT会创建 NAT 网关并自动配置 SNAT 规则。如果使用云数据库需要配置IP白名单,或微信公众号配置IP白名单,则服务需要公网IP,有些ECS节点具有公网IP会优先使用,对于没有公网IP的节点或虚拟节点,需要配置SNAT获取公网IP。
添加节点
参考:https://help.aliyun.com/document_detail/86919.html
只能添加同一个地域的ECS节点
自动添加:会替换系统盘,原系统盘会被释放(谨慎!)
手动添加:需在ECS上执行指定命令安装必要的软件依赖
下图所示在集群中添加了三个ECS节点与一个虚拟节点(virtual-kubelet)

添加虚拟节点
参考:https://help.aliyun.com/document_detail/118970.html
添加虚拟节点时指定虚拟交换机,则只能使用指定虚拟交换机所在的可用区资源(如虚拟交换机在杭州G区,则在虚拟节点上调度Pod时只能调度到G区的服务资源,不能调度到H区或其它区的资源)
虚拟节点配置信息可随时更新(如更换虚拟交换机)
虚拟节点是通过在应用目录中添加ack-virtual-node实现

创建应用(Deployment)
镜像创建:参考 https://help.aliyun.com/document_detail/90406.html
根据模板创建(yaml模板):参考 https://help.aliyun.com/document_detail/86512.html
如下图所示创建了部署要求中的业务服务,及视觉服务的两层服务

负载均衡
有三种方式可实现某一层服务集群的负载均衡
虚拟集群IP:集群中Pod或Node上可访问,集群外不能访问
内网负载均衡:分配内网IP,VPC中可访问,不一定在集群中
外网负载均衡:分配外网IP,外部可访问
对于业务服务,需要外网访问,所以创建外网负载均衡,将域名解析到外网IP;对于两层视觉服务,只需要在集群中提供访问,可以使用虚拟集群IP(比内网负载均衡效率高)

存储管理
目前虚拟节点只支持挂载emptyDir(临时), NFS(NAS), ConfigFile
NAS参考:https://help.aliyun.com/document_detail/27518.html
NAS可挂载到ECS上,通过ssh到ECS来访问
下图示例了如何将NAS目录挂载到容器下的某个目录

手动伸缩
手动对Deployment的Pod进行横向扩展或缩放

自动伸缩
根据CPU与内存的负载自动进行伸缩
因为一般检测到负载超过阈值及启动容器都需要时间,延迟可能对业务造成影响,所以一方面可对负载阈值设置低一点,另一方面如果规律性较高,使用定时伸缩。

定时伸缩
通过cronhpa-controller实现
参考:https://github.com/AliyunContainerService/kubernetes-cronhpa-controller

通过模板创建一个定时伸缩应用(注意默认是GMT时间,配置时需要减8小时)

目前没有提供控制台管理,更新指令参考:
#查看
kubectl describe cronhpa cronhpa-herpes-slave
#编辑
kubectl edit cronhpa/cronhpa-herpes-slave -n default
#删除
kubectl delete cronhpa/cronhpa-herpes-slave -n default
快速构建
首先需要在deployment上创建一个重新部署的触发器,创建完后会生成一个url,只需要get请求这个url就可以触发deployment重新拉取镜像完成部署。

借助jenkins,实现服务的快速构建。

部署脚本参考
#!/bin/bash work_dir=/var/lib/jenkins/workspace/$1
depends_dir=/home/jenkins/dockerimage-depends/
# 将额外的依赖jar包复制到docker build的上下文中,便于复制到镜像里的tomcat目录下
cp -R $depends_dir $work_dir
# 在本地打镜像
cd $work_dir
docker build -t biz-server:latest .
# 将镜像push到阿里云镜像仓库服务
sudo docker tag biz-server:latest registry.cn-hangzhou.aliyuncs.com/biz/biz-server:latest
sudo docker push registry.cn-hangzhou.aliyuncs.com/biz/biz-server:latest
# 通过触发器触发重新部署完成上线
curl https://cs.console.aliyun.com/hook/trigger?token=xxxxxxxxxxxxxxxx
容器访问
1. 获取容器名称(见下图)

2. 在配置有Kubernetes访问权限的ECS上执行如下命令即可进入容器
kubectl exec -it herpes-master-6447d58c4b-cqznf bash

数据访问
1. ssh连接到挂载NAS云盘的ECS上
2. 进入对应挂载目录查看,目前有业务服务的日志,视觉服务的图片与日志

部署结构
应用相应组件最终搭建符合开头部署要求的集群结构如下

总结
该部署方案对于不具备一定容器基础的人来说门槛相对较高,并且可能服务推出时间不长,文档方面还不是太完善,笔者在实践过程中也踩了不少坑,目前集群服务运行稳定,节约成本在2/3以上,并且伸缩非常方便。如果你刚好也有这样的业务场景与需求,可以关注公众号“空山新雨的技术空间”交流。本文也有ppt版本,如有需要可以在公众号主页发送“k8s”获取下载方式。
推荐阅读
作者:空山新雨
欢迎关注,一起交流企业技术实战与IT领域的点滴

k8s云集群混搭模式落地分享的更多相关文章
- k8s云集群混搭模式,可能帮你节省50%以上的服务成本
现在大部分中小企业或团队都是使用云平台来部署自己的服务,如阿里云,亚马逊云等.一般来说,业务的负载都具备一定的规律,比如每天集中在某几个小时,或呈现时间段周期性波峰.波谷交替的现象,如下图 如果使用E ...
- 冰河教你一次性成功安装K8S集群(基于一主两从模式)
写在前面 研究K8S有一段时间了,最开始学习K8S时,根据网上的教程安装K8S环境总是报错.所以,我就改变了学习策略,先不搞环境搭建了.先通过官网学习了K8S的整体架构,底层原理,又硬啃了一遍K8S源 ...
- 大规模 K8s 集群管理经验分享 · 上篇
11 月 23 日,Erda 与 OSCHINA 社区联手发起了[高手问答第 271 期 -- 聊聊大规模 K8s 集群管理],目前问答活动已持续一周,由 Erda SRE 团队负责人骆冰利为大家解答 ...
- 案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul
#案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul #项目背景 多套业务系统, 所有节点注册到consul集群,方便统一管理 使用consul的dns功能, 所有节点hostnam ...
- [k8s]zookeeper集群在k8s的搭建(statefulset模式)-pod的调度
之前一直docker-compose跑zk集群,现在把它挪到k8s集群里. docker-compose跑zk集群 zk集群in k8s部署 参考: https://github.com/kubern ...
- K8s集群安装和检查(经验分享)
一.组件方式检查 1. Master节点: root>> kubectl get cs 2. Node 节点: 无 二.服务方式检查 1. Master 节点: root>> ...
- [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html 当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...
- 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?
作者 | 蚂蚁金服技术专家 沧漠 关注『阿里巴巴云原生』公众号,回复关键词"1024",可获取本文 PPT. 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器 ...
- K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 张振(守辰) ...
随机推荐
- 图像处理-裁剪具有透明背景的png
我遇到了需要裁剪具有透明背景的png的问题,用 https://www.yasuotu.com/editor 这个压缩图网站解决了问题. 这里可以选择裁剪的宽度和高度,记得点击确定按钮. 裁剪完成后, ...
- 基于python的selenium常用操作方法(2)
9 多表单切换 在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这 ...
- (四)初识NumPy(函数和图像的数组表示)
本章节主要介绍NumPy中的三个主要的函数,分别是随机函数.统计函数和梯度函数,以及一个较经典的用数组来表示图像的栗子!,希望大家能有新的收货,共同进步! 一.np.random的随机函数(1) ra ...
- vue发送ajx请求 axios
一. 简介 1.vue本身不支持发送AJAX请求,需要使用vue-resource(vue1.0版本).axios(vue2.0版本)等插件实现 2.axios是一个基于Promise的HTTP请求客 ...
- mysql压缩备份导入导出
mysqldump工具自带选项没有对导出备份文件压缩功能,可结合gzip只使用一条命令压缩导出文件,方法如下: mysqldump压缩导出:# mysqldump -h192.168.0.3 -P33 ...
- MySQL for OPS 10:MyCAT 分布式架构
写在前面的话 在学习的索引的时候,有提到,当数据表数据达到 800W 的时候,索引的性能就开始逐步下降.对于一个公司而言,主要业务数据表达到 1000W 都很容易.同时这张表一般都是业务常用的表,操作 ...
- spring cloud 项目创建过程
在使用spring cloud 项目创建微服务项目时,遇到过很多坑,现在我将整理如下: 条件:Idea 开发工具 maven 项目 1. 创建一个空的mvn项目. 2. 创建完了就添加Module,首 ...
- wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)
第一次写博客,如有错误,请大家及时告知,本人立即改之. 如果您有好的想法或者建议,我随时与我联系. 如果发现代码有误导时,请与我联系,我立即改之. 好了不多说,直接贴代码. 一般的错误,使用下面三个就 ...
- 20个Python代码段,你需要立刻学会,好用到哭!
Python是一种非BS编程语言.设计简单和易读性是它广受欢迎的两大原因.正如Python的宗旨:美丽胜于丑陋,显式胜于隐式. 记住一些帮助提高编码设计的常用小诀窍是有用的.在必要时刻,这些小诀窍能够 ...
- 【面试突击】-RabbitMQ常见面试题(三)
1.什么是RabbitMQ?为什么使用RabbitMQ? 答:RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的,消息中间件: 可以用它来:解耦.异步.削峰. 2.RabbitMQ有 ...