LXD 2.0 系列(六):远程主机及容器迁移

这是 LXD 2.0 系列介绍文章的第六篇。

  1. LXD 入门
  2. 安装与配置
  3. 你的第一个 LXD 容器
  4. 资源控制
  5. 镜像管理

远程协议

LXD 2.0 支持两种协议:

  • LXD 1.0 API:这是在客户端和 LXD 守护进程之间使用的 REST API,以及在 LXD 守护进程间复制/移动镜像和容器时使用的 REST API。
  • Simplestreams:Simplestreams 协议是 LXD 客户端和守护进程使用的只读、仅针对镜像的协议,用于客户端和 LXD 守护进程获取镜像信息以及从一些公共镜像服务器(如 Ubuntu 镜像)导入镜像。

以下所有内容都将使用这两个协议中的第一个。

安全

LXD API 的验证是通过客户端证书在 TLS 1.2 上使用最近的密钥验证的。 当两个 LXD 守护进程必须直接交换信息时,源守护程序生成一个临时令牌,并通过客户端传输到目标守护程序。 此令牌仅可用于访问特定流,并且会被立即撤销,因此不能重新使用。

为了避免中间人攻击,客户端工具还将源服务器的证书发送到目标服务器。这意味着对于特定的下载操作,目标服务器会被提供源服务器的 URL、所需资源的一次性访问令牌以及服务器应该使用的证书。 这可以防止中间人攻击,并且只允许临时访问所传输的对象。

网络需求

LXD 2.0 使用这样一种模型,某个操作的目标(接收端)直接连接到源以获取数据。

这意味着你必须确保目标服务器可以直接连接到源、可以更新任何所需的防火墙。

我们有个允许反向连接的计划,允许通过客户端代理本身以应对那些严格的防火墙阻止两台主机之间通信的罕见情况。

与远程主机交互

LXD 使用的是“远程”的概念,而不是让我们的用户总是提供主机名或 IP 地址,然后在他们想要与远程主机交互时验证证书信息。

默认情况下,唯一真正的 LXD 远程配置是 local:,这也是默认的远程(所以你不必输入它的名称)。这个本地(local:)远程使用 LXD REST API 通过 unix 套接字与本地守护进程通信。

添加一台远程主机

假设你已经有两台装有 LXD 的机器:你的本机以及远程那台我们称为“foo”的主机。

首先你需要确保“foo”正在监听网络,并设置了一个密码,以便得到一个远程 shell,运行:


  1. lxc config set core.https_address [::]:8443 
  2. lxc config set core.trust_password something-secure 

在你本地 LXD 上,你需要使它对网络可见,这样我们可以从它传输容器和镜像:


  1. lxc config set core.https_address [::]:8443 

现在已经在两端完成了守护进程的配置,你可以添加“foo”到你的本地客户端:


  1. lxc remote add foo 1.2.3.4 

(将 1.2.3.4 替换成你的 IP 或者 FQDN)

看上去像这样:


  1. stgraber@dakara:~$ lxc remote add foo 2607:f2c0:f00f:2770:216:3eff:fee1:bd67 
  2. Certificate fingerprint: fdb06d909b77a5311d7437cabb6c203374462b907f3923cefc91dd5fce8d7b60 
  3. ok (y/n)? y 
  4. Admin password for foo:  
  5. Client certificate stored at server: foo 

你接着可以列出远端服务器,你可以在列表中看到“foo”:


  1. stgraber@dakara:~$ lxc remote list 
  2. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  3. |      NAME       |                         URL                           |   PROTOCOL    | PUBLIC | STATIC | 
  4. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  5. | foo             | https://[2607:f2c0:f00f:2770:216:3eff:fee1:bd67]:8443 | lxd           | NO     | NO     | 
  6. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  7. | images          | https://images.linuxcontainers.org:8443               | lxd           | YES    | NO     | 
  8. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  9. | local (default) | unix://                                               | lxd           | NO     | YES    | 
  10. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  11. | ubuntu          | https://cloud-images.ubuntu.com/releases              | simplestreams | YES    | YES    | 
  12. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 
  13. | ubuntu-daily    | https://cloud-images.ubuntu.com/daily                 | simplestreams | YES    | YES    | 
  14. +-----------------+-------------------------------------------------------+---------------+--------+--------+ 

与它交互

好了,所以我们已经有了一台定义好的远程服务器,我们现在可以做些什么?

