Linux中國

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

介紹

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

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

要求

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

  • 一個非常新的 Linux 內核,4.4 或更高版本。
  • CRIU 2.0,可能需要一些 cherry-pick 的提交,具體取決於你確切的內核配置。
  • 直接在主機上運行 LXD。 不能在容器嵌套下使用這些功能。
  • 對於遷移,目標主機必須至少實現源主機的指令集,目標主機內核必須至少提供與源主機相同的系統調用,並且在源主機上掛載的任何內核文件系統也必須可掛載到目標主機上。

Ubuntu 16.04 LTS 已經提供了所有需要的依賴,在這種情況下,您只需要安裝 CRIU 本身:

apt install criu

使用 CRIU

有狀態快照

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

stgraber@dakara:~$ lxc snapshot c1 first
stgraber@dakara:~$ lxc info c1 | grep first
 first (taken at 2016/04/25 19:35 UTC) (stateless)

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

stgraber@dakara:~$ lxc snapshot c1 second --stateful
stgraber@dakara:~$ lxc info c1 | grep second
 second (taken at 2016/04/25 19:36 UTC) (stateful)

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

stgraber@dakara:~$ lxc restore c1 second
stgraber@dakara:~$

有狀態快照的停止/啟動

比方說你由於升級內核或者其他類似的維護而需要重啟機器。與其等待重啟後啟動所有的容器,你可以:

stgraber@dakara:~$ lxc stop c1 --stateful

容器狀態將會寫入到磁碟,會在下次啟動時讀取。

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

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

實時遷移

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

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         |
+------+---------+-----------------------+----------------------------------------------+------------+-----------+

限制

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

我們跟蹤的問題列表在 Launchpad上

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

要是有問題,CRIU 會儘可能地在轉儲時失敗,而不是在恢復時。在這種情況下,源容器將繼續運行,快照或遷移將會失敗,並生成一個日誌文件用於調試。

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

發送 bug 報告

我們正在跟蹤 Launchpad 上關於 CRIU Ubuntu 軟體包的檢查點/恢復相關的錯誤。大多數修復 bug 工作是在上游的 CRIU 或 Linux 內核上進行,但是這種方式我們更容易跟蹤。

要提交新的 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(*)的內容
  • /etc/default/lxd-bridge(*)的內容
  • /var/log/lxd/<container name>/ 的 tarball(*)

如果報告遷移錯誤,而不是狀態快照或有狀態停止的錯誤,請將上面所有含有(*)標記的源與目標主機的信息發來。

額外信息

CRIU 的網站在: 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 項目的領導者,目前在加拿大魁北克蒙特利爾的家所在的Canonical 有限公司擔任 LXD 的技術主管。

via: https://stgraber.org/2016/04/25/lxd-2-0-live-migration-912/

作者:Stéphane Graber 譯者:geekpi 校對:wxy

本文由 LCTT 組織翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國