CentOS 6 使用 LXC

LXC 自kernel 2.6.27 加入linux 內核,依賴Linux 內核的cgroup和namespace功能而實現,非常輕量級,設計用於操作系統內部應用級別的隔離。


不同於vmware,kvm等虛擬化技術,它是一種類似chroot的技術,非常的輕量級。

與傳統的硬件虛擬化技術相比有以下優勢:

a、更小的虛擬化開銷。
Linux內核本身是一個很好的硬件資源調度器,LXC的諸多特性基本由內核提供,而內核實現這些特性只有極少的花費,CPU,內存,硬盤都是直接使用。

b、更快的啓動速度。
lxc容器技術將操作系統抽象到了一個新的高度。直接從init啓動,省去了硬件自檢、grub引導、加載內核、加載驅動等傳統啓動項目,因此啓動飛速。

c、更快速的部署。
lxc與帶cow特性的後端文件系統相結合,一旦建好了模板,利用快照功能,半秒鐘即可實現克隆一臺lxc虛擬機。LXC虛擬機本質上只是宿主機上的一個目錄,這也爲備份和遷移提供了極大便利。

d、更高內存使用效率。
普通虛擬機一般會獨佔一段內存,即使閒置,其他虛擬機也無法使用,例如KVM。而容器可以只有一個內存上限,沒有下限。如果它只使用1MB內存,那麼它只佔用宿主機1MB內存。宿主機可以將富餘內存作爲他用。


LXC 目前已經比較成熟,官方在2014年2月推出1.0版本後就開始了長期維護,目前最新版本已經是1.07,CentOS 從6.5 開始支持LXC技術。


將LXC投入生產環境完全沒有問題,因爲LXC並不是什麼新技術,而是重新聚合了已經成熟了的技術。


環境CentOS 6.5 x64


1、安裝LXC

yum install libcgroup lxc lxc-templates --enablerepo=epel
/etc/init.d/cgconfig start
/etc/init.d/lxc start

2、檢查環境

lxc-checkconfig

輸出如下即是OK

Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-2.6.32-431.1.2.0.1.el6.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/ptsinstances: enabled
--- Control groups---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config/usr/bin/lxc-checkconfig


/usr/share/lxc/templates/ 自帶了常用的模板可供選擇,debian/ubuntu,centos/redhat 都有。


3、使用模板安裝一個centos 6 虛擬機

lxc-create -n vm01 -t centos

或者

lxc-create -n vm01 -t download -- -d centos -r 6 -a amd64


安裝後,虛擬機默認位於/var/lib/lxc/vm01/rootfs,配置文件爲/var/lib/lxc/vm01/config