现在,就如你看到的,唯一的不同是你必须告诉 LXD 要哪台主机运行。

比如:


  1. lxc launch ubuntu:14.04 c1 

它会在默认主机(lxc remote get-default),也就是你的本机上运行。


  1. lxc launch ubuntu:14.04 foo:c1 

这个会在 foo 上运行。

列出远程主机正在运行的容器可以这么做:


  1. stgraber@dakara:~$ lxc list foo: 
  2. +------+---------+---------------------+-----------------------------------------------+------------+-----------+ 
  3. | NAME |  STATE  |         IPV4        |                     IPV6                      |    TYPE    | SNAPSHOTS | 
  4. +------+---------+---------------------+-----------------------------------------------+------------+-----------+ 
  5. | c1   | RUNNING | 10.245.81.95 (eth0) | 2607:f2c0:f00f:2770:216:3eff:fe43:7994 (eth0) | PERSISTENT | 0         | 
  6. +------+---------+---------------------+-----------------------------------------------+------------+-----------+ 

你要记住的一件事是你需要在远程主机上同时指定镜像和容器。因此如果你在“foo”上有一个“my-image”的镜像,并且希望从它创建一个“c2”的容器,你需要运行:


  1. lxc launch foo:my-image foo:c2 

最后,就如你希望的那样得到一个远程容器的 shell:


  1. lxc exec foo:c1 bash 

复制容器

在两台主机间复制容器就如它听上去那样简单:


  1. lxc copy foo:c1 c2 

你会有一个新的从远程“c1”复制过来的本地“c2”容器。这需要停止“c1”容器,但是你可以在运行的时候只复制一个快照:


  1. lxc snapshot foo:c1 current 
  2. lxc copy foo:c1/current c3 

移动容器

除非你在做实时迁移(将会在之后的文章中讲到),不然你需要在移动前先停止容器,接着就会如你预料的那样。


  1. lxc stop foo:c1 
  2. lxc move foo:c1 local: 

这个例子等同于:


  1. lxc stop foo:c1 
  2. lxc move foo:c1 c1 

是如何工作的

正如你期望的那样, 与远程容器的交互时 LXD 使用的 REST API 并不是通过本地 Unix 套接字,而是通过 HTTPS 传输。

当两个守护程序之间交互时会变得有些棘手,如复制和移动的情况。

在这种情况下会发生:

  1. 用户运行lxc move foo:c1 c1。
  2. 客户端联系 local: 远程以检查是否现有“c1”容器。
  3. 客户端从“foo”获取容器信息。
  4. 客户端从源“foo”守护程序请求迁移令牌。
  5. 客户端将迁移令牌以及源 URL 和“foo”的证书发送到本地 LXD 守护程序以及容器配置和周围设备。
  6. 然后本地 LXD 守护程序使用提供的令牌直接连接到“foo” a) 它连接到第一个控制 websocket b) 它协商文件系统传输协议(zfs 发送/接收,btrfs 发送/接收或者纯 rsync) c) 如果在本地可用,它会解压用于创建源容器的镜像。这是为了避免不必要的数据传输。 d) 然后它会将容器及其任何快照作为增量传输。
  7. 如果成功,客户端会命令“foo”删除源容器。

在线尝试

没有两台机器来尝试远端交互和复制/移动容器?

没有问题,你可以使用我们的 demo 服务。这里甚至还包括了一步步的指导!

作者:Stéphane Graber

来源:51CTO

时间: 2024-09-20 11:37:58

LXD 2.0 系列(六):远程主机及容器迁移的相关文章

LXD 2.0系列之三:你的第一个LXD容器

