k8s 启动命令cmd_k8s云集群混搭模式落地分享

本文分享了k8s + 虚拟节点混合集群的部署方案,详细阐述了从集群创建、节点添加、应用部署到自动伸缩的全过程,旨在帮助有类似需求的读者实现服务成本的有效降低和伸缩效率的提升。
摘要由CSDN通过智能技术生成

在 《k8s云集群混搭模式,可能帮你节省50%以上的服务成本》一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰、波谷交替规律的业务节约成本,提高服务伸缩效率的部署方案。本文对该方案的具体落地步骤与基本运行维护进行分享,为有此需求者提供参考。

部署要求

  1. 应能24小时不间断提供服务
  2. 在业务高峰期到来前能自动扩展指定数量的容器(提前对业务负载进行评估与压测,确定容器数)
  3. 在业务高峰期过后能自动收缩到指定数量的容器
  4. 能根据服务负载情况自动弹性伸缩,避免业务突发情况下服务能力跟不上
5928162a0e753e615c7c1c19fdbc76a2.png

基本概念

Docker

  • 容器:应用运行的形式
  • 镜像:容器的定义,或打包形式
  • 容器镜像服务:镜像仓库
b7bda71d8bcef591ba0b37ac5a947382.png

k8s云混合集群

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

镜像准备

Dockerfile定义,这里因为涉及到分布式session的支持(参考[redission-tomcat:快速实现从单机部署到多机部署]),所以加了一些相应的jar依赖与替换配置,根据自身实际情况编写Dockerfile。

2dcf56f89e8564fc73beb950198e3558.gif
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
2dcf56f89e8564fc73beb950198e3558.gif

创建集群(托管版)

参考: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)

824fef68aaf6f57b174f14112093b18f.png

添加虚拟节点

参考:https://help.aliyun.com/document_detail/118970.html

添加虚拟节点时指定虚拟交换机,则只能使用指定虚拟交换机所在的可用区资源(如虚拟交换机在杭州G区,则在虚拟节点上调度Pod时只能调度到G区的服务资源,不能调度到H区或其它区的资源)

虚拟节点配置信息可随时更新(如更换虚拟交换机)

虚拟节点是通过在应用目录中添加ack-virtual-node实现

df026cafc2ee0ff6065b10a24a939ba7.png

创建应用(Deployment)

镜像创建:参考 https://help.aliyun.com/document_detail/90406.html

根据模板创建(yaml模板):参考 https://help.aliyun.com/document_detail/86512.html

如下图所示创建了部署要求中的业务服务,及视觉服务的两层服务

1c09c6e2d182e7f85e901b21b7e4ee83.png

负载均衡

有三种方式可实现某一层服务集群的负载均衡

  • 虚拟集群IP:集群中Pod或Node上可访问,集群外不能访问
  • 内网负载均衡:分配内网IP,VPC中可访问,不一定在集群中
  • 外网负载均衡:分配外网IP,外部可访问

对于业务服务,需要外网访问,所以创建外网负载均衡,将域名解析到外网IP;对于两层视觉服务,只需要在集群中提供访问,可以使用虚拟集群IP(比内网负载均衡效率高)

8d6e07981b1f8af470e8e26897ac8cb9.png

存储管理

目前虚拟节点只支持挂载emptyDir(临时), NFS(NAS), ConfigFile

NAS参考:https://help.aliyun.com/document_detail/27518.html

NAS可挂载到ECS上,通过ssh到ECS来访问

下图示例了如何将NAS目录挂载到容器下的某个目录

23ef74d2beaa59204218c25e7a99a88a.png

手动伸缩

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

c2278712ee4762eef438e283ea3f2874.png

自动伸缩

根据CPU与内存的负载自动进行伸缩

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

141544126c50a85b1cede14994eee512.png

定时伸缩

通过cronhpa-controller实现

参考:https://github.com/AliyunContainerService/kubernetes-cronhpa-controller

140cfc783ce1162fb1609a17ec5df790.png

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

3dda5c7b6e95f9818ebf30ed96fa1b26.png

目前没有提供控制台管理,更新指令参考:

#查看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重新拉取镜像完成部署。

bd0c412355838b4f0779272dec74efcf.png

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

dbc89e226fef4bf0c51feaf26bfcac28.png

部署脚本参考

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

容器访问

1. 获取容器名称(见下图)

9671519ca548c33273f8c603d9a5d449.png

2. 在配置有Kubernetes访问权限的ECS上执行如下命令即可进入容器

kubectl exec -it herpes-master-6447d58c4b-cqznf bash
7c2646bf8fbb4a0c764d5c84f0c5519f.png

数据访问

1. ssh连接到挂载NAS云盘的ECS上

2. 进入对应挂载目录查看,目前有业务服务的日志,视觉服务的图片与日志

43ef4802df7edf523842d6395a2e39b2.png

部署结构

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

98014ac69aeee9a7a29d239f1158230c.png

总结

该部署方案对于不具备一定容器基础的人来说门槛相对较高,并且可能服务推出时间不长,文档方面还不是太完善,笔者在实践过程中也踩了不少坑,目前集群服务运行稳定,节约成本在2/3以上,并且伸缩非常方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值