容器管理

XenServer 包含两个新增功能,用于增强 XenServer 上的 Docker 容器的部署。

  • 支持 CoreOS Linux VM 和配置云配置驱动器

  • 面向 CoreOS、Debian 8、Ubuntu 14.04 和 RHEL/CentOS/OEL 7 的容器管理功能

  • 面向 Windows Server 2016 技术预览版中 Windows Server 容器的容器管理预览功能

CoreOS 是精简版 Linux 发行版,已普遍用于托管 Docker 应用程序。CoreOS 云配置驱动器允许用户自定义各种操作系统配置选项。如果在 VM 上启用了容器管理,XenServer 将能够识别 VM 中运行的任何 Docker 容器。

注意:

有关如何安装 CoreOS 来宾系统、配置云配置参数以及管理 Docker 容器的信息,请参阅 XenCenter 帮助。按 F1 或单击帮助

通过容器管理增补包,XenServer 可以执行以下操作:

  • 查询 VM
  • 与云配置驱动器交互
  • 发现应用程序容器
  • 在 XenCenter 的基础结构视图中显示应用程序容器。

XenCenter 还能够与容器交互,以允许执行启动、停止和暂停操作以及使用其他监视功能。有关详细信息,请参阅容器管理补充包

Docker 是什么

Docker 是一个开放式平台,开发人员和系统管理员能够在此平台上构建、交付和运行已分发的应用程序。Docker 容器仅由应用程序及其依赖项组成。该容器在主机操作系统上的用户空间中作为独立的进程运行,与其他容器共享内核和基本文件系统。有关详细信息,请参阅 https://www.docker.com/whatisdocker

注意:

XenServer 容器管理功能补充但不会替代 Docker 环境。您可以使用可用的多个 Docker 管理工具之一管理 VM 中的各个 Docker Engine 实例。

容器管理补充包

容器管理补充包提供以下功能:

监视和可见性: 允许您查看哪些 VM 正在用于 Docker 托管,以及 VM 上的哪些容器正在运行。

诊断: 可访问基础容器信息,例如,转接的网络端口和原始 Docker 映像名称。此功能有助于加快对可能会影响基础结构和应用程序层的问题的调查速度。

性能: 可深入了解哪些容器正在该 VM 上运行。提供与容器上运行的进程和应用程序以及占用的 CPU 资源有关的信息,具体取决于操作系统提供的信息。

控制应用程序: 让您可以使用 XenCenter 启动、停止和暂停能够快速终止有问题的应用程序的应用程序容器(如果操作系统支持)。

注意:

XenServer 支持使用 XenCenter 安装补充包。有关如何使用 XenCenter 安装补充包的信息,请参阅 XenCenter 帮助。如果您更希望使用 xe CLI 进行安装,请参阅 XenServer 补充包和 DDK 指南

使用 XenCenter 管理 Docker 容器

本节介绍与使用 XenCenter 管理您的 CoreOS VM 有关的信息。要管理 CoreOS VM,请完成以下步骤:

  1. 安装或将您的主机升级到 XenServer 7.6。

  2. 安装随 XenServer 7.6 提供的 XenCenter。

  3. 安装可从 Citrix Web 站点获取的容器管理补充包。

  4. 创建 CoreOS VM 并将该 VM 的配置驱动器包括在内。

    在 XenCenter 中创建 CoreOS VM 时,新建 VM 向导将提示您为 VM 指定云配置参数。配置驱动器为 VM 实例提供用户数据。如果您计划使用 XenServer 来管理 VM 内部运行的容器,请创建一个配置驱动器。

    默认情况下,XenCenter 的“云配置参数”页面上包括一组预定义的参数。可以根据您的要求修改这些参数。有关支持的配置参数的详细信息,请参阅 CoreOS 文档。

    警告:

    如果没有为 VM 创建配置驱动器,容器管理可能无法运行。

  5. 为 VM 启用容器管理。可以在 XenCenter 中的 VM 属性选项卡中更新此设置。

注意:

如果在池之间迁移容器管理的 VM,容器管理功能将停止对 VM 起作用。出现此行为的原因是,容器管理功能是使用池特定的键实现的。要重新对 VM 启用容器管理功能,请在 VM 首选项中更新云配置驱动器配置。

在其他 Linux 来宾系统上管理容器

系统会自动为容器管理准备通过默认云配置驱动器配置创建的 CoreOS VM。只需要启用该功能。可以手动准备其他 Linux 来宾系统。只有 Debian 8、Ubuntu 14.04 和 RHEL/CentOS/OEL 7.x VM 支持此功能。

要手动准备 Linux 来宾,请执行以下操作:

  1. 确保 VM 已安装 XenServer Tools,并且已按网络要求和安全性中所述配置了 VM 网络。

  2. 在 VM 中安装 Docker、Ncat 和 SSHD。

    对于 Ubuntu 14.04:apt-get install docker.io nmap openssh-server

    对于 RHEL/CentOS/OEL 7.x:yum install docker nmap openssh-server

  3. 对 docker.service 启用自动启动:

    systemctl enable docker.service

  4. 启动 docker.service

    systemctl start docker.service

    使用非 root 用户进行容器管理。将用户添加到 docker 组以提供对 Docker 的访问权限。

  5. 为容器管理功能准备 VM;请对池中的其中一个主机上的控制域 (dom0) 运行以下命令:

    xscontainer-prepare-vm -v vm_uuid -u username

    其中,vm_uuid 为要准备的 VM,username 为容器管理功能用于管理访问的 VM 上的用户名。

