分享

从无到有,搭建一个简单版的JAVA PAAS云平台

xioaxu790 发表于 2015-1-5 20:09:37 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 30425
问题导读
1、怎样搭建一个入门的PAAS云平台?
2、如何设置多台宿主机路由?
3、设置PAAS路由,需要做哪些准备?





前言
PAAS:platform as a service,平台即服务,把软件研发的平台作为一种服务,提供给用户使用。当前PAAS平台服务商,诸如google app engine,sina app egine,cloud foundry等,都是程序员们的福音,可以避免从无到有搭建程序运行的平台,多了一个选择。

本着学习PAAS的态度,构建一个简易版PAAS平台,构建JAVA运行时环境,提供tomcat servlet容器服务。当然,不局限于JAVA,PHP、ROR、nodejs等,理论上行得通。但这里以构建Tomcat Servlet环境为主。

说是简易版,基本靠谱,所有的操作,都需要手动操作,高端功能组件,诸如计费、安全等,暂时还不涉及。仅搭建一个原型,别期望过多,可能为了表示最核心的PAAS的核心部分,其它更为先进的功能,都是在核心的功能上进行的拓展。但这对认识PAAS,可能会有点帮助。

一般来说,虚拟化建立在性能强劲的物理机器上,IAAS(基础即服务)建立在虚拟化技术的基础上,PAAS建立在IAAS基础上,SAAS(软件即服务)可以建立在PAAS的基础上。可以从总体上感知各种服务之间关系,这样做资源利用会更高效些。

