Solaris容器-合并服务器和应用程序
本文英文原文: http://www.sun.com/software/solaris/howtoguides/containersLowRes.jsp
这个指南用来指导那些不熟悉在Solaris 10 OS上利用Solaris容器技术合并服务器到一个服务器上的用户、系统管理员和开发者。本指南以一个简单的Solaris容器概述开始,并有合并两个Web服务器应用程序和一个email服务器应用程序到一个单个的服务器上的例子。
本指南一步一步地通过合并程序并附带例子和说明来指导用户。看过这个指南之后,用户能够创建容器通过:
◆ 创建资源池
◆ 定义区域
◆ 使用公平共享调度程序(FSS)分派CPU份额
◆ 安装并引导区域
◆ 配置从区域访问裸设备(raw devices)
目录
1. Solaris 容器: 概述
2. Solaris 容器: 例子
3. 更多信息
Solaris 容器: 概述
Solaris 容器—Sun操作系统虚拟化技术—由不同的技术组合到一起工作来提供基于底层操作系统的改进的资源管理和和环境隔离。使用Solaris容器, 组织能够解决丁如何在程序和服务之间分配资源,确保他们之间不发生干涉。
这个指南使用的例子是,一个组织想合并三个应用程序-一个邮件服务器和两个WEB服务器到一个4个CPU服务器上。
利用服务器的虚拟化,应用程序可以被安全地合并到尽量少的服务器中。
Solaris区域
作为合并成果的一部分,评估将在合并系统上运行的应用程序的需求是非常重要的。在这个例子中,邮件服务器和web服务器运行在隔离的环境中,看起来就像自然地运行在分开的机器上。这种想法是可以实现的,通过称作Solaris区域的Solaris容器技术,提供了在一个机器上的各自的环境和逻辑上的应用程序之间彼此隔离。每个应用程序使用一个专门的命名空间在里面运行,不能够查看、监视和影响在另一个区域中运行的应用程序。如图 2.
三个应用程序都有它自己的Solaris区域。
动态资源池
在这个例子中,有两种类型的应用程序,其中一个完全独占的CPU - 一个邮件服务器,另一个是相当灵活的能够共享CPU - 两个web服务器。为了实现这些不同级别的隔离,我们使用一个叫做动态资源池的Solaris容器技术,让CPU资源专用于特定的应用程序。在这个例子中,邮件服务器需要一个单独的资源池,而web服务器能共享另一个资源池。就像我们在图3看到的,我们给资源池1分配一个CPU,资源池2分配3个CPU。
邮件服务器使用资源池1, web服务器共享资源池2。
公平共享调度程序
虽然两个web服务器能够共享系统上剩余的CPUs,但是他们每一个都需要它可利用的最低CPU资源保证。使用称作公平共享调度器的Solaris容器技术这是可能的。这个软件可以让CPU资源按比例地分配给应用程序。也就是说,每一个应用程序能够获得相应份额的共享CPU资源。看图4。
五个共享份额中,Web服务器1获得3个,Web服务器2获得2个。
使用所有这些Solaris容器技术在一个新服务器上创建一个如图5所示的环境。现在系统包含了三个容器:一个独占CPU资源,其它两个共享CPU资源。
一个容器的区域在一个专用的资源池上,另外两个容器的每个容器使用一个共享的资源池。
区域的两种类型
运行在Solaris 10上的所有系统包含一个主域,称作全局区域。全局区域是原始的Solaris操作系统实例。它能够访问所有的物理硬件和能够控制所有的进程。它也有权创建和控制新的区域,称作非全局区域,应用程序运行在其中。非全局区域没有运行在全局区域中-他们平级运行,虽然全局区域能够看到非全局区域的内部,知道他们如何被配置的,监视并控制他们。
像其它区域一样,这个全局区域也和一个资源池关联。在我们的例子中,就是资源池2。在这个情况下,它和web服务器共享CPU资源。当公平共享调度器启用的时候,全局区域默认共享一个份额。因此图5需要做个补偿来包括全局区域,如图6。
所有资源池和区域的完整例子。
================================================================================================
Solaris容器: 一个例子
本部分是一个一步一步地指南,演示如何创建上面例子的邮件和web服务器。通过如下的步骤:
● 创建资源池
● 在新的资源池上创建邮件区域
● 在Web服务器的资源池上启用公平共享调度器
● 创建第一个Web服务器容器
● 创建第二个Web服务器容器
当创建最后两个容器的时候,我们也将介绍一些附加的Solaris容器的配置选项。
作为开始,图7显示了我们在创建例子之前的系统的样子。现在仅有的对象是全局区域和一个资源池,全局区域和这个资源池关联。这个第一个资源池也称作默认的池,在任何动作之前,它拥有系统的所有CPUs。
每一个系统有一个默认的处理器集。
创建一个新的资源池
在一个Solaris系统,一个资源池是一个拥有系统资源子集的逻辑实体,例如CPU和内存。这些子集被认为是资源集合。当前Solaris系统仅有一种类型的资源集合-一个处理器集。每一个资源池和一个处理器集关联-因此如果你想给你的这个池它自己的唯一的CPUs,你需要去定义处理器集,它包含的处理器数量,并把它关联到一个池上。
每一个创建的额外的资源池会从默认池中去掉。因此,邮件服务器的CPU来自于初始分配给默认池的CPUs(留下三个)。资源池能够在一个运行的系统上动态的创建和移出,但是你必须给默认的资源池留下一个CPU。
创建一个新的资源池:
1. 启用资源池功能,使用pooladm(1M)命令.
global# pooladm -e
"global#"提示符贯穿这个例子,指示命令在全局区域中运行,这个是你默认所在的位置。
2. 使用pooladm(1M)命令保存当前配置到一个文件中。
global# pooladm -s
3. 使用pooladm(1M)命令查看某个池是否已经存在于系统中。
global# pooladm
system my_system
string system.comment
int system.version 1
boolean system.bind-default true
int system.poold.pid 638
pool pool_default
int pool.sys_id 0
boolean pool.active true
boolean pool.default true
int pool.importance 1
string pool.comment
pset pset_default
pset pset_default
int pset.sys_id -1
boolean pset.default true
uint pset.min 1
uint pset.max 65536
string pset.units population
uint pset.load 7
uint pset.size 8
string pset.comment
cpu
int cpu.sys_id 1
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 0
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 3
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 2
string cpu.comment
string cpu.status on-line
你正在开始一个没有池配置的系统上,你仅仅能看到一个池实体,"pool pool_default"。
4. 创建一个包含一个CPU的处理器集, 使用 poolcfg(1M) 命令。
global# poolcfg -c 'create pset email-pset (uint pset.min=1; uint pset.max=1)'
这个命令表示,改变池配置来创建一个称为email-pset的处理器集,最大和最小CPU数量都为1。
5. 为处理器几创建一个资源池。
global# poolcfg -c 'create pool email-pool'
6. 连接池到处理器集,这个资源池将被email服务器使用。
global# poolcfg -c 'associate pool email-pool (pset email-pset)'
7. 激活配置。
global# pooladm -c
8. 核实已经存在的资源池,使用 pooladm(1M) 命令。
global# pooladm
system my_system
string system.comment
int system.version 1
boolean system.bind-default true
int system.poold.pid 638
pool email-pool
int pool.sys_id 1
boolean pool.active true
boolean pool.default false
int pool.importance 1
string pool.comment
pset email
pool pool_default
int pool.sys_id 0
boolean pool.active true
boolean pool.default true
int pool.importance 1
string pool.comment
pset pset_default
pset email-pset
int pset.sys_id 1
boolean pset.default false
uint pset.min 1
uint pset.max 1
string pset.units population
uint pset.load 0
uint pset.size 1
string pset.comment
cpu
int cpu.sys_id 0
string cpu.comment
string cpu.status on-line
pset pset_default
int pset.sys_id -1
boolean pset.default true
uint pset.min 1
uint pset.max 65536
string pset.units population
uint pset.load 7
uint pset.size 7
string pset.comment
cpu
int cpu.sys_id 1
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 3
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 2
string cpu.comment
string cpu.status on-line
注意输出的 "pool email-pool" 和 "pset email-pset" 片段。"pset email-pset" 片段也显示有一个CPU与这个池 "pset.size 1" 关联。
一个带有一个新的一个CPU资源池的系统。
在新的资源池上创建Email区域
一旦处理器集和资源池被创建,Solaris区域技术就可以被用来为邮件服务器和Web服务器创建隔离的环境。
创建一个区域需要下列步骤:
● 配置—定义区域属性,例如需要的文件系统和网络接口
● 安装—通过安装和装载为区域保留的文件系统层次的那部分来创建区域
● 虚拟平台管理—使用区域工具来引导、停止或者重启区域
● 登录区域—进入和退出区域来执行管理任务
我们为邮件服务器创建的区域是一个非常标准的区域-另外两个区域将会说明更多的选项。下面的否则勾画出了在一个新资源池上创建一个区域的容器的过程。这个区域称作email-zone,IPv4的地址是10.0.0.1。
配置
为了在下面的片段中配置网络参数,你需要:
1. 一个IP地址
2. 网络接口名称
提示: 在系统上一个快速查找一个物理网络接口的方法是在全局区域中使用"ifconfig -a"命令。
3. 你也要确认文件系统有足够的空间来容纳区域。
提示:一个默认的配置大约需要100MB磁盘空间加上应用程序需要的一定数量的空间。
配置和定义一个新区域:
1. 使用zonecfg(1M)命令进入区域配置工具。
global# zonecfg -z email-zone
在提示你去开始创建一个新区域之前会返回这个区域没有配置的信息,你现在正在通过提示符"zonecfg:email-zone>"来识别的zonecfg的shell里。
2. 使用create命令创建一个新区域的定义。
zonecfg:email-zone> create
3. 使用set zonepath命令为区域指派一个文件系统。
zonecfg:email-zone> set zonepath=/export/home/zones/email-zone
提示:一个默认的配置大约需要100MB磁盘空间加上应用程序需要的一定数量的空间。
4. 决定在系统引导的时候区域是否自动引导。使用set autoboot命令来指定这个行为。
zonecfg:my-zone> set autoboot=true
"True" 指示区域在系统引导的时候将被引导,而 "no" 指示不被自动引导。
5. 配置网络参数,使用add net命令及其子命令。
zonecfg:email-zone> add net
zonecfg:email-zone:net> set address=10.0.0.1
zonecfg:email-zone:net> set physical=eri0
zonecfg:email-zone:net> end
在这个例子中虚拟网络接口的IP是10.0.0.1,使用eri0接口。
6. 指派区域到email池。
zonecfg:email-zone> set pool=email-pool
7. 使用verify命令校验配置的语法正确性。
zonecfg:email-zone> verify
如果发现配置错误,仅返回一个信息。
8. 把内存的配置信息写到磁盘,使用commit命令,然后退出shell。
zonecfg:email-zone> commit zonecfg:email-zone> exit (or ^D [Ctrl d])
一个标准的区域会共享全局区域的/usr、/lib、/platform 和 /sbin 文件系统。重要提示一个标准区域配置只读挂在所有的全局文件系统。结果就是任何到这些只读目录的安装都会失败。参看片段创建第一个Web服务器来学习如何挂载一个可写权限的全局区域文件系统来在其中安装应用程序。
安装
在区域配置过程中里的verify命令主要是检查配置的语法正确性。它决定配置在系统上是否能创建,但是这个步骤不是必须的。当系统安装的时候这个校验过程会自动执行。zoneadm(1M) 命令会缠看是否所有的资源是否可用,例如配置中的网络接口。然后它安装区域根文件系统需要的文件到zonepath指定的位置,并为配置中指定的附加的文件系统创建挂载点。
9. 使用zoneadm(1M)命令安装区域。
global# zoneadm -z email-zone install
Preparing to install zone email-zone
Creating list of files to copy from the global zone.
[Some output was omitted here for brevity]
Zone email-zone is initialized.
这个需要几分钟的时间。注意如果是完全根区域会需要更多的时间。
虚拟平台管理
安装完成后,区域就可以被启动了。虽然现在区域已经安装完毕了,但是区域的标示还没有做。在这一点上,系统管理员可以配置例如区域的root帐号的密码和它将连接的名称服务器等信息。当区域被第一次引导的时候,系统会自动和用户交互来配置区域的系统标示。
准备运行区域:
10. 使用zoneadm(1M) boot命令启动区域。
global# zoneadm -z email-zone boot
因为这是区域安装后的第一次启动,标准的系统标示问题必须要回答。你必须登录到区域的控制台来回答这些问题。
登录区域
11. 使用zlogin(1M)命令登录到区域控制台。一旦系统启动,正常的为新安装的Solaris操作系统实例的系统标示过程会开始。为了简单,这个过程的输出这里就略去了,但是有关名称服务、区域时间和其它的系统参数等配置问题必须在相应的位置做出合适的回答。
global# zlogin -C email-zone
[Connected to zone email-zone console]
[This will now show the same type of output as when a normal system boots.
You will also be asked for the regular system identification questions.
Here are some suggestions]
Terminal=(12)X Terminal Emulator (xterms)
Hostname for eri0:1 = email-zone
No Kerberos
Name service = None
Time Zone = my-time-zone
root passwd = (Your choice)
区域标示完成和root密码设置之后,区域会重启,就可以使用了。
12. 小技巧,在区域控制台使用 ~. 断开连接。区域现在可以在网络上使用telnet(1), rlogin(1) 或者 ssh(1)命令访问了,就像一个标准的Solaris操作系统。
图9显示了系统的当前状态,一个新的区域和它的资源池。它也显示了全局区域里的默认池的剩下的CPUs。
邮件区域和它的资源池
提示,在系统上的每一个创建的区域必须安装、配置和启动。另外,一个sysidcfg(4) 可以用来自动化区域标示过程,详细信息参看http://docs.sun.com 。
在Web服务器资源池上启用公平共享调度器
一旦为邮件服务程序的容器创建、安装和启动,现在我们要为Web服务器创建另一个容器。虽然这个新容器和创建的邮件服务器的容器相似,但是它也需要使用公平共享调度器来保证CPU的使用率。
设置公平共享调度器:
1. 使用poolcfg(1m)命令为默认的池设置调度器为公平共享调度器。
global# poolcfg -c 'modify pool pool_default (string pool.scheduler="FSS")'
2. 使用pooladm(1M)命令创建一个配置实例。
global# pooladm -c
3. 把所有默认池的进程和它的相关联的区域移到FSS下。
global# priocntl -s -c FSS -i class TS
global# priocntl -s -c FSS -i pid 1
如果你不想重起系统,你可以使用priocntl(1)命令。这个步骤也可以通过重启系统来完成。
创建第一个Web服务器的容器
这个区域的安装更加详细一些。你要为它分配3个公平共享份额,并能够读写访问文件系统/usr/local。
创建区域:
1. 使用和定义安装邮件区域相同的过程来定义第一个Web服务器的区域。确保修改了区域名称、位置、使用的池和IP地址。
global# zonecfg -z Web1-zone
Web1-zone: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:Web1-zone> create
zonecfg:Web1-zone> set zonepath=/export/home/zones/Web1-zone
zonecfg:Web1-zone:net> set address=10.0.0.2
zonecfg:Web1-zone:net> set physical=eri0
zonecfg:Web1-zone:net> end
zonecfg:Web1-zone> set pool=pool_default
记住,两个Web服务器和全局区域共享默认池的CPU资源,因此你要指明如何使用公平共享调度器(FSS)来分配这些资源。
使用FSS,应用程序的相对重要性通过基于共享的分配CPU资源来表示 - 分派给应用程序的系统CPU资源的一部分。分配给一个应用程序的份额数越大,相对于其它的应用程序它从FSS软件收到的CPU资源越多。一个应用程序受到的份额数不是绝对的 - 重要的是它相对其它应用程序有多少份额,它能否同其它程序竞争CPU资源。
2. 使用下面的命令为这个区域分配3个份额。
zonecfg:Web1-zone> add rctl
zonecfg:Web1-zone:rctl> set name=zone.cpu-shares
zonecfg:Web1-zone:rctl> add value (priv=privileged,limit=3,action=none)
zonecfg:Web1-zone:rctl> end
zonecfg:Web1-zone> exit
在一个标准区域安装的情况下-就像邮件服务器-/usr目录被配置成只读。在某些情况下一个应用程序可能需要安装到/usr下的一个子目录例如/usr/local(也就是很多开源软件经常安装的位置)。一个标准区域安装是不允许的。但是,这可以通过修改区域配置来在区域里挂在一个附加的可读写的目录到/usr/local来实现。
在这个例子中,第一个Web服务器安装在/usr/local/bin,这意味着我们需要配置区域来支持这个。
配置一个可读写的/usr/local目录:
3. 在全局区域创建一个目录输出到区域,使用mkdir(1)命令。
global# mkdir -p /export/home/zones/Web1-zone/local
4. 使用chmod(1)命令设置权限来仅允许全局区域的root帐号进入这个目录。
global# chmod 700 /export/home/zones/Web1-zone
5. 创建文件系统要挂载的目录如果它还不存在的话(如果已经存在略过这步)。
global# mkdir /usr/local
6. 使用zonecfg(1M)命令进入区域配置工具。
global# zonecfg -z Web1-zone
7. 使用add fs命令为区域添加一个文件系统。
zonecfg:Web1-zone> add fs
8. 在区域中指定一个文件系统将要挂载的目录。
zonecfg:Web1-zone:fs> set dir=/usr/local
9. 从全局区域输出目录到新的区域。
zonecfg:Web1-zone:fs> set special=/export/home/zones/Web1-zone/local
10. 设置文件系统类型为回送文件系统。
zonecfg:Web1-zone:fs> set type=lofs
11. 设置目录有读写权限。
zonecfg:Web1-zone:fs> set options=[rw,nodevices]
12. 结束配置。
zonecfg:Web1-zone:fs> end
13. 确保校验和提交配置,然后安装和启动区域。执行一个系统配置来标示系统,这个我们在登录区域的第11步已经介绍过。
zonecfg:Web1-zone> verify
zonecfg:Web1-zone> commit
zonecfg:Web1-zone> exit
global# zoneadm -z email-zone install
global# [output omitted here for brevity]
global# zoneadm -z Web1-zone boot
global# zlogin -C Web1-zone
提示: zoneadm list -cv 是一个快速查看区域状态的方法。
这个配置的结果如图10所示。你现在已经创建了两个容器:一个使用固定数量的CPU,一个和全局区域动态共享CPU。
第二个区域添加到系统,并分派了3个份额。
创建第二个Web服务器容器
一旦第一个Web服务器容器被创建、安装和启动,我们现在就可以创建第二个Web服务器容器了。这个容器和刚才创建的非常的相似,但是需要分派一个不同FSS份额,也包括对CD-ROM和裸磁盘分区的访问。
创建第二个Web服务器容器:
1. 用创建Web1-zone相同的步骤为第二个Web 站点创建区域。确保修改了足于名称、安装位置、使用的池名称和其IP地址。
zonecfg -z Web2-zone
Web2-zone: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:Web2-zone> create
zonecfg:Web2-zone> set zonepath=/export/home/zones/Web2-zone
zonecfg:Web2-zone> add net
zonecfg:Web2-zone:net> set address=10.0.0.3
zonecfg:Web2-zone:net> set physical=eri0
zonecfg:Web2-zone:net> end...
zonecfg:Web2-zone> set pool=pool_default
2. 指定使用公平共享调度器(FSS),分配两个份额给这个区域。
zonecfg:Web2-zone> add rctl
zonecfg:Web2-zone:rctl> set name=zone.cpu-shares
zonecfg:Web2-zone:rctl> add value (priv=privileged,limit=2,action=none)
zonecfg:Web2-zone:rtcl> end
给容器用户访问CD-ROM设备的权限:
3. 使用 add fs 添加一个文件系统到区域。
zonecfg:Web2-zone> add fs
4. 为区域指定CD-ROM目录。
zonecfg:Web2-zone:fs> set dir=/cdrom
5. 从全局区域输出目录到新的区域。
zonecfg:Web2-zone:fs> set special=/cdrom
6. 使用回送文件系统。
zonecfg:Web2-zone:fs> set type=l
7. 设置目录的权限为只读,因为是一个只读的CD驱动器。
zonecfg:Web2-zone:fs> set options=[nodevices]
8. 结束配置。
zonecfg:Web2-zone:fs> end
提示: 如果CD-ROM被分配给了一个区域,其它区域将不能配置来访问这个相同的CD-ROM驱动器。
执行下面的步骤配置区域访问一个裸设备(裸磁盘分区):
9. 为裸分区添加一个块设备到区域。
zonecfg:Web2-zone> add device
zonecfg:Web2-zone:device> set match=/dev/dsk/c0t0d0s6
zonecfg:Web2-zone:device> end
10. 为裸分区添加字符设备(character device)到区域。
zonecfg:Web2-zone> add device
zonecfg:Web2-zone:device> set match=/dev/rdsk/c0t0d0s6
zonecfg:Web2-zone:device> end
zonecfg:Web2-zone> verify
zonecfg:Web2-zone> commit
zonecfg:Web2-zone> exit
在这个过程中全局区域管理员必须确保磁盘分区没有输出到其它的区域。如果不这样做,可能会导致数据损坏。
11. 安装、启动和配置。
图11显示了我们例子的系统配置结果。邮件服务器将运行在它自己的专用CPU,避免这个系统上的其它应用程序使用它,而Web服务器共享剩余的3个CPU。为了阐明FSS共享的用法,第一个Web服务器应用程序使用总共6个份额的3个,享有3个CPU中的1.5个(3*3/6=1.5); 第二个享有6个份额的2个,给它相当于1个的CPU;全局区域获得相当于0.5个的CPU。
最后完整的系统。
做一个最后的说明,Orcale承诺这些类型的Solaris容器作为一个有效的协议边界。用他们的术语就是加帽的容器(Capped Containers),由动态资源池和Solaris区域的联合组成 - 这里池中的CPU数量决定了协议的数量。
================================================================================================
更多信息
虽然这个指南提供了使用Solaris容器技术并快速运行所需要的步骤,配置也尽可能的精炼。关于Solaris容器和区域的更多信息,请访问 http://sun.com/solaris 。
系统管理员指南: Solaris容器资源管理和Solaris区域
http://docs.sun.com/app/docs/doc/817-1592/
Solaris容器—他们是什么和如何使用他们
http://www.sun.com/blueprints/0505/819-2679.pdf
在Sun Fire T1000上使用Solaris容器合并Web
http://www.sun.com/blueprints/1205/819-5149.pdf
分片和切割服务器:一个虚拟化和控制策略指南
http://www.sun.com/blueprints/1005/819-3734.pdf
使用Solaris容器创建自平衡的解决方案
http://www.sun.com/blueprints/0605/819-2888.pdf
Solaris补丁管理 — 推荐的策略
http://docs-pdf.sun.com/817-0574/817-0574.pdf
Solaris 容器—服务器虚拟化和可管理能力
http://www.sun.com/software/whitepapers/solaris10/grid_containers.pdf
Solaris 9 资源管理器
http://www.sun.com/software/whitepapers/solaris9/srm.pdf
Open Solaris 常见问题解答
http://opensolaris.org/os/community/zones/faq/
Solaris 容器管理GUI
http://www.sun.com/software/products/sunmanagementcenter/
在Solaris容器上的Oracle协议信息和Oracle
http://www.sun.com/third-party/global/oracle/consolidation/solaris10.html
这篇文章被编辑了 19 次. 最近一次更新是在 03/12/2007 00:15:24
|