一.概念
jexus:一款国产的运行在linux下的基于mono的高性能web服务器。国内有诸多中大型网站使用jexus作为web服务程序部署在linux平台上,jexus不开源,完全免费,可以随意使用。官网:https://www.jexus.org 成功案例:https://www.jexus.org/Examples.htm jexus作者:宇内流云
阿里云容器服务:阿里将自己的负载均衡,云服务器,nas文件存储,docker,网络安全,云监控等一览子产品做了深度整合。实现了高性能、可伸缩的容器应用管理服务,可以把一组云服务器做成群集,通过 Docker 容器来进行应用生命周期管理。阿里云容器服务极大简化了对网站发布,资源伸缩的工作量。
二.jexus网站在云容器服务部署的步骤
1.注册阿里云账号,开通阿里云容器服务 https://cs.console.aliyun.com
2.开通阿里云的文件存储服务 https://nas.console.aliyun.com创建一个文件系统
添加挂载点,在管理界面里面取得 文件系统ID 和 挂载地址,供群集统一挂载
3.选择集群节点,创建集群,服务器节点,负载均衡。
创建集群的同时,会提示创建负载均衡和节点。 其中节点可以是实时创建一个或者多个,也可以把现有的ecs服务器加入节点。不过一定要注意,现有ecs云服务器加入群集,原ecs服务器系统盘会被替换掉,也就是说整个被干掉。新创建的节点只能是按量收费的,加入现有ecs服务器,可以是包月包年的,根据情况决定如何处理。
负载均衡可以自动创建,也可以之后在绑定到群集。 负载均衡负责任务的调度,按指定算法把工作量分摊到不同节点的容器中服务。容器中的应用创建后,会自动把涉及到的节点添加到负载均衡的后台服务器清单中去。负载均衡还可以绑定证书,在负载均衡中实现网站的ssl单向或者双向加密认证。
在群集左边菜单的“”数据卷“”中,点击右边的创建,创建一个供群集内所有节点使用的数据卷,容器是无状态的,不适宜在容器内保存任何数据,一旦容器重启,所有数据都会丢失。这个数据卷用以存放网站的程序,资源,配置。一个数据卷同时被所有节点使用,这样,更新网站的程序和内容,只需要做一次。数据卷名随意填写,文件系统ID和挂载点域名在上一步骤获得。
完成操作后,telnet到集群的任意服务器节点下可以看到nas文件系统挂载到了节点主机的/mnt路径下.启动容器时,我们就把nas的文件卷从宿主操作系统映射到容器中去。
4.在群集的任意一个节点中,拉取基础的jexus镜像,对镜像内的配置做定制,commit镜像,push到自己的镜像仓库
2017年4月,jexus作者制作了一个镜像,我把这个镜像上传到了阿里云的镜像仓库。镜像地址 :registry.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:latest 该映像基于ubuntu系统
包括: 1,Jexus 5.8.2.11独立版 2,vim curl wget命令 3,ssh服务 4,asp.net System.Drawing 所需要的图形库 不支持ssh,web端口80,ssh端口22 默认网站有url安全检查和jexus的文件日志
我对这个镜像做了修改后 commit后提交到了镜像仓库,地址 registry.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:ddjexus
主要做了如下修改
1.网站默认端口改成8080 2.cpu数量改成auto 3网站配置改为不处理url安全监测(如果使用负载均衡,需要关掉这个选项,不然有可能会被误认为病毒攻击) 4.jexus的日志功能关闭(后台用log4net记录更好) 4.默认网站的文件路径改为 /var/ddhomework(默认路径是虚拟的,实际不存在,在运行容器时将绑定到宿主节点映射的nas卷)
熟悉dockr的同学可以下载latest版本的镜像,自己做配置修改,然后commit在push到自己的容器仓库(切记这个版本的jexus使用的是80端口,我的修改版使用的是8080端口)
如果不熟悉docker的同学,可以直接用ddjexus版本的镜像,把网站文件丢去nas文件系统,在容器应用页面设置好nas对应,就可以直接部署好.net网站到容器上了。 后面的容器应用和服务的创建都是根据这个镜像版本来描述。
从registry中拉取镜像:
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:[镜像版本号]
将镜像推送到registry:
$ sudo docker login --username=xxxxxxxxxxx registry.cn-shenzhen.aliyuncs.com
$ docker images 列出容器清单,得到当前容器的id 为 xxxxxxxxx
$ sudo docker commit xxxxxxxxx registry-internal.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:ddv3 ddv3为给以新镜像的版本号
$sudo docker images 得到新的imageid
$sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/ddtimer/[镜像名称]:[镜像版本号]
其中[ImageId],[镜像版本号]请你根据自己的镜像信息进行填写。
5.容器应用和服务的创建
我的理解,阿里云容器的应用当于根据镜像创建了一个包含容器各种配置信息的蓝本,容器服务就是群集属性的,根据蓝本部署调度到各个ecs服务器节点上。
创建应用会弹出一个应用基本消息,随意填,然后选择使用镜像创建
下一步,按选择镜像,弹出个镜像搜索窗口
,输入筛选条件,jexusv1,选择jexusv1的镜像
版本选择处选择我修改过的ddjexus版本,最后结果如下图 。
容器数量和节点数目有关,1个节点选择一个容器即可。如果有多个节点,只选择一个容器,那么容器只会部署在其中一台服务器节点。
EntryPoint 输入 /usr/bin/bootstrap.sh 这个镜像中包括的初始化脚本,容器创建时会执行,负责启动jexus和ssh服务器之类
端口映射处,把ecs节点的端口映射到容器的端口 主要就是ssh服务器和jexus服务的端口映射(如果是使用jexus作者发布的镜像,那么容器端口应该使用80而不是8080)
负载均衡和数据卷的设置
负载均衡路由配置的容器端口,填写容器中jexus的端口,右边填写负载均衡名字和前段的端口号 我这里写的例子是 容器jexus服务器使用8080端口,负载均衡前段使用80端口访问,转发到负载均衡名字为 SLB_name的后端服务器。 其中负载均衡需要提前设置好80端口的监听并记录下负载均衡的名字或者id,然后在这里替换掉 SLB_name
数据卷,主机路径和数据卷名填写在第三步操作中取得的信息,将nas文件系统挂载到节点的路径填上,容器路径如果使用我的定制镜像,必须输入/var/ddhomework . 这个路径和镜像中jexus的site目录对应。这样只要通过一台宿主机更新nas文件,所有部署的jexus容器都能访问到。
阿里云的负载均衡在创建群集是会自动创建。也可以在群集管理里面对应到现有的负载均衡,负载均衡设置中可以设置ssl证书,这样可以在容器内使用常规http访问,在负载均衡层使用https对外,减少服务的加密认证的压力。
其他选项设置,可以设置容器的伸缩过着。如果是一个容器对应一个ecs服务器,那么应该在集群管理的节点伸缩中,按相同标准设置。
平滑升级选线,需要开启负载均衡的健康检查,经过几次测试,jexus服务器在阿里的负载均衡开启健康检查后,会导致服务器卡死不响应的问题。据宇内流云说是jexus有病毒防护机制,健康检查会导致误杀。关闭url安全检查可以解决,不过经过我测试,没有效果,如果要开启负载均衡的健康检查还需要作者做一些针对性的改动才行。在这里@下宇内流云大神
所有设置完成后,按创建,将会创建一个应用,并且根据应用定义的容器数量和容器节点的数量在各个ecs节点启动服务。 启动了服务的节点,会被自动加入到负载均衡的后端服务器列表。
如果在nas卷中已经上传了网站文件,那么就可以尝试通过负载均衡的地址访问网页了。
由于所有的容器都是访问同一个nas文件卷,当我们更新网站内容是,只需要通过任意一个节点,上传更新文件即可。当后台有几十台服务器是,一台一台去更新和通过nas一次性发布,工作量完全不在一个层次了。
5.容器集群的缩容和扩容
1.可以手动扩张,在集群管理里面手动增加节点数量
手动节点扩容后,需要在服务中修改容器数量,如果容器和节点是一对一关系,容器数量要修改为和节点一致的数量。
2.设置自动的缩容扩容策略,在cpu或者内存到达一定使用率时,触发执行。
在群集-管理-节点伸缩中处理,如下图
以上就是这段时间对后台服务器实行容器集群改造的一些经验总结,这些经验是否正确,是否是最佳实践,还需要时间来检测。也期待更熟悉的同行交流经验,斧正谬错。
希望这篇总结文章能对计划在阿里云容器运行jexus服务器的朋友提供一些帮助。
附加跳坑指南:
1.容器日期和宿主日期不一致,相差8小时的解决
运行 dpkg-reconfigure tzdata 选择 6 亚洲,再选择69 上海 即可。
registry-internal.cn-shenzhen.aliyuncs.com/ddtimer/jexusv1:ddv3 版本更新了最新版jexus并处理了容器内时区问题 2017-04-28