PAAS,每一个Tomcat运行平台之间,诸如内存空间、CPU使用、磁盘IO等资源,需要做到相互隔离,并且可以配置。目前Linux服务器一般用KVM、XEN、LVS等虚拟化方案,但与Lxc(Linux Container)相比,有些重。Lxc是一种Linux内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性(更多解释,见http://baike.baidu.com/view/6572152.htm)。一般被用作隔离的虚拟容器使用。

目前vmware的cloud foundry开源的PAAS,单独使用了cgroups + c 语言组件使用了比Lxc更为轻量的方案,有时间会谈一下。Lxc,借助cgroups组件,可以做到精确到CPU、内存、IO性能等,但cgroups无法做到磁盘限额,借助LVM的强大功能,可以做到单个应用磁盘容量的精确控制。

Lxc的另一个替代品,OpenVZ,使用上可能会简单些,起码在磁盘限额方面,比Lxc做的更好一些。


准备
VirtualBox 4.1
所有操作环境,都是基于免费的VritualBox虚拟机基础上。若有兴趣尝试者,也建议安装一个。在进行后面步骤之前,需要熟悉VritualBox的各项操作,都很简单。

官网

Ubuntu 12.04 Server
Ubuntu 12.04服务器版,在虚拟支持方面,比Centos等系统更友好,也更完善。其已经内置对LXC等的支持,十分简单、易用。

LVM
Linux下逻辑磁盘管理工具,可能需要一点点了解。它是一个好东西,Linux系统管理员应该不会陌生,可以对磁盘、分区动态进行容量管理维护,十分强大。

LXC
Linux Container,在一个ubuntu服务器上虚拟若干个互相隔离的子系统,每一个子系统用于托管Java Web应用。

安装
在Virtualbox中安装Ubuntu 12.04,若32位操作系统,只能安装32位Ubuntu服务器,若是64位版本,可以安装64位服务器版本。

网络连接,选择桥接模式即可(我的网络环境为DHCP),利用了现有的网络设施,便于安装一些组件。

安装后,确定openssh服务器已经安装,否则,将很麻烦。记录下IP地址(这里DHCP地址最好)记下IP地址,使用SSH客户端Xshell连接,进行维护操作。

Ubuntu安装时,记得选择LVM管理磁盘;安装好之后,还是可以使用LVM管理磁盘的。


虚拟机安装
挂载新磁盘
这一步不是必须,仅为了建立名称为lxc的卷组。有了卷组,可以方便进行虚拟机的磁盘容量管理,同时也用于单独存放虚拟机的文件系统。

安装好ubuntu 12.04 之后,VritualBox中为当前系统“创建一个新的虚拟硬盘”,假设磁盘名称为NewHardDsik1.vmdk。

很多安装都需要切换到root用户角色下操作,这里优先切换到root管理员下
  1. sudo -i
复制代码


安装lxc和lvm
  1. apt-get install lxc
复制代码


备注:若安装Ubuntu时,若没有选择LVM分区管理等,则默认情况下,lvm2软件没有被安装,单独安装lvm2软件包:
  1. apt-get install lvm2
复制代码


建立lxc卷组
为第二块磁盘创建一个物理卷
  1. pvcreate /dev/sdb
复制代码


创建一个物理卷组名称为lxc:
  1. vgcreate lxc /dev/sdb
复制代码


输入vgdisplay查看卷组
  1. root@localhost:~# vgdisplay
  2.   --- Volume group ---
  3.   VG Name               lxc
  4.   System ID            
  5.   Format                lvm2
  6.   Metadata Areas        1
  7.   Metadata Sequence No  18
  8.   VG Access             read/write
  9.   VG Status             resizable
  10.   MAX LV                0
  11.   Cur LV                3
  12.   Open LV               1
  13.   Max PV                0
  14.   Cur PV                1
  15.   Act PV                1
  16.   VG Size               8.00 GiB
  17.   PE Size               4.00 MiB
  18.   Total PE              2047
  19.   Alloc PE / Size       768 / 3.00 GiB
  20.   Free  PE / Size       1279 / 5.00 GiB
  21.   VG UUID               SCoO4G-NImr-15WF-CMha-1QAV-7nm3-gnHGz2
复制代码


配置属性
lxc所有通用配置位于/etc/lxc/lxc.conf,基于默认配置基础上创建一个最小配置lxc_min.conf:
  1. #vi /etc/lxc/lxc_min.conf
  2. lxc.network.type = veth
  3. lxc.network.link = lxcbr0
  4. lxc.network.flags = up
  5. lxc.cgroup.cpuset.cpus = 0
  6. lxc.cgroup.cpu.shares = 1024
  7. lxc.cgroup.memory.limit_in_bytes = 512M
  8. lxc.cgroup.memory.memsw.limit_in_bytes = 768M
复制代码



创建虚拟机
创建一个虚拟机:
  1. lxc-create -t ubuntu -n s4 –f /etc/lxc/lxc_min.conf -B lvm --lvname s4 --vgname lxc --fstype ext4 --fssize 1000M
复制代码

-t  : 创建的虚拟机模板名称,默认为ubuntu 12.04最小安装版,非常小

-n : 创建的虚拟名称,需要指定,这里设置为s4,默认情况下也是新建虚拟机的机器名,即 hostnmae

-f : 指定配置文件

-B : 虚拟机磁盘的系统,为了控制单个虚拟机的磁盘容量限制,这里使用lvm进行管理。

--lvname :虚拟机使用卷名,默认使用虚拟机名

--vgname :卷组名称,这个一定要有,默认名称为lxc,可以单独指定。若不指定此选项,则要求名称为lxc的卷组已经存在,否则,请指定已经卷组名。

--fstype :文件系统类型,默认为ext4类型

--fssize :磁盘容量,默认为1G,单个应用所占有磁盘空间,一般安装之后,除了系统文件等,也就剩下500M作用可以使用。

简化后的命令:

lxc-create -t ubuntu -n s4 –f /etc/lxc/lxc_min.conf  -B lvm

指定lvm创建的虚拟机磁盘文件位置为 /dev/lxc/s4

第一次安装,会耗费些时间,需要从网络上下载一些软件包进行安装,若没有网络的话,会很惨。第二次安装之后,一些软件包被缓存了之后,会很快的。

另外指定磁盘格式为lvm,创建时,将十分消耗内存。

此虚拟机为最小安装方式,相当绿色,可能会缺失一下软件包,需要登陆进入之后进行安装。  

启动虚拟机
  1. lxc-start -n s4 -d
复制代码


注意一定要加 -d 参数,标记为后台运行,否则,将不太利于管理了。

登录管理
  1. lxc-console -n s4
复制代码

lxc-console到了SSH的效果,默认的用户名和密码都是ubuntu,输入之后,正常管理。

退出管理
ctrl + a ,然后敲入字母q,即可退出当前系统s4。

SSH连接
登陆进入之后,通过ifconfig命令获得IP地址,使用SSH可连接。
  1. ssh ubuntu@10.0.3.138
复制代码


hostname解析
建立一个虚拟机之后,登陆进去之后才能够获得IP,下次重启,动态IP可能会变化,对维护操作带来不便。在创建虚拟时,我们已经指定了虚拟机名称,同时也是虚拟hostname的名称,通过虚拟机hostname建立SSH连接最是方便了。

一般采用:
  1. vi /etc/resolv.conf
  2. nameserver 10.0.3.1
  3. nameserver 8.8.8.8
复制代码

一定要注意顺序,nameserver 10.0.3.1用以解析虚拟机,下面一条随便填写,只要能够使用即可。这里使用免费的8.8.8.8替代。
  1. nslookup s4 & ping s4
复制代码

测试是否解析正常。

但是一旦系统重启,上述配置会消失,补救:
  1. #vi /etc/resolvconf/resolv.conf.d/tail
  2. nameserver 10.0.3.1
  3. nameserver 8.8.8.8
复制代码


保存,使之生效:
  1. #/etc/init.d/resolvconf restart
复制代码

这样下次重启宿主机,可以不用担心DNS失效。

以下方法,可以不用去做:

可不用修改LXC虚拟机s4的 /etc/dhcp/dhclient.conf 配置文件
  1. send host-name "s4";
复制代码


当然,修改后,需要生效之:
  1. /etc/init.d/networking restart
复制代码


SSH正常连接
  1. ssh ubuntu@s4
复制代码


在宿主机下基于SSH使用scp命令执行文件传输等,或执行管理维护命令:
  1. #scp jdk-6u33-linux-i586.bin ubuntu@s4:/home/ubuntu
  2. #scp apache-tomcat-7.0.27.tar.gz ubuntu@s4:/home/ubuntu
复制代码


在S4中安装JDK之后,设置环境变量:
  1. ubuntu@s4:~$sudo vi /etc/environment
  2. JAVA_HOME=/usr/java/jdk1.6
  3. CLASSPATH=/usr/java/jdk1.6/lib
  4. PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$JAVA_HOME/bin:$CLASSPATH"
  5. export PATH
复制代码


保存退出,然后执行:
  1. ubuntu@s4:~$sudo update-alternatives --install /usr/bin/javac javac  /usr/java/jdk1.6/bin/javac  1071
  2. ubuntu@s4:~$sudo update-alternatives --install /usr/bin/java  java  /usr/java/jdk1.6/bin/java  1071
复制代码

同时设置tomcat解析到s4的/home/ubuntu目录下,mv改名为tomcat,注意设置.sh脚本的启动权限。

安装好JDK,设置tomcat开机自动运行的脚本/etc/init.d/tomcat (后面没有.sh后缀,参考原文,需翻*墙)
  1. #sudo vi /etc/init.d/tomcat
复制代码


完整内容:
  1. #!/bin/sh
  2. #tomcat auto-start
  3. #export JAVA_HOME=/usr/lib/jvm/java-1.6.0-sun // 已设置JAVA_HOME了,此句可省略。
  4. case $1 in
  5. start)
  6. sh /home/ubuntu/tomcat/bin/startup.sh
  7. ;;
  8. stop)
  9. sh /home/ubuntu/tomcat/bin/shutdown.sh
  10. ;;
  11. restart)
  12. sh /home/ubuntu/tomcat/bin/shutdown.sh
  13. sh /home/ubuntu/tomcat/bin/startup.sh
  14. ;;
  15. *)
  16. echo 'Usage:tomcat7 start|stop|restart'
  17. ;;
  18. esac
  19. exit 0
