PRF:Part 6 - LXD 2.0--Remote hosts and container migration

@geekpi
This commit is contained in:
wxy 2017-02-02 23:31:26 +08:00
parent a9db082306
commit 5bc576f7ef

View File

@ -9,55 +9,55 @@ LXD 2.0 系列(六):远程主机及容器迁移
LXD 2.0 支持两种协议: LXD 2.0 支持两种协议:
* LXD 1.0 API这是在客户端和LXD守护进程之间使用的REST API以及在复制/移动镜像和容器时在LXD守护进程之间使用的REST API。 * LXD 1.0 API这是在客户端和 LXD 守护进程之间使用的 REST API以及在 LXD 守护进程间复制/移动镜像和容器时使用的 REST API。
* SimplestreamsSimplestreams协议是LXD客户端和守护进程使用的只读、只有镜像的协议获取镜像信息以及从一些公共镜像服务器如Ubuntu镜像导入镜像。 * SimplestreamsSimplestreams 协议是 LXD 客户端和守护进程使用的只读、仅针对镜像的协议,用于客户端和 LXD 守护进程获取镜像信息以及从一些公共镜像服务器(如 Ubuntu 镜像)导入镜像。
以下所有内容都将使用这两个协议中的第一个。 以下所有内容都将使用这两个协议中的第一个。
### 安全 ### 安全
LXD API的验证是通过使用最近的密钥通过TLS 1.2的客户端证书验证。 当两个LXD守护程序必须直接交换信息时,源守护程序生成一个临时令牌,并通过客户端传输到目标守护程序。 此令牌仅可用于访问特定流,并且立即撤销,因此不能重新使用。 LXD API 的验证是通过客户端证书在 TLS 1.2 上使用最近的密钥验证的。 当两个 LXD 守护进程必须直接交换信息时,源守护程序生成一个临时令牌,并通过客户端传输到目标守护程序。 此令牌仅可用于访问特定流,并且会被立即撤销,因此不能重新使用。
为了避免中间人攻击,客户端工具还将源服务器的证书发送到目标。 这意味着对于特定的下载操作目标服务器会被提供源服务器的URL、需要的资源的一次性访问令牌以及服务器应该使用的证书。 这可以防止MITM攻击并且只允许临时访问传输对象。 为了避免中间人攻击,客户端工具还将源服务器的证书发送到目标服务器。这意味着对于特定的下载操作,目标服务器会被提供源服务器的 URL、需资源的一次性访问令牌以及服务器应该使用的证书。 这可以防止中间人攻击,并且只允许临时访问所传输的对象。
### 网络需求 ### 网络需求
LXD 2.0使用一种模型,它其中操作的目标(接收端)直接连接到源以获取数据。 LXD 2.0 使用这样一种模型,某个操作的目标(接收端)直接连接到源以获取数据。
这意味着你必须确保目标服务器可以直接连接到源、可以更新任何所需的防火墙。 这意味着你必须确保目标服务器可以直接连接到源、可以更新任何所需的防火墙。
我们有个[允许反向连接的计划][1],允许通过客户端本身代理以应对那些严格的防火墙阻止两台主机之间通信的罕见情况。 我们有个[允许反向连接的计划][1],允许通过客户端代理本身以应对那些严格的防火墙阻止两台主机之间通信的罕见情况。
### 与远程主机交互 ### 与远程主机交互
LXD使用的是“remotes”的概念而不是让我们的用户总是提供主机名或IP地址然后在他们想要与远程主机交互时验证证书信息。 LXD 使用的是“远程”的概念,而不是让我们的用户总是提供主机名或 IP 地址,然后在他们想要与远程主机交互时验证证书信息。
默认情况下,唯一真正的LXD远程配置是“local:”这也是默认远程所以你不必输入它的名称。本地远程使用LXD REST API通过unix套接字与本地守护进程通信。 默认情况下,唯一真正的 LXD 远程配置是 `local:`,这也是默认的远程(所以你不必输入它的名称)。这个本地(`local:`)远程使用 LXD REST API 通过 unix 套接字与本地守护进程通信。
### 添加一台远程主机 #### 添加一台远程主机
假设你已经有两台装有LXD的机器你的本机以及远程那台我们称为“foo”的主机。 假设你已经有两台装有 LXD 的机器:你的本机以及远程那台我们称为“foo”的主机。
首先你需要确保“foo”正在监听网络并设置了一个密码因此在远程shell上运行: 首先你需要确保“foo”正在监听网络并设置了一个密码以便得到一个远程 shell运行:
``` ```
lxc config set core.https_address [::]:8443 lxc config set core.https_address [::]:8443
lxc config set core.trust_password something-secure lxc config set core.trust_password something-secure
``` ```
在你本地LXD上你需要使它对网络可见这样我们可以从它传输容器和镜像 在你本地 LXD 上,你需要使它对网络可见,这样我们可以从它传输容器和镜像:
``` ```
lxc config set core.https_address [::]:8443 lxc config set core.https_address [::]:8443
``` ```
现在守护进程的配置已经在两段完成了你可以添加“foo”到你的本地客户端 现在已经在两端完成了守护进程的配置你可以添加“foo”到你的本地客户端
``` ```
lxc remote add foo 1.2.3.4 lxc remote add foo 1.2.3.4
``` ```
(将 1.2.3.4 替换成你的IP或者FQDN) (将 1.2.3.4 替换成你的 IP 或者 FQDN
看上去像这样: 看上去像这样:
@ -88,11 +88,11 @@ stgraber@dakara:~$ lxc remote list
+-----------------+-------------------------------------------------------+---------------+--------+--------+ +-----------------+-------------------------------------------------------+---------------+--------+--------+
``` ```
### 与它交互 #### 与它交互
好了,所以我们已经有了一台定义好的远程服务器,我们现在可以做些什么? 好了,所以我们已经有了一台定义好的远程服务器,我们现在可以做些什么?
好了就如你看到现在的唯一的不同是你不许告诉LXD要哪台主机运行。 现在,就如你看到的,唯一的不同是你必须告诉 LXD 要哪台主机运行。
比如: 比如:
@ -100,13 +100,13 @@ stgraber@dakara:~$ lxc remote list
lxc launch ubuntu:14.04 c1 lxc launch ubuntu:14.04 c1
``` ```
它会在默认主机(“lxc remote get-default”也就是你的本机上运行。 它会在默认主机(`lxc remote get-default`也就是你的本机上运行。
``` ```
lxc launch ubuntu:14.04 foo:c1 lxc launch ubuntu:14.04 foo:c1
``` ```
这个会在foo上运行。 这个会在 foo 上运行。
列出远程主机正在运行的容器可以这么做: 列出远程主机正在运行的容器可以这么做:
@ -125,13 +125,13 @@ stgraber@dakara:~$ lxc list foo:
lxc launch foo:my-image foo:c2 lxc launch foo:my-image foo:c2
``` ```
最后就如你希望的那样得到一个远程容器的shell 最后,就如你希望的那样得到一个远程容器的 shell
``` ```
lxc exec foo:c1 bash lxc exec foo:c1 bash
``` ```
### 复制容器 #### 复制容器
在两台主机间复制容器就如它听上去那样简单: 在两台主机间复制容器就如它听上去那样简单:
@ -146,9 +146,9 @@ lxc snapshot foo:c1 current
lxc copy foo:c1/current c3 lxc copy foo:c1/current c3
``` ```
### 移动容器 #### 移动容器
除非你在做实时更新(将会在之后的文章中覆盖),不然你需要在移动前先停止容器,接着就会如你预料的那样。 除非你在做实时迁移(将会在之后的文章中讲到),不然你需要在移动前先停止容器,接着就会如你预料的那样。
``` ```
lxc stop foo:c1 lxc stop foo:c1
@ -164,30 +164,29 @@ lxc move foo:c1 c1
### 这些如何工作 ### 这些如何工作
正如你期望的那样, 与远程容器的交互时LXD只使用完全相同的HTTPS传输的API而不是通过本地Unix套接字使用REST API 正如你期望的那样, 与远程容器的交互时 LXD 使用的 REST API 并不是通过本地 Unix 套接字,而是通过 HTTPS 传输
当两个守护程序之间交互时会变得有些棘手,如复制和移动的情况。 当两个守护程序之间交互时会变得有些棘手,如复制和移动的情况。
有有以下这些情况 在这种情况下会发生
1.用户运行“lxc move fooc1 c1” 1. 用户运行`lxc move fooc1 c1`
2.客户端联系本地:远程以检查现有的“c1”容器。 2. 客户端联系 `local:` 远程以检查是否现有“c1”容器。
3.客户端从“foo”获取容器信息。 3. 客户端从“foo”获取容器信息。
4.客户端从源“foo”守护程序请求迁移令牌。 4. 客户端从源“foo”守护程序请求迁移令牌。
5.客户端将迁移令牌以及源URL和“foo”证书发送到本地LXD守护程序以及容器配置和周围设备。 5. 客户端将迁移令牌以及源 URL 和“foo”证书发送到本地 LXD 守护程序以及容器配置和周围设备。
6.然后本地LXD守护程序使用提供的令牌直接连接到“foo” 6. 然后本地 LXD 守护程序使用提供的令牌直接连接到“foo”
  A.它连接到第一个控制websocket a) 它连接到第一个控制 websocket
  B.它协商文件系统传输协议zfs发送/接收btrfs发送/接收或者纯rsync    b) 它协商文件系统传输协议zfs 发送/接收btrfs 发送/接收或者纯 rsync
  C.如果在本地可用,它会解压用于创建源容器的镜像。这是为了避免不必要的数据传输。    c) 如果在本地可用,它会解压用于创建源容器的镜像。这是为了避免不必要的数据传输。
  D.然后它会将容器及其任何快照作为增量传输。    d) 然后它会将容器及其任何快照作为增量传输。
7.如果成功客户端会命令“foo”删除源容器。 7. 如果成功客户端会命令“foo”删除源容器。
### 在线尝试 ### 在线尝试
没有两台机器来尝试远端交互和复制/移动容器? 没有两台机器来尝试远端交互和复制/移动容器?
没有问题,你可以使用我们的[demo服务][2]。 没有问题,你可以使用我们的 [demo 服务][2]。这里甚至还包括了一步步的指导!
这里甚至还包括了一步步的指导!
### 额外信息 ### 额外信息
@ -202,11 +201,11 @@ LXD 的 IRC 频道: #lxcontainers on irc.freenode.net
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
via: https://www.stgraber.org/2016/03/19/lxd-2-0-your-first-lxd-container-312/ via: https://www.stgraber.org/2016/04/12/lxd-2-0-remote-hosts-and-container-migration-612/
作者:[Stéphane Graber][a] 作者:[Stéphane Graber][a]
译者:[geekpi](https://github.com/geekpi) 译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织翻译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织翻译,[Linux中国](https://linux.cn/) 荣誉推出