在 《k8s云集群混搭模式,可能帮你节省50%以上的服务成本》一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具备时间段波峰、波谷交替规律的业务节约成本,提升服务伸缩效率的部署方案。本文对该方案的具体落地步骤与基本运行维护进行分享,为有此需求者提供参考。html
Dockernode
容器:应用运行的形式git
镜像:容器的定义,或打包形式github
容器镜像服务:镜像仓库web
k8s云混合集群redis
集群 —— 托管版、专有版、Serverless版docker
节点 —— Master Node、Worker Node数据库
命名空间(Namespace) tomcat
Podbash
副本控制器 (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实现
镜像建立:参考 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领域的点滴