复制代码


添加到启动项中:
  1. #sudo chmod +x /etc/init.d/tomcat ; sudo update-rc.d tomcat defaults
复制代码


关闭,便于后面克隆等操作:
  1. #sudo lxc-stop –n s4
复制代码


虚拟机克隆
上面虚拟机s4安装好之后,执行快速的克隆操作:
  1. lxc-clone -o s4 -n s5 -s -L 1000M
复制代码


-s 要克隆的景象快照,虚拟机s5和虚拟机s4保持一致了
-L 虚拟机s5的文件系统大小,默认为2G。这里指定和S4一样的文件系统容量。

虚拟机s4使用lvm管理磁盘,克隆后的s5自然也使用LVM,位置位于 /dev/lxc/s5。

这样,克隆出来的S5就对应一个具体的Tomcat Servlet平台。

克隆的速度比创建的速度就是快,5秒之内搞定。

启动s5
  1. lxc-start –n s5 –d && ssh ubuntu@s5
复制代码


输入java –version可以看到java已经安装成功,tomcat的目录为 /home/ubuntu/tomcat,执行启动脚本:
  1. /home/ubuntu/tomcat/bin/start.
复制代码


删除/注销
  1. lxc-destroy -n s7 -f
复制代码

-f 参数可以强制销毁正在运行中的虚拟s7

