天天看點

LXD 2.0 系列(九):實時遷移

lxd 2.0 中的有一個盡管是實驗性質的但非常令人興奮的功能,那就是支援容器檢查點和恢複。

簡單地說,檢查點/恢複意味着正在運作的容器狀态可以被序列化到磁盤,要麼可以作為同一主機上的有狀态快照,要麼放到另一主機上相當于實時遷移。

<a target="_blank"></a>

要使用容器實時遷移和有狀态快照,你需要以下條件:

一個非常新的 linux 核心,4.4 或更高版本。

criu 2.0,可能需要一些 cherry-pick 的送出,具體取決于你确切的核心配置。

直接在主機上運作 lxd。 不能在容器嵌套下使用這些功能。

對于遷移,目标主機必須至少實作源主機的指令集,目标主機核心必須至少提供與源主機相同的系統調用,并且在源主機上挂載的任何核心檔案系統也必須可挂載到目标主機上。

ubuntu 16.04 lts 已經提供了所有需要的依賴,在這種情況下,您隻需要安裝 criu 本身:

<code>apt install criu</code>

一個普通的快照看上去像這樣:

<code>stgraber@dakara:~$ lxc snapshot c1 first</code>

<code>stgraber@dakara:~$ lxc info c1 | grep first</code>

<code>first (taken at 2016/04/25 19:35 utc) (stateless)</code>

一個有狀态快照看上去像這樣:

<code>stgraber@dakara:~$ lxc snapshot c1 second --stateful</code>

<code>stgraber@dakara:~$ lxc info c1 | grep second</code>

<code>second (taken at 2016/04/25 19:36 utc) (stateful)</code>

這意味着所有容器運作時狀态都被序列化到磁盤并且作為了快照的一部分。可以像你還原無狀态快照那樣還原一個有狀态快照:

<code>stgraber@dakara:~$ lxc restore c1 second</code>

<code>stgraber@dakara:~$</code>

比方說你由于更新核心或者其他類似的維護而需要重新開機機器。與其等待重新開機後啟動所有的容器,你可以:

<code>stgraber@dakara:~$ lxc stop c1 --stateful</code>

容器狀态将會寫入到磁盤,會在下次啟動時讀取。

你甚至可以看到像下面那樣的狀态:

<code>root@dakara:~# tree /var/lib/lxd/containers/c1/rootfs/state/</code>

<code>/var/lib/lxd/containers/c1/rootfs/state/</code>

<code>├── cgroup.img</code>

<code>├── core-101.img</code>

<code>├── core-102.img</code>

<code>├── core-107.img</code>

<code>├── core-108.img</code>

<code>├── core-109.img</code>

<code>├── core-113.img</code>

<code>├── core-114.img</code>

<code>├── core-122.img</code>

<code>├── core-125.img</code>

<code>├── core-126.img</code>

<code>├── core-127.img</code>

<code>├── core-183.img</code>

<code>├── core-1.img</code>

<code>├── core-245.img</code>

<code>├── core-246.img</code>

<code>├── core-50.img</code>

<code>├── core-52.img</code>

<code>├── core-95.img</code>

<code>├── core-96.img</code>

<code>├── core-97.img</code>

<code>├── core-98.img</code>

<code>├── dump.log</code>

<code>├── eventfd.img</code>

<code>├── eventpoll.img</code>

<code>├── fdinfo-10.img</code>

<code>├── fdinfo-11.img</code>

<code>├── fdinfo-12.img</code>

<code>├── fdinfo-13.img</code>

<code>├── fdinfo-14.img</code>

<code>├── fdinfo-2.img</code>

<code>├── fdinfo-3.img</code>

<code>├── fdinfo-4.img</code>

<code>├── fdinfo-5.img</code>

<code>├── fdinfo-6.img</code>

<code>├── fdinfo-7.img</code>

<code>├── fdinfo-8.img</code>

<code>├── fdinfo-9.img</code>

<code>├── fifo-data.img</code>

<code>├── fifo.img</code>

<code>├── filelocks.img</code>

<code>├── fs-101.img</code>

<code>├── fs-113.img</code>

<code>├── fs-122.img</code>

<code>├── fs-183.img</code>

<code>├── fs-1.img</code>

<code>├── fs-245.img</code>

<code>├── fs-246.img</code>

<code>├── fs-50.img</code>

<code>├── fs-52.img</code>

<code>├── fs-95.img</code>

<code>├── fs-96.img</code>

<code>├── fs-97.img</code>

<code>├── fs-98.img</code>

<code>├── ids-101.img</code>

<code>├── ids-113.img</code>

<code>├── ids-122.img</code>

<code>├── ids-183.img</code>

<code>├── ids-1.img</code>

<code>├── ids-245.img</code>

<code>├── ids-246.img</code>

<code>├── ids-50.img</code>

<code>├── ids-52.img</code>

<code>├── ids-95.img</code>

<code>├── ids-96.img</code>

<code>├── ids-97.img</code>

<code>├── ids-98.img</code>

<code>├── ifaddr-9.img</code>

<code>├── inetsk.img</code>

<code>├── inotify.img</code>

<code>├── inventory.img</code>

<code>├── ip6tables-9.img</code>

<code>├── ipcns-var-10.img</code>

<code>├── iptables-9.img</code>

<code>├── mm-101.img</code>

<code>├── mm-113.img</code>

<code>├── mm-122.img</code>

<code>├── mm-183.img</code>

<code>├── mm-1.img</code>

<code>├── mm-245.img</code>

<code>├── mm-246.img</code>

<code>├── mm-50.img</code>

<code>├── mm-52.img</code>

<code>├── mm-95.img</code>

<code>├── mm-96.img</code>

<code>├── mm-97.img</code>

<code>├── mm-98.img</code>