本文讲的是LXD 2.0系列之三:你的第一个LXD容器,[编者的话]第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具.本文是LXD核心维护者.加拿大程序员Stéphane Graber有关LXD连载博文的第三篇. [LXD 2.0系列开篇:是时候讨论LXD的一切了][LXD 2.0系列之一:LXD简介][LXD 2.0系列之二:LXD安装和配置][LXD 2.0系列之三:你的第一个LXD容器][LXD 2.0系列之四:资源管理][LXD 2.0系列之五:镜像管理][LXD 2.0

LXD 2.0系列之二:LXD安装和配置

本文讲的是LXD 2.0系列之二:LXD安装和配置,[编者的话]第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具.本文是LXD核心维护者.加拿大程序员Stéphane Graber有关LXD连载博文的第二篇. [LXD 2.0系列开篇:是时候讨论LXD的一切了][LXD 2.0系列之一:LXD简介][LXD 2.0系列之二:LXD安装和配置][LXD 2.0系列之三:你的第一个LXD容器][LXD 2.0系列之四:资源管理][LXD 2.0系列之五:镜像管理][LXD 2.0系列

LXD 2.0系列之开篇:是时候讨论LXD的一切了

本文讲的是LXD 2.0系列之开篇:是时候讨论LXD的一切了,[编者的话]第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具.本文是LXD核心维护者.加拿大程序员Stéphane Graber有关LXD连载博文的开篇. 我们一年半前开始这个项目,当越来越接近LXC,LXD和LXCFS 2.0的最终版本时,我想,是时候讨论一下LXD的一切. 这将是一个连载博文,和很多年前我写的"LXC 1.0我做了什么"系列类似,内容包括: [LXD 2.0系列开篇:是时候讨论LXD的一切

LXD 2.0系列之一:LXD简介

本文讲的是LXD 2.0系列之一:LXD简介,[编者的话]第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具.本文是LXD核心维护者.加拿大程序员Stéphane Graber有关LXD连载博文的第一篇. [LXD 2.0系列开篇:是时候讨论LXD的一切了][LXD 2.0系列之一:LXD简介][LXD 2.0系列之二:LXD安装和配置][LXD 2.0系列之三:你的第一个LXD容器][LXD 2.0系列之四:资源管理][LXD 2.0系列之五:镜像管理][LXD 2.0系列之六:

LXD 2.0 系列(三):你的第一个 LXD 容器

这是 LXD 2.0 系列介绍文章的第三篇博客. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 LXD 中的 Docker LXD 中的 LXD 实时迁移 LXD 和 Juju LXD 和 OpenStack 调试,及给 LXD 做贡献 由于在管理 LXD 容器时涉及到大量的命令,所以这篇文章的篇幅是比较长的,如果你更喜欢使用同样的命令来快速的一步步实现整个过程,你可以尝试我们的在线示例! 创建并启动一个新的容器 正如我在先前的文章中提到的一样,LX

LXD 2.0 系列(十二):调试,及给LXD做贡献

介绍 终于要结束了!这个大约一年前开始的这系列文章的最后一篇博文. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 LXD 中的 Docker LXD 中的 LXD 实时迁移 LXD 和 Juju LXD 和 OpenStack 调试,及给 LXD 做贡献 如果你从一开始就关注了这个系列,你应该已经使用了 LXD 相当长的时间了,并且非常熟悉它的日常操作和功能. 但如果出现问题怎么办?你可以做什么来自己跟踪问题?如果你不能,你应该记录什么信息,以便上游

LXD 2.0 系列(九):实时迁移

这是 LXD 2.0 系列介绍文章的第九篇. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 LXD 中的 Docker LXD 中的 LXD 介绍 LXD 2.0 中的有一个尽管是实验性质的但非常令人兴奋的功能,那就是支持容器检查点和恢复. 简单地说,检查点/恢复意味着正在运行的容器状态可以被序列化到磁盘,要么可以作为同一主机上的有状态快照,要么放到另一主机上相当于实时迁移. 要求 要使用容器实时迁移和有状态快照,你需要以下条件: 一个非常新的 Li

LXD 2.0 系列(七):LXD中的Docker

这是 LXD 2.0 系列介绍文章的第七篇. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 为什么在 LXD 中运行 Docker 正如我在系列的第一篇中简要介绍的,LXD 的重点是系统容器,也就是我们在容器中运行一个完全未经修改的 Linux 发行版.LXD 的所有意图和目的并不在乎容器中的负载是什么.它只是设置容器命名空间和安全策略,然后运行 /sbin/init 来生成容器,接着等待容器停止. 应用程序容器,例如由 Docker 或 Rkt 所

LXD 2.0 系列(十二):调试,及给 LXD 做贡献

介绍 终于要结束了!这个大约一年前开始的这系列文章的最后一篇博文. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 LXD 中的 Docker LXD 中的 LXD 实时迁移 LXD 和 Juju LXD 和 OpenStack 调试,及给 LXD 做贡献 如果你从一开始就关注了这个系列,你应该已经使用了 LXD 相当长的时间了,并且非常熟悉它的日常操作和功能. 但如果出现问题怎么办?你可以做什么来自己跟踪问题?如果你不能,你应该记录什么信息,以便上游