download模板默認在官網倉庫(http://images.linuxcontainers.org/)裏下載鏡像,速度比較慢,可以指定使用國內的鏡像源

lxc-create -n vm01 -t download -- -d centos -r 6 -a amd64 --server mirrors.tuna.tsinghua.edu.cn/lxc-images


a、如果你係統裏恰好有個lvm VG 名字叫做lxc,那麼lxc會識別到,加上一個參數 -B lvm,創建的虛擬機配置文件依然是/var/lib/lxc/vm01/config,但是lxc鏡像會在/dev/lxc/vm01 這個LV 上 (默認500M大小);

示例:

lxc-create -n vm01 -t centos -B lvm --thinpool --fssize 250G --fstype xfs

上面的命令將會在lvm上創建一個lv,名爲vm01,最大容量250G(因爲加了thinpool參數,用多少佔多少),文件系統是xfs。


b、如果你的/var 單獨分區,恰好使用的是btrfs文件系統,lxc也會識別,創建lxc容器時自動創建子卷,並將容器鏡像放在裏面;


4、lxc容器

打開lxc容器並進入開機console,

lxc-start -n vm01


在後臺運行容器,並通過console連接過去 (使用ctrl+a+q退出console)

lxc-start -n vm01 -d
lxc-console -n vm01


查看lxc容器相關信息(名稱、是否在運行、PID,CPU使用、IO使用、內存使用、IP地址、網絡吞吐量)

lxc-info -n vm01

監視lxc容器的資源使用

lxc-top


5、配置容器網絡,

新版lxc自帶一個橋接lxcbr0 (10.0.3.1),物理網卡通過NAT橋接到lxcbr0 ,網段爲10.0.3.0/24。

如果上面新創建的虛擬機啓動失敗,很可能是lxcbr0 沒有啓動。


編輯文件/var/lib/lxc/vm01/config,確保文件包含一下內容

lxc.network.type= veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.3.2/24
lxc.network.ipv4.gateway = 10.0.3.1


如果需要第二塊網卡,則繼續在/var/lib/lxc/vm01/config添加一組配置

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.name = eth1
lxc.network.ipv4 = 10.0.3.3/24


容器網絡默認由dnsmasq分配,如果沒有在lxc中指定,則由容器內部dhcp獲得。


veth依賴網卡橋接,且可以與任何機器(宿主機,其他虛擬機,局域網其他機器)通訊。


在網絡層,可以採取下面的方式加固安全:


       如果要隔絕容器與宿主機的通訊(容器之間可以通信,與局域網其他機器也可以通信),網卡可選擇macvlan中的bridge模式

lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge
lxc.network.flags = up
lxc.network.link = eth0

       如果要進一步隔離同一宿主機上不同容器之間的通訊(僅可與局域網其他機器通信),網卡要選擇macvlan中的vepa模式

lxc.network.type = macvlan
lxc.network.macvlan.mode = vepa
lxc.network.flags = up
lxc.network.link = eth0


下面是三種特殊的網絡

lxc.network.type = none

none表示停用網絡空間的namespace,複用宿主機的網絡。

據說關閉容器也會關閉宿主機,ubuntu phone通過lxc裏的安卓容器,使用網絡複用達到兼容安卓應用的目的。(個人沒有測試通過)

lxc.network.type = empty

empty表示容器沒有網卡,僅有一個迴環lo,無法通過網絡層與外部通信。用於某些特殊的場合。比如將宿主機的某個圖片目錄掛載到容器裏,容器利用有限的資源對圖片進行處理,如果放在宿主機上處理,圖片處理佔用的資源可能不好控制,影響整體性能。

lxc.network.type = vlan

這種模式需要上聯的物理交換機支持,用不同的vlan id 隔離容器與宿主機之間的通信。


6、調整容器的配置參數

容器默認與宿主機共享硬件資源,CPU,內存,IO等,也可以用cgroup實現資源隔離。


直接使用命令可動態調整容器的資源,重啓後失效

#設置虛擬機只使用0,1兩個CPU核心
lxc-cgroup -n centos cpuset.cpus 0,1
#設置虛擬機可用內存爲512M
lxc-cgroup -n centos memory.limit_in_bytes 512M
#設置虛擬機消耗的CPU時間
 lxc-cgroup -n centos cpu.shares 256
#設置虛擬機消耗的IO權重
 lxc-cgroup -n centos blkio.weight 500


另一種限制資源的方法是將具體的限制寫入虛擬機的配置文件,可選的參數如下:

#設置虛擬機只使用0,1兩個CPU核心
lxc.cgroup.cpuset.cpus  = 0,1

#設置虛擬機消耗的CPU時間
lxc.cgroup.cpu.shares  = 256

#設置虛擬機可用內存爲512M
lxc.cgroup.memory.limit_in_bytes = 512M

#限制虛擬機可用的內存和swap空間一共1G
lxc.cgroup.memory.memsw.limit_in_bytes = 1G

#設置虛擬機可使用的IO權重
lxc.cgroup.blkio.weight=500


設置容器開機啓動

lxc.start.auto = 1 #開機自動啓動
lxc.start.delay = 5 #延遲5秒開機,防止容器併發啓動造成宿主機過載


7、安裝ubuntu 12.04

LXC強大到有點變態,在centos上運行ubuntu?沒錯,因爲內核對於LInux發行版來說是通用的。

lxc-create -n ubuntu -t ubuntu -- -r precise

或者加上MIRROR參數(僅適用於ubuntu,用於選擇較近的軟件源)

MIRROR="http://cn.archive.ubuntu.com/ubuntu"  lxc-create -n ubuntu-test -t ubuntu -- -r precise

點到爲止,不深入。


8、容器克隆

你可以創建一個標準化的lxc容器作爲模板,然後對它進行克隆,避免重新安裝,實現橫向擴展和環境的標準化。下面以基於lvm卷的容器爲例

lxc-clone vm01 webserver01 -B lvm

克隆後的容器,是一個獨立的lvm邏輯卷,默認與原來的大小一致(也可以指定大小),僅僅會改變mac地址和主機名。


如果你想節約空間,克隆時帶上 -s (--snapshot) 參數,可以創建一個源容器的可讀寫快照,它幾乎不佔用空間,使得在一個機器上運行成百上千個容器成爲可能,僅支持lvm和btrfs,因爲它們都有cow功能 。-L 參數可以指定快照的大小。更多參數詳見 man lxc-clone 。

lxc-clone vm01 webserver01 -s -B lvm


9、lxc容器的系統安全

lxc容器裏的系統完全可以不需要用到root密碼和ssh,可以設置空密碼或者超級長的密碼,openssh服務可以不必啓動甚至不必安裝。因爲從宿主機運行下面的命令可以直接獲得root shell,相當於chroot

lxc-attach -n webserver01


如果是應用容器,則更簡單,因爲容器裏只有應用進程,比如httpd,連init 都木有。具體實現參考模板lxc-sshd 。還只是玩具,相反,docker卻將應用容器發揚光大。


lxc 1.0還支持非特權容器,利用uidmap映射技術,將容器裏的root映射爲宿主機上的普通用戶,允許以普通用戶身份運行LXC容器,大大提高了宿主機的安全性。


使用方法省略,見我的另一篇文章。《ubuntu 14.04 體驗LXC非特權容器

http://purplegrape.blog.51cto.com/1330104/1528503


update 2014-11-13

對文章內容進行了適當編排和刪節。添加了lxc 1.0之後的特性,深入介紹了基於lvm的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章