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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

远程协议

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”删除源容器。

原文发布时间为:2017-02-03

本文来自云栖社区合作伙伴“Linux中国”

相关文章
|
1月前
|
存储 运维 Kubernetes
云端迁移:备份中心助力企业跨云迁移K8s容器服务平台
本文将简要介绍阿里云容器服务ACK的备份中心,并以某科技公司在其实际的迁移过程中遇到具体挑战为例,阐述如何有效地利用备份中心来助力企业的容器服务平台迁移项目。
|
2月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
321 0
|
4月前
|
Kubernetes 负载均衡 数据中心
在K8S中,在主机和容器上部署应用程序有什么区别?
在K8S中,在主机和容器上部署应用程序有什么区别?
|
4月前
|
存储 Linux Docker
备份和迁移Docker容器
【8月更文挑战第21天】在Linux系统中,备份与迁移Docker容器可通过以下步骤实现:首先,查找并记录需备份容器的ID或名称;其次,若容器正在运行,则需先停止;最后利用`docker export`命令将其导出为tar归档文件以完成备份。对于容器迁移,有两种常见方式:一是直接迁移备份文件至目标服务器,并通过`docker import`命令导入新容器;二是通过创建容器镜像,并推送至镜像仓库,之后在目标服务器上拉取该镜像并运行。值得注意的是,在进行容器迁移时应确保Docker版本兼容,同时关注数据存储、网络配置及权限设置等问题,以保障容器功能正常运作。
211 2
|
7月前
|
Shell Linux Docker
Docker -v 挂载主机目录到容器中(及数据卷容器)
Docker -v 挂载主机目录到容器中(及数据卷容器)
326 0
|
4月前
|
Kubernetes Unix Linux
k8s将节点容器运行时从Docker迁移到Containerd
k8s将节点容器运行时从Docker迁移到Containerd
|
4月前
|
Linux KVM 虚拟化
在Linux中,如何进行虚拟机和容器的备份和迁移?
在Linux中,如何进行虚拟机和容器的备份和迁移?
|
4月前
|
存储 Ubuntu Linux
在Linux中,如何在Linux中使用LXD进行容器管理?
在Linux中,如何在Linux中使用LXD进行容器管理?
|
7月前
|
应用服务中间件 Docker 容器
如何在Docker容器和主机之间复制文件/文件夹
如何在Docker容器和主机之间复制文件/文件夹
|
7月前
|
关系型数据库 MySQL Linux
docker镜像与容器的迁移
docker迁移镜像步骤 docker迁移容器步骤 docker迁移mysql容器步骤