虚拟机自动启动
把虚拟s5设置为自动启动:
  1. ln -s /var/lib/lxc/s5/config /etc/lxc/auto/s5.conf
复制代码

下次宿主机重启,s5会自动启动。其它虚拟机设置于此类同。

按照以上办法,克隆s6,s7更多的虚拟机,执行SSH连接,部署WAR包,重启tomcat等,这一切操作可以在宿主机上创建一个sh脚本执行。

注意事项
lxc暂时还不能直接查看内存,CPU等信息,通过free、top或/proc/meminfo、/proc/cpuinfo 是不准确的,看到的都是宿主机的信息。

要想查看,到/sys/fs/cgroup/*/lxc/虚拟机名称下/查看。
  1. 查看虚拟机s5当前内存:
  2. #cat /sys/fs/cgroup/memory/lxc/s5/memory.usage_in_bytes
  3. 查看虚拟机s5内存上限
  4. #cat /sys/fs/cgroup/memory/lxc/s5/memory.limit_in_bytes
  5. 查看交换分区 + 内存的上限
  6. #cat /sys/fs/cgroup/memory/lxc/s5/memory.memsw.limit_in_bytes
  7. 有关cpu,或者cpuset,于此类似。
  8. 即时修改虚拟机s5的内存上限:
  9. echo 800M > /sys/fs/cgroup/memory/lxc/s5/memory.limit_in_bytes
复制代码

其它修改也是如此,很简单。
但若是主动mount /cgroup ,则以上位置会发生变化。

PAAS路由
单台宿主机路由
一台宿主机上存在若干个Tomcat Servlet平台,外部请求如何动态转发到相应的虚拟机对应平台上,本文环境是一台宿主机(想虚拟两台,但笔记本太烂),比较好办。

关掉防火墙
  1. ufw disable
复制代码

然后重启

安装nginx:
  1. apt-get install nginx
复制代码

创建目录 /home/test/hosts,一般用户可读写。

修改nginx配置文件,在http大括号体最好一行添加内容:
  1. vi /etc/nginx/nginx.conf
  2. inlcude /home/test/hosts/*.conf;
复制代码


建立虚拟机s5的Tomcat Servlet平台配置片段:
  1. vi /home/test/hosts/s5.conf
  2. server {
  3.     listen 80;
  4.     server_name s5.yong.com;
  5.     location / {
  6.         proxy_set_header X-Real-IP $remote_addr;
  7.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  8.         proxy_set_header Host $http_host;
  9.         proxy_pass http://s5:8080;
  10.     }
  11. }
复制代码


一个虚拟机一个配置文件,其它虚拟机配置于此类似,都丢在此目录下。nginx启动/重新加载时,自动会读取。

测试时,在本地的hosts文件,添加映射
  1. # 192.168.2.28 为宿主机IP
  2. 192.168.2.28 s5.yong.com
复制代码

使用浏览器即可访问。
一般使用非root用户操作nginx,使用iptables等防火墙工具进行端口映射,这里省略。
另外,要做到nginx不重新加载或重启,可能需要定制nginx路由部分了,比如淘宝采用了nginx + lua实现。
这里有一群淘宝牛人开源的nginx组件集 http://openresty.org/ ,可供参考。

多台宿主机路由
这个路由规则相当复杂,可以设置单独一台DHCP服务器,可以分配10.*.*.*私有IP。这样可以保证一个IP对应一个外网域名。
但,如cloud foudry 采用nginx + lua + ruby进行路由转发交换数据,更为复杂。
听说,Heroku则采用nginx + erlang进行路由处理。
有机会再说说这一部分吧。




已有(2)人评论

跳转到指定楼层
hahaxixi 发表于 2015-1-6 09:59:41
回复

使用道具 举报

nick_MojuM 发表于 2018-2-27 14:20:05
可以对PAAS层详细交流一下吗,像普遍的消息中间件总线,数据库服务总线建设
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条