LXD 2.0 系列(九):實時遷移
這是 LXD 2.0 系列介紹文章的第九篇。
介紹
LXD 2.0 中的有一個盡管是實驗性質(zhì)的但非常令人興奮的功能,那就是支持容器檢查點和恢復。
簡單地說,檢查點/恢復意味著正在運行的容器狀態(tài)可以被序列化到磁盤,要么可以作為同一主機上的有狀態(tài)快照,要么放到另一主機上相當于實時遷移。
要求
要使用容器實時遷移和有狀態(tài)快照,你需要以下條件:
- 一個非常新的 Linux 內(nèi)核,4.4 或更高版本。
- CRIU 2.0,可能需要一些 cherry-pick 的提交,具體取決于你確切的內(nèi)核配置。
- 直接在主機上運行 LXD。 不能在容器嵌套下使用這些功能。
- 對于遷移,目標主機必須至少實現(xiàn)源主機的指令集,目標主機內(nèi)核必須至少提供與源主機相同的系統(tǒng)調(diào)用,并且在源主機上掛載的任何內(nèi)核文件系統(tǒng)也必須可掛載到目標主機上。
Ubuntu 16.04 LTS 已經(jīng)提供了所有需要的依賴,在這種情況下,您只需要安裝 CRIU 本身:
- apt install criu
使用 CRIU
有狀態(tài)快照
一個普通的快照看上去像這樣:
- stgraber@dakara:~$ lxc snapshot c1 first
- stgraber@dakara:~$ lxc info c1 | grep first
- first (taken at 2016/04/25 19:35 UTC) (stateless)
一個有狀態(tài)快照看上去像這樣:
- stgraber@dakara:~$ lxc snapshot c1 second --stateful
- stgraber@dakara:~$ lxc info c1 | grep second
- second (taken at 2016/04/25 19:36 UTC) (stateful)
這意味著所有容器運行時狀態(tài)都被序列化到磁盤并且作為了快照的一部分??梢韵衲氵€原無狀態(tài)快照那樣還原一個有狀態(tài)快照:
- stgraber@dakara:~$ lxc restore c1 second
- stgraber@dakara:~$
有狀態(tài)快照的停止/啟動
比方說你由于升級內(nèi)核或者其他類似的維護而需要重啟機器。與其等待重啟后啟動所有的容器,你可以:
- stgraber@dakara:~$ lxc stop c1 --stateful
容器狀態(tài)將會寫入到磁盤,會在下次啟動時讀取。
你甚至可以看到像下面那樣的狀態(tài):
- root@dakara:~# tree /var/lib/lxd/containers/c1/rootfs/state/
- /var/lib/lxd/containers/c1/rootfs/state/
- ├── cgroup.img
- ├── core-101.img
- ├── core-102.img
- ├── core-107.img
- ├── core-108.img
- ├── core-109.img
- ├── core-113.img
- ├── core-114.img
- ├── core-122.img
- ├── core-125.img
- ├── core-126.img
- ├── core-127.img
- ├── core-183.img
- ├── core-1.img
- ├── core-245.img
- ├── core-246.img
- ├── core-50.img
- ├── core-52.img
- ├── core-95.img
- ├── core-96.img
- ├── core-97.img
- ├── core-98.img
- ├── dump.log
- ├── eventfd.img
- ├── eventpoll.img
- ├── fdinfo-10.img
- ├── fdinfo-11.img
- ├── fdinfo-12.img
- ├── fdinfo-13.img
- ├── fdinfo-14.img
- ├── fdinfo-2.img
- ├── fdinfo-3.img
- ├── fdinfo-4.img
- ├── fdinfo-5.img
- ├── fdinfo-6.img
- ├── fdinfo-7.img
- ├── fdinfo-8.img
- ├── fdinfo-9.img
- ├── fifo-data.img
- ├── fifo.img
- ├── filelocks.img
- ├── fs-101.img
- ├── fs-113.img
- ├── fs-122.img
- ├── fs-183.img
- ├── fs-1.img
- ├── fs-245.img
- ├── fs-246.img
- ├── fs-50.img
- ├── fs-52.img
- ├── fs-95.img
- ├── fs-96.img
- ├── fs-97.img
- ├── fs-98.img
- ├── ids-101.img
- ├── ids-113.img
- ├── ids-122.img
- ├── ids-183.img
- ├── ids-1.img
- ├── ids-245.img
- ├── ids-246.img
- ├── ids-50.img
- ├── ids-52.img
- ├── ids-95.img
- ├── ids-96.img
- ├── ids-97.img
- ├── ids-98.img
- ├── ifaddr-9.img
- ├── inetsk.img
- ├── inotify.img
- ├── inventory.img
- ├── ip6tables-9.img
- ├── ipcns-var-10.img
- ├── iptables-9.img
- ├── mm-101.img
- ├── mm-113.img
- ├── mm-122.img
- ├── mm-183.img
- ├── mm-1.img
- ├── mm-245.img
- ├── mm-246.img
- ├── mm-50.img
- ├── mm-52.img
- ├── mm-95.img
- ├── mm-96.img
- ├── mm-97.img
- ├── mm-98.img
- ├── mountpoints-12.img
- ├── netdev-9.img
- ├── netlinksk.img
- ├── netns-9.img
- ├── netns-ct-9.img
- ├── netns-exp-9.img
- ├── packetsk.img
- ├── pagemap-101.img
- ├── pagemap-113.img
- ├── pagemap-122.img
- ├── pagemap-183.img
- ├── pagemap-1.img
- ├── pagemap-245.img
- ├── pagemap-246.img
- ├── pagemap-50.img
- ├── pagemap-52.img
- ├── pagemap-95.img
- ├── pagemap-96.img
- ├── pagemap-97.img
- ├── pagemap-98.img
- ├── pages-10.img
- ├── pages-11.img
- ├── pages-12.img
- ├── pages-13.img
- ├── pages-1.img
- ├── pages-2.img
- ├── pages-3.img
- ├── pages-4.img
- ├── pages-5.img
- ├── pages-6.img
- ├── pages-7.img
- ├── pages-8.img
- ├── pages-9.img
- ├── pipes-data.img
- ├── pipes.img
- ├── pstree.img
- ├── reg-files.img
- ├── remap-fpath.img
- ├── route6-9.img
- ├── route-9.img
- ├── rule-9.img
- ├── seccomp.img
- ├── sigacts-101.img
- ├── sigacts-113.img
- ├── sigacts-122.img
- ├── sigacts-183.img
- ├── sigacts-1.img
- ├── sigacts-245.img
- ├── sigacts-246.img
- ├── sigacts-50.img
- ├── sigacts-52.img
- ├── sigacts-95.img
- ├── sigacts-96.img
- ├── sigacts-97.img
- ├── sigacts-98.img
- ├── signalfd.img
- ├── stats-dump
- ├── timerfd.img
- ├── tmpfs-dev-104.tar.gz.img
- ├── tmpfs-dev-109.tar.gz.img
- ├── tmpfs-dev-110.tar.gz.img
- ├── tmpfs-dev-112.tar.gz.img
- ├── tmpfs-dev-114.tar.gz.img
- ├── tty.info
- ├── unixsk.img
- ├── userns-13.img
- └── utsns-11.img
- 0 directories, 154 files
還原容器也很簡單:
- stgraber@dakara:~$ lxc start c1
實時遷移
實時遷移基本上與上面的有狀態(tài)快照的停止/啟動相同,除了容器目錄和配置被移動到另一臺機器上。
- stgraber@dakara:~$ lxc list c1
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
- | c1 | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2 |
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
- stgraber@dakara:~$ lxc list s-tollana:
- +------+-------+------+------+------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +------+-------+------+------+------+-----------+
- stgraber@dakara:~$ lxc move c1 s-tollana:
- stgraber@dakara:~$ lxc list c1
- +------+-------+------+------+------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +------+-------+------+------+------+-----------+
- stgraber@dakara:~$ lxc list s-tollana:
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
- | c1 | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2 |
- +------+---------+-----------------------+----------------------------------------------+------------+-----------+
限制
正如我之前說的,容器的檢查點/恢復還是非常新的功能,我們還在努力地開發(fā)這個功能、修復已知的問題。我們確實需要更多的人來嘗試這個功能,并給我們反饋,但我不建議在生產(chǎn)中使用這個功能。
我們跟蹤的問題列表在 Launchpad上。
我們估計在帶有 CRIU 的 Ubuntu 16.04 上帶有幾個服務的基本的 Ubuntu 容器能夠正常工作。然而在更復雜的容器、使用了設(shè)備直通、復雜的網(wǎng)絡服務或特殊的存儲配置下可能會失敗。
要是有問題,CRIU 會盡可能地在轉(zhuǎn)儲時失敗,而不是在恢復時。在這種情況下,源容器將繼續(xù)運行,快照或遷移將會失敗,并生成一個日志文件用于調(diào)試。
在極少數(shù)情況下,CRIU 無法恢復容器,在這種情況下,源容器仍然存在但將被停止,并且必須手動重新啟動。
發(fā)送 bug 報告
我們正在跟蹤 Launchpad 上關(guān)于 CRIU Ubuntu 軟件包的檢查點/恢復相關(guān)的錯誤。大多數(shù)修復 bug 工作是在上游的 CRIU 或 Linux 內(nèi)核上進行,但是這種方式我們更容易跟蹤。
要提交新的 bug 報告,請看這里。
請務必包括:
- 你運行的命令和顯示給你的錯誤消息
- lxc info 的輸出(*)
- lxc info <container name>的輸出
- lxc config show -expanded <container name> 的輸出
- dmesg(*)的輸出
- /proc/self/mountinfo 的輸出(*)
- lxc exec <container name> - cat /proc/self/mountinfo 的輸出
- uname -a(*)的輸出
- /var/log/lxd.log(*)的內(nèi)容
- /etc/default/lxd-bridge(*)的內(nèi)容
- /var/log/lxd/<container name>/ 的 tarball(*)
如果報告遷移錯誤,而不是狀態(tài)快照或有狀態(tài)停止的錯誤,請將上面所有含有(*)標記的源與目標主機的信息發(fā)來。
額外信息
CRIU 的網(wǎng)站在: https://criu.org
LXD 的主站在: https://linuxcontainers.org/lxd
LXD 的 GitHub 倉庫: https://github.com/lxc/lxd
LXD 的郵件列表: https://lists.linuxcontainers.org
LXD 的 IRC 頻道: #lxcontainers on irc.freenode.net
作者簡介:
我是 Stéphane Graber。我是 LXC 和 LXD 項目的領(lǐng)導者,目前在加拿大魁北克蒙特利爾的家所在的Canonical 有限公司擔任 LXD 的技術(shù)主管。