PAAS平台通过网络进行程序提供的服务称之为SaaS(Software as a Service),
而云计算时代相应的服务器平台或者开发环境作为服务进行提供就成为了 PaaS(Platform as a Service)。
不同的PaaS服务支持不同的编程语言,比如.Net、Java、Ruby等,而有些PaaS支持多种开发语言。
由于PaaS层位于IaaS和SaaS之间,所以很多IaaS及SaaS服务商很自然的就在本身的服务中加入了PaaS,
打造成一站式的服务体系。
大致来看,PaaS的实现分为两种:以虚拟机为基础或是以容器为基础。前者的代表是AWS,后者的代表则是GAE, CloudFoundry和Heroku。前文已经提到,AWS是基于虚拟机技术来打造自己的PaaS平台,其架构模式大致如上图所示:
具体而言,AWS基于如下构件打造了Beanstalk:首先是负载均衡层(ELB),该层需要将用户的请求投射到对应的服务器实例,同时,负载均衡层还需要。当应用实例出现扩容时,需要动态将调整的服务器实例注册到对应的域名上,以完成分流;中间是Web服务器层,目前ElasticBean支持Java、Python和PHP等多种编程语言,尽量为编程人员提供多样性的选择,开放性基本是所有PaaS平台的标配。在服务后端,Beanstalk基本依托于AWS本身的服务生态系统为应用提供服务,比如RDS、S3、DynamoDB等。
路由模块:该模块的基本功能是将终端用户请求路由到对应的服务器实例,并提供应用动态注册等功能。目前绝大多数的实现是基于ngnix,同时也需要使用简单的lua脚本完成应用注册和路由查询等基本功能;
服务管理模块:该模块会为开发人员和运维人员提供管理接口,其基本功能包括创建应用实例、配置应用运行参数、启停应用、发布应用程序、扩容或缩容等。服务管理模块也需要提供相应的客户端被用户使用,如命令行或是用户界面等;
应用容器模块:应用容器是PaaS平台的核心,其主要功能是管理应用实例的生命周期,汇报应用的运行状态等。目前来看,应用容器可以基于虚拟机来实现(如AWS),也可以使用Linux容器技术来实现,最早使用的是LXC,CloudFoundry使用的是自己的warden,同样也是基于cgroup,现在最新的是docker;
应用部署模块:应用部署模块需要将应用程序打包成为可直接部署的发布包。该模块是实现PaaS平台开发性的关键。由于现有通用的PaaS平台需要支持多种编程语言和框架,如Java, Python, Ruby和PHP等,当应用发布时,PaaS平台需要根据不同的编程语言将应用打包成为通用的发布包,然后传递给容器模块部署。应用部署模块是实现这一过程的关键,目前来看起源于Heroku的buildpack已经被大家广发接受;
块存储模块:该模块主要用于存储应用的发布包,需要保证程序包的长久存储和。目前AWS的Beanstalk直接使用S3,CF可以使用网络文件系统NFS或是其他任何分布式文件存储系统(如HBase);
数据存储模块:该模块需要保存应用和服务的基本信息,可以基于任何现有的数据库技术实现,如MYSQL或是MONGODB等;
监控模块:该模块的作用是持续监控应用的运行状态,比如健康状态(是否存活)、资源使用率(CPU、内存、硬盘、网络等)和可用性等。这些指标会成为整个PaaS平台运维的关键,也为自动弹性伸缩奠定基础;
用户认证模块:该模块需要保证应用程序的安全性和隔离性,通常而言,公有云的提供商会使用OAuth等技术集成现有的用户认证服务;
消息总线模块:该模块也是最重要的模块,由于PaaS平台所搭建的是一个大规模分布式环境,通常而言,规模在数百台到上千台的机器数量,所有模块之间的通讯会变成一个核心的问题。所以消息总线会变成系统之间通讯的基础,通常需要支持pub/sub模式。
接下来我们看下下面几个简单的paas基本运维操作
[root@server ~]# docker inspect -f {{.NetworkSettings.Ports}} 6bb551e4b97d
map[3306/tcp:[] 8080/tcp:[{0.0.0.0 8080}]]
[root@server ~]# docker inspect -f {{.Config.Volumes}} 6bb551e4b97d
map[/var/lib/cattle:{} /var/lib/mysql:{} /var/log/mysql:{}]
[root@server ~]# docker inspect -f {{.Config.Entrypoint}} 6bb551e4b97d
[/usr/bin/entry]
[root@server ~]# docker top 6bb551e4b97d
UID PID PPID C STIME TTY TIME CMD
root 7851 7835 0 08:19 ? 00:00:00 /usr/bin/s6-svscan /service
root 7875 7851 0 08:19 ? 00:00:00 s6-supervise cattle
root 7876 7851 0 08:19 ? 00:00:00 s6-supervise graphite_exporter
root 7877 7851 0 08:19 ? 00:00:00 s6-supervise mysql
root 7878 7875 12 08:19 ? 00:30:44 java - XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Xms128m -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/cattle/logs -Dlogback.bootstrap.level=WARN -cp /usr/share/cattle/cd62f7c4954133b023a2baf35df47f69:/usr/share/cattle/cd62f7c4954133b023a2baf35df47f69/etc/cattle io.cattle.platform.launcher.Main
102 7896 7877 7 08:19 ? 00:17:07 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root 8056 7878 0 08:19 ? 00:02:15 websocket-proxy
root 8063 7878 0 08:19 ? 00:00:07 go-machine-service
root 8067 7878 0 08:19 ? 00:00:00 webhook-service
root 8073 7878 0 08:19 ? 00:00:00 secrets-api server --enc-key-path .
root 8078 7878 0 08:19 ? 00:00:05 rancher-compose-executor
root 8090 7878 0 08:19 ? 00:00:11 rancher-catalog-service --config repo.json --refresh-interval 300
root 8095 7878 0 08:19 ? 00:00:00 rancher-auth-service
root 8165 7878 0 08:19 ? 00:00:00 telemetry client
[root@server ~]# docker diff 6bb551e4b97d
C /tmp
C /tmp/hsperfdata_root
A /tmp/hsperfdata_root/8
A /tmp/jetty-0.0.0.0-8081-cd62f7c4954133b023a2baf35df47f69-_-any-5919026492591312718.dir
C /service
C /service/cattle
A /service/cattle/event
A /service/cattle/supervise
A /service/cattle/supervise/control
A /service/cattle/supervise/lock
A /service/cattle/supervise/status
C /service/graphite_exporter
A /service/graphite_exporter/supervise
A /service/graphite_exporter/supervise/control
A /service/graphite_exporter/supervise/lock
A /service/graphite_exporter/supervise/status
A /service/graphite_exporter/event
C /service/mysql
A /service/mysql/supervise
A /service/mysql/supervise/status
A /service/mysql/supervise/control
A /service/mysql/supervise/lock
A /service/mysql/event
C /service/.s6-svscan
A /service/.s6-svscan/lock
A /service/.s6-svscan/control
C /etc
C /etc/mysql
C /etc/mysql/my.cnf
C /run
C /run/mysqld
A /run/mysqld/mysqld.sock
A /run/mysqld/mysqld.pid
[root@server ~]#
[root@server ~]# docker ps -lq
6b9ef06bb4f0
[root@server ~]#