<code>├── mountpoints-12.img</code>

<code>├── netdev-9.img</code>

<code>├── netlinksk.img</code>

<code>├── netns-9.img</code>

<code>├── netns-ct-9.img</code>

<code>├── netns-exp-9.img</code>

<code>├── packetsk.img</code>

<code>├── pagemap-101.img</code>

<code>├── pagemap-113.img</code>

<code>├── pagemap-122.img</code>

<code>├── pagemap-183.img</code>

<code>├── pagemap-1.img</code>

<code>├── pagemap-245.img</code>

<code>├── pagemap-246.img</code>

<code>├── pagemap-50.img</code>

<code>├── pagemap-52.img</code>

<code>├── pagemap-95.img</code>

<code>├── pagemap-96.img</code>

<code>├── pagemap-97.img</code>

<code>├── pagemap-98.img</code>

<code>├── pages-10.img</code>

<code>├── pages-11.img</code>

<code>├── pages-12.img</code>

<code>├── pages-13.img</code>

<code>├── pages-1.img</code>

<code>├── pages-2.img</code>

<code>├── pages-3.img</code>

<code>├── pages-4.img</code>

<code>├── pages-5.img</code>

<code>├── pages-6.img</code>

<code>├── pages-7.img</code>

<code>├── pages-8.img</code>

<code>├── pages-9.img</code>

<code>├── pipes-data.img</code>

<code>├── pipes.img</code>

<code>├── pstree.img</code>

<code>├── reg-files.img</code>

<code>├── remap-fpath.img</code>

<code>├── route6-9.img</code>

<code>├── route-9.img</code>

<code>├── rule-9.img</code>

<code>├── seccomp.img</code>

<code>├── sigacts-101.img</code>

<code>├── sigacts-113.img</code>

<code>├── sigacts-122.img</code>

<code>├── sigacts-183.img</code>

<code>├── sigacts-1.img</code>

<code>├── sigacts-245.img</code>

<code>├── sigacts-246.img</code>

<code>├── sigacts-50.img</code>

<code>├── sigacts-52.img</code>

<code>├── sigacts-95.img</code>

<code>├── sigacts-96.img</code>

<code>├── sigacts-97.img</code>

<code>├── sigacts-98.img</code>

<code>├── signalfd.img</code>

<code>├── stats-dump</code>

<code>├── timerfd.img</code>

<code>├── tmpfs-dev-104.tar.gz.img</code>

<code>├── tmpfs-dev-109.tar.gz.img</code>

<code>├── tmpfs-dev-110.tar.gz.img</code>

<code>├── tmpfs-dev-112.tar.gz.img</code>

<code>├── tmpfs-dev-114.tar.gz.img</code>

<code>├── tty.info</code>

<code>├── unixsk.img</code>

<code>├── userns-13.img</code>

<code>└── utsns-11.img</code>

<code></code>

<code>0 directories, 154 files</code>

還原容器也很簡單:

<code>stgraber@dakara:~$ lxc start c1</code>

實時遷移基本上與上面的有狀态快照的停止/啟動相同,除了容器目錄和配置被移動到另一台機器上。

<code>stgraber@dakara:~$ lxc list c1</code>

<code>+------+---------+-----------------------+----------------------------------------------+------------+-----------+</code>

<code>| name | state | ipv4 | ipv6 | type | snapshots |</code>

<code>| c1 | running | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | persistent | 2 |</code>

<code>stgraber@dakara:~$ lxc list s-tollana:</code>

<code>+------+-------+------+------+------+-----------+</code>

<code>| name | state | ipv4 | ipv6 | type | snapshots |</code>

<code>stgraber@dakara:~$ lxc move c1 s-tollana:</code>

正如我之前說的,容器的檢查點/恢複還是非常新的功能,我們還在努力地開發這個功能、修複已知的問題。我們确實需要更多的人來嘗試這個功能,并給我們回報,但我不建議在生産中使用這個功能。

我們估計在帶有 criu 的 ubuntu 16.04 上帶有幾個服務的基本的 ubuntu 容器能夠正常工作。然而在更複雜的容器、使用了裝置直通、複雜的網絡服務或特殊的存儲配置下可能會失敗。

要是有問題,criu 會盡可能地在轉儲時失敗,而不是在恢複時。在這種情況下,源容器将繼續運作,快照或遷移将會失敗,并生成一個日志檔案用于調試。

在極少數情況下,criu 無法恢複容器,在這種情況下,源容器仍然存在但将被停止,并且必須手動重新啟動。

我們正在跟蹤 launchpad 上關于 criu ubuntu 軟體包的檢查點/恢複相關的錯誤。大多數修複 bug 工作是在上遊的 criu 或 linux 核心上進行,但是這種方式我們更容易跟蹤。

要送出新的 bug 報告,請看這裡。

請務必包括:

你運作的指令和顯示給你的錯誤消息

<code>lxc info</code> 的輸出(*)

<code>lxc info &lt;container name&gt;</code>的輸出

<code>lxc config show -expanded &lt;container name&gt;</code> 的輸出

<code>dmesg</code>(*)的輸出

<code>/proc/self/mountinfo</code> 的輸出(*)

<code>lxc exec &lt;container name&gt; - cat /proc/self/mountinfo</code> 的輸出

<code>uname -a</code>(*)的輸出

<code>/var/log/lxd.log</code>(*)的内容

<code>/etc/default/lxd-bridge</code>(*)的内容

<code>/var/log/lxd/&lt;container name&gt;/</code> 的 tarball(*)

如果報告遷移錯誤,而不是狀态快照或有狀态停止的錯誤,請将上面所有含有(*)标記的源與目标主機的資訊發來。

原文釋出時間為:2017-03-04

本文來自雲栖社群合作夥伴“linux中國”

繼續閱讀