准备脚本将引导您完成该过程,并自动为此 VM 启用容器管理功能。

注意:

如果在池之间迁移容器管理的 VM,容器管理功能将停止对 VM 起作用。出现此行为的原因是,容器管理功能是使用池特定的键实现的。要重新为 VM 启用容器管理功能,请在 VM 上再次运行 xscontainer-prepare-vm 命令。即使在运行此命令后,仍可能可以在原始 XenServer 池中访问该 VM。

访问 Docker 容器控制台和日志

对于 Linux VM,XenCenter 允许客户访问容器控制台和查看日志,从而管理和监控在 Docker 容器上运行的应用程序。要使用 XenCenter 访问容器控制台和日志,请执行以下操作:

  1. 资源窗格中选择容器。

  2. 容器的常规属性部分,单击查看控制台查看容器控制台。要查看控制台日志,请单击查看日志。此操作将在运行 XenCenter 的计算机上打开 SSH 客户端。

  3. 在系统提示时,使用 VM 用户名和密码登录 SSH 客户端。

    注意:

    客户可以通过配置 SSH 公钥/私钥来自动完成身份验证过程。有关详细信息,请参阅以下部分。

自动完成身份验证过程(可选)

访问容器控制台和日志时,客户需要输入 VM 的登录凭据才能验证 SSH 连接。但是,客户可以自动完成身份验证过程,以免手动输入凭据。按照以下说明配置自动身份验证过程:

  1. 生成公钥/私钥对。

  2. 将 SSH 公钥添加到运行容器的 VM 的用户目录。

    • 对于在 CoreOS VM 上运行的容器,将公钥添加到 XenCenter 中的 VM 常规选项卡上的云配置参数部分。
    • 对于 Ubuntu 14.04、RHEL/CentOS/Oracle Linux 7 和 Debian 8 上运行的容器,手动将公钥应手动添加到 ~/.ssh/authorized_keys
  3. 将 SSH 私钥添加到运行 XenCenter 的计算机上的 %userprofile% 目录,并将该密钥重命名为 ContainerManagement.ppk

管理 Windows Server 容器

Windows Server 容器属于 Windows Server 2016 来宾操作系统的一部分。这些容器允许通过将进程隔离到各自的命名空间中来封装 Windows 应用程序。XenServer 容器管理功能支持在 Windows Server 2016 来宾操作系统上监视和管理 Windows Server 容器。

注意:

必须为 Windows Server 2016 VM 配置一个或多个静态 IP 地址以用于 TLS 通信,因为 TLS 服务器证书将绑定到某些 IP 地址。

要为容器管理功能准备 Windows Server 容器,请执行以下操作:

  1. 确保 VM 已安装 XenServer Tools,并且已按网络要求和安全性中所述配置了 VM 网络。

  2. Microsoft 文档中所述在 VM 中安装 Windows Server 容器支持功能。Windows Server 容器不是 Hyper-V 容器。

  3. 在文件夹 C:\ProgramData\docker\config 中创建一个名为 daemon.json 且包含以下内容的文件:

    {
    "hosts": ["tcp://0.0.0.0:2376", "npipe://"],
    "tlsverify": true,
    "tlscacert": "C:\ProgramData\docker\certs.d\ca.pem",
    "tlscert": "C:\ProgramData\docker\certs.d\server-cert.pem",
    "tlskey": "C:\ProgramData\docker\certs.d\server-key.pem"
    }
    
  4. 为容器管理功能准备 VM;请对池中的其中一个主机上的控制域 (dom0) 运行以下命令之一:

    方案 1(对于单用户 VM):使用 XenServer 为此 VM 生成 TLS 证书。

    重要:

    此方案仅在单个用户访问 VM 的环境中是安全的。TLS 服务器和客户端密钥通过使用虚拟 CD 注入到 VM 中。在准备过程中,此信息可能会被恶意用户复制。

    xscontainer-prepare-vm -v vm_uuid -u root --mode tls --generate-certs
    

    其中 vm_uuid 为要准备的 VM。按照屏幕上的说明进行操作,完成准备 Windows Server 容器的过程。该过程涉及与 dom0 和 VM 交互。

    方案 2:使用外部生成的 TLS 证书配置 XenServer

    xscontainer-prepare-vm -v vm_uuid -u root --mode tls \
    --client-cert client_cert --client-key client_key --ca-cert ca_cert
    

    其中,vm_uuid 为要准备的 VM,client_cert 为 TLS 客户端证书,client_key 为 TLS 客户端密钥,ca_cert 为 CA 证书。此方案假定已在 VM 中为 TLS 配置 Docker。

网络要求和安全

重要:

要使用容器管理功能,可能需要放宽与网络隔离有关的安全要求。

为使虚拟化环境具有最高安全性,Citrix 建议管理员通过将 XenServer 的管理网络(包括 XenServer 控制域)与 VM 隔离对网络进行分区。

启用容器管理功能需要在这两个网络之间进行路由,这增加了恶意 VM 攻击管理网络(即 dom0)的风险。为了缓解允许在 VM 与管理网络进行通信的风险,我们建议配置防火墙规则,以仅允许可信源在这两个网络之间启动连接。

在以下情况下,请勿在生产中使用此功能:

  • 如果建议的此网络配置与您的风险状况不一致
  • 如果您缺乏必要的网络或防火墙专业知识来针对您的特定用例充分保护此路由的安全

网络分区和防火墙

与其他 VM 一样,请勿应将容器管理的 VM 直接连接到 XenServer 的管理网络来提供必要的隔离。

要使用容器管理功能,必须能够从 XenServer 的控制域 (dom0) 访问管理的 VM。要监视基于 Linux 的操作系统中的容器,网络连接拓扑和防火墙必须允许从 dom0 到容器管理的 VM 的出站 SSH 连接。要监视 Windows Server 容器,网络连接拓扑和防火墙必须允许从 dom0 到容器管理的 VM 的出站 Docker TLS(目标 TCP 端口 2376)连接。

为了缓解允许在 VM 与管理网络之间进行通信的风险,应通过外部有状态防火墙传输所有通信。必须由专业人员根据您的具体业务和安全要求手动设置和配置此防火墙。

下面是一个示例配置:

为确保网络之间的连接安全,请执行以下操作:

  • 阻止 XenServer 管理网络(包括 dom0)与 VM 网络(包括容器管理的 VM)之间的所有连接。

添加启用容器管理功能的例外:

  • 要监视基于 Linux 的操作系统,请允许 dom0 与容器管理的 VM 之间的出站 SSH(TCP 端口 22)连接(新连接以及已建立的连接)。

  • 要监视 Windows Server 容器,请允许 dom0 与容器管理的 VM 之间的出站 Docker TLS(TCP 端口 2376)连接(新连接以及已建立的连接)。

  • 允许容器管理的 VM 响应 dom0 启动的(已建立)SSH 和 Docker TLS 连接。

基于 Linux 的操作系统中的身份验证

XenServer 的容器管理功能使用池特有的 4096 位专用/公用 RSA 密钥对在容器管理的 VM 进行身份验证。私钥存储在 XenServer 控制域 (dom0) 中。相应的公钥在准备过程中使用云配置驱动器或 ~user/.ssh/authorized_keys 文件在容器管理的 VM 中注册。与所有私钥/公钥对一样,必须安全地保存私钥,因为私钥允许无密码访问所有容器管理的 VM。此访问包括当前管理的 VM 以及过去管理的 VM。

XenServer 的容器管理功能将尝试通过 VM 中运行的 XenServer Tools 公告的 IP 地址访问容器管理的 VM。首次连接后,XenServer 会存储容器管理的 VM 的公钥,并验证该公钥在任何后续连接中是否匹配。请确保仅容器管理的 VM 可通过其公告的 IP(使用 IP Source Guard 或类似方法)进行访问。如果网络拓扑无法确保此行为,Citrix 建议管理员确认 SSH 主机密钥,该密钥是容器管理功能在首次与 VM 建立连接时获取的。

可以使用以下命令访问该密钥:

xe vm-parm-get-uuid=vm_uuid param-name=other-config  /
param-key=xscontainer-sshhostkey

vm_uuid 为 VM 的 UUID

适用于 Windows Server 容器的身份验证

XenServer 使用 SSL 或 TLS 监视和控制 Windows Server 容器。在此实例中,XenServer 用作 SSL/TLS 客户端,Windows Server VM 用作 SSL/TLS 服务器。密钥同时存储在 Dom0 和 VM 中。

重要:

  • 必须安全地保存客户端密钥,因为该密钥允许无密码访问 VM 上的 Docker
  • 必须安全地保存服务器密钥,因为该密钥用于对 VM 上的监视连接进行身份验证

XenServer 容器管理功能使用 –generate-certs 选项生成 TLS 证书和密钥时,会为某个特定池和 VM 生成临时 CA、服务器和客户端证书。证书使用 sha256 哈希,最长有效期为 2*365 天。过了此时间后,应重复执行准备过程。TLS 连接总是使用 AES128-SHA 密码建立。

注意

使用 XenServer 容器管理功能和 Docker 时,请注意以下行为:

  • 重命名容器不会触发更新容器管理视图的操作。此外,在 Ubuntu 14.04 上,从 XenCenter 外部暂停或取消暂停容器不会触发更新该视图的操作。此行为可能意味着 XenServer 可能不显示当前(已重命名/已暂停/已取消暂停)的容器状态。根本原因是视图仅刷新以下 Docker 事件通知。解决方法:可以通过对同一 VM 上的无关容器执行某项操作(即启动或停止)来触发刷新操作。