閱讀446 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

介紹

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

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

要求

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

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

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


  1. apt install criu

使用 CRIU

有狀態快照

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


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

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


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

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


  1. stgraber@dakara:~$ lxc restore c1 second
  2. stgraber@dakara:~$

有狀態快照的停止/啟動

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


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

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

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


  1. root@dakara:~# tree /var/lib/lxd/containers/c1/rootfs/state/
  2. /var/lib/lxd/containers/c1/rootfs/state/
  3. ├── cgroup.img
  4. ├── core-101.img
  5. ├── core-102.img
  6. ├── core-107.img
  7. ├── core-108.img
  8. ├── core-109.img
  9. ├── core-113.img
  10. ├── core-114.img
  11. ├── core-122.img
  12. ├── core-125.img
  13. ├── core-126.img
  14. ├── core-127.img
  15. ├── core-183.img
  16. ├── core-1.img
  17. ├── core-245.img
  18. ├── core-246.img
  19. ├── core-50.img
  20. ├── core-52.img
  21. ├── core-95.img
  22. ├── core-96.img
  23. ├── core-97.img
  24. ├── core-98.img
  25. ├── dump.log
  26. ├── eventfd.img
  27. ├── eventpoll.img
  28. ├── fdinfo-10.img
  29. ├── fdinfo-11.img
  30. ├── fdinfo-12.img
  31. ├── fdinfo-13.img
  32. ├── fdinfo-14.img
  33. ├── fdinfo-2.img
  34. ├── fdinfo-3.img
  35. ├── fdinfo-4.img
  36. ├── fdinfo-5.img
  37. ├── fdinfo-6.img
  38. ├── fdinfo-7.img
  39. ├── fdinfo-8.img
  40. ├── fdinfo-9.img
  41. ├── fifo-data.img
  42. ├── fifo.img
  43. ├── filelocks.img
  44. ├── fs-101.img
  45. ├── fs-113.img
  46. ├── fs-122.img
  47. ├── fs-183.img
  48. ├── fs-1.img
  49. ├── fs-245.img
  50. ├── fs-246.img
  51. ├── fs-50.img
  52. ├── fs-52.img
  53. ├── fs-95.img
  54. ├── fs-96.img
  55. ├── fs-97.img
  56. ├── fs-98.img
  57. ├── ids-101.img
  58. ├── ids-113.img
  59. ├── ids-122.img
  60. ├── ids-183.img
  61. ├── ids-1.img
  62. ├── ids-245.img
  63. ├── ids-246.img
  64. ├── ids-50.img
  65. ├── ids-52.img
  66. ├── ids-95.img
  67. ├── ids-96.img
  68. ├── ids-97.img
  69. ├── ids-98.img
  70. ├── ifaddr-9.img
  71. ├── inetsk.img
  72. ├── inotify.img
  73. ├── inventory.img
  74. ├── ip6tables-9.img
  75. ├── ipcns-var-10.img
  76. ├── iptables-9.img
  77. ├── mm-101.img
  78. ├── mm-113.img
  79. ├── mm-122.img
  80. ├── mm-183.img
  81. ├── mm-1.img
  82. ├── mm-245.img
  83. ├── mm-246.img
  84. ├── mm-50.img
  85. ├── mm-52.img
  86. ├── mm-95.img
  87. ├── mm-96.img
  88. ├── mm-97.img
  89. ├── mm-98.img
  90. ├── mountpoints-12.img
  91. ├── netdev-9.img
  92. ├── netlinksk.img
  93. ├── netns-9.img
  94. ├── netns-ct-9.img
  95. ├── netns-exp-9.img
  96. ├── packetsk.img
  97. ├── pagemap-101.img
  98. ├── pagemap-113.img
  99. ├── pagemap-122.img
  100. ├── pagemap-183.img
  101. ├── pagemap-1.img
  102. ├── pagemap-245.img
  103. ├── pagemap-246.img
  104. ├── pagemap-50.img
  105. ├── pagemap-52.img
  106. ├── pagemap-95.img
  107. ├── pagemap-96.img
  108. ├── pagemap-97.img
  109. ├── pagemap-98.img
  110. ├── pages-10.img
  111. ├── pages-11.img
  112. ├── pages-12.img
  113. ├── pages-13.img
  114. ├── pages-1.img
  115. ├── pages-2.img
  116. ├── pages-3.img
  117. ├── pages-4.img
  118. ├── pages-5.img
  119. ├── pages-6.img
  120. ├── pages-7.img
  121. ├── pages-8.img
  122. ├── pages-9.img
  123. ├── pipes-data.img
  124. ├── pipes.img
  125. ├── pstree.img
  126. ├── reg-files.img
  127. ├── remap-fpath.img
  128. ├── route6-9.img
  129. ├── route-9.img
  130. ├── rule-9.img
  131. ├── seccomp.img
  132. ├── sigacts-101.img
  133. ├── sigacts-113.img
  134. ├── sigacts-122.img
  135. ├── sigacts-183.img
  136. ├── sigacts-1.img
  137. ├── sigacts-245.img
  138. ├── sigacts-246.img
  139. ├── sigacts-50.img
  140. ├── sigacts-52.img
  141. ├── sigacts-95.img
  142. ├── sigacts-96.img
  143. ├── sigacts-97.img
  144. ├── sigacts-98.img
  145. ├── signalfd.img
  146. ├── stats-dump
  147. ├── timerfd.img
  148. ├── tmpfs-dev-104.tar.gz.img
  149. ├── tmpfs-dev-109.tar.gz.img
  150. ├── tmpfs-dev-110.tar.gz.img
  151. ├── tmpfs-dev-112.tar.gz.img
  152. ├── tmpfs-dev-114.tar.gz.img
  153. ├── tty.info
  154. ├── unixsk.img
  155. ├── userns-13.img
  156. └── utsns-11.img
  157. 0 directories, 154 files

還原容器也很簡單:


  1. stgraber@dakara:~$ lxc start c1

實時遷移

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


  1. stgraber@dakara:~$ lxc list c1
  2. +------+---------+-----------------------+----------------------------------------------+------------+-----------+
  3. | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
  4. +------+---------+-----------------------+----------------------------------------------+------------+-----------+
  5. | c1 | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2 |
  6. +------+---------+-----------------------+----------------------------------------------+------------+-----------+
  7. stgraber@dakara:~$ lxc list s-tollana:
  8. +------+-------+------+------+------+-----------+
  9. | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
  10. +------+-------+------+------+------+-----------+
  11. stgraber@dakara:~$ lxc move c1 s-tollana:
  12. stgraber@dakara:~$ lxc list c1
  13. +------+-------+------+------+------+-----------+
  14. | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
  15. +------+-------+------+------+------+-----------+
  16. stgraber@dakara:~$ lxc list s-tollana:
  17. +------+---------+-----------------------+----------------------------------------------+------------+-----------+
  18. | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
  19. +------+---------+-----------------------+----------------------------------------------+------------+-----------+
  20. | c1 | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2 |
  21. +------+---------+-----------------------+----------------------------------------------+------------+-----------+

限製

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

我們跟蹤的問題列表在 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(*)

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

原文發布時間為:2017-03-04

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-25 17:01:47

  上一篇:go  在 Atomic 主機上遠程使用 Docker
  下一篇:go  如何用 R 語言的 Shiny 庫編寫 web 程序