如何在CentOS 8.x/RHEL 8.x上设置和使用LXD

时间:2020-01-09 10:43:38  来源:igfitidea点击:

如何在CentOS Linux 8.x或者RHEL 8.x(Red Hat Enterprise Linux)上安装,配置和设置LXD(轻量级Linux容器)?

Linux容器提供的环境与您从VM获得的环境尽可能接近,但没有运行单独的Linux内核并模拟所有硬件所带来的开销。
您可以运行自己喜欢的Linux发行版,例如Debian,Ubuntu,Arch,Gentoo,CentOS,Oracle,OpenSUSE等。

LXD不是LXC的重写。
在幕后,LXD通过liblxc及其Go绑定使用LXC。
本教程向您展示如何在CentOS 8.x云服务器和基于RHEL 8.x的计算机上设置和使用LXD。

更新RHEL/CentOS 8.x服务器

执行以下yum命令:

$ sudo yum update
## reboot Linux box if kernel updated ##
$ sudo reboot

有关更多信息,请参见如何在CentOS 8和RHEL 8上更新和安装软件包以确保安全。

启用和配置EPEL存储库

运行以下命令以在CentOS Linux 8.x上启用和安装EPEL存储库:

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo yum update

有关更多信息,请参见如何在RHEL 8.x上安装EPEL Repo。

在CentOS/RHEL 8上安装snapd

现在启用了EPEL repo,现在该安装snapd了。
我们将使用snap命令在CentOS/RHEL 8上安装LXD。
因此,我们必须安装EPEL存储库中的snapd。

搜索snapd

使用以下任一yum命令/dnf命令:

$ sudo yum search snapd
$ sudo yum list snapd

我们可以通过执行以下命令来详细了解快照包:

sudo yum info snapd
Last metadata expiration check: 0:23:43 ago on Sunday 01 March 2020 11:21:36 AM UTC.
Available Packages
Name         : snapd
Version      : 2.42.2
Release      : 1.el8
Architecture : x86_64
Size         : 18 M
Source       : snapd-2.42.2-1.el8.src.rpm
Repository   : epel
Summary      : A transactional software package manager
URL          : https://github.com/snapcore/snapd
License      : GPLv3
Description  : Snappy is a modern, cross-distribution, transactional package
             : manager designed for working with self-contained, immutable
             : packages.

为Linux容器启用和增加用户名称空间

我们需要使用grubby命令来配置引导程序和Linux内核引导时间选项,例如用户名称空间:

$ sudo grubby --args="namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)"

请确保在以下示例中根据需要替换2147483647
换句话说,更高的数量有助于运行更多的Linux容器:

$ sudo sh -c 'echo "user.max_user_namespaces=2147483647" >> /etc/sysctl.d/99-userns.conf'

重新启动Linux系统,运行:

$ sudo shutdown -r now

或者

$ sudo reboot

重新引导后,通过执行以下cat命令来验证名称空间是否已启用:

cat /proc/cmdline

输出示例:

BOOT_IMAGE=(hd0)/boot/vmlinuz-4.18.0-147.5.1.el8_1.x86_64 root=/dev/sda namespace.unpriv_enable=1 ro console=ttyS0,19200n8 net.ifnames=0 crashkernel=auto rhgb

安装snapd

让我们安装snapd,运行:

$ sudo yum install snapd

确保使用ln命令启用经典快照支持:

$ sudo ln -s /var/lib/snapd/snap /snap

接下来,使用systemctl命令激活并启用snapd.socket服务:

$ sudo systemctl enable --now snapd.socket

验证snapd.socket和服务是否正在运行:

$ sudo systemctl status snapd.socket
$ sudo systemctl status snapd.service

如果snapd.service没有运行它,请执行以下命令:

$ sudo systemctl enable snapd.service
$ sudo systemctl start snapd.service

(可选)您可以重新引导服务器并在安装LXD之前验证这两项服务是否联机:

sudo reboot

在CentOS 8.x或者RHEL 8.x上安装LXD

现在一切都已正确设置并运行,现在是时候使用snap命令安装LXD了:

$ sudo snap install lxd

在CentOS/RHEL 8.x服务器上安装LXD

配置LXD服务器

您无需root用户帐户即可管理和使用LXD。
避免一直使用root用户是一种很好的安全措施。
您要做的就是将admin用户帐户(例如Hyman)添加到lxd组。
将现有用户添加到Linux组的命令如下:

$ sudo usermod -a -G lxd Hyman

使用id命令验证它:

$ newgrp lxd
$ id

确保Hyman用户可以与我们的lxd服务器对话:

$ lxc list

指示用户Hyman可以与我们的LXD服务器对话的输出示例:

If this is your first time running LXD on this machine, you should also run: lxd init
To start your first instance, try: lxc launch ubuntu:18.04
 
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

最后,我们需要在CentOS/RHEL 8上配置LXD,运行:

$ lxd init

请注意,默认情况下未在CentOS/RHEL 8.x服务器上安装Btrfs或者ZFS文件系统软件包。
因此,将LVM用作所有容器的后端存储:

Firewalld允许通过lxdbr0进入竞争

我们为您的CentOS 8设置了防火墙,并通过firewall-cmd命令进行管理。
让我们列出所有活动区域:

sudo firewall-cmd --get-active-zones

如果未列出lxdbr0,则将其添加到受信任区域,以便连接通过。
换句话说,通过lxdbr0允许所有传入流量:

sudo firewall-cmd --add-interface=lxdbr0 --zone=trusted

验证一下:

sudo firewall-cmd --get-active-zones
public
  interfaces: eth0 
trusted
  interfaces: lxdbr0

有关更多信息,请参见如何在RHEL 8上使用FirewallD设置防火墙。

创建并启动您的第一个容器

您可以使用以下命令列出所有容器镜像:

$ lxc image list images:

列出所有图片

当然,您也可以使用grep命令/egrep命令来过滤出镜像:

$ lxc image list images: | grep -i centos
$ lxc image list images: | egrep -i 'ubuntu|debian'

如何使用LXD创建和设置您的第一个容器

要从镜像创建和启动容器,请使用launch命令,如下所示:

lxc launch images:{distro}/{version}/{arch} {container-name-here}

让我们看一些示例,根据您的需要从各种Linux发行镜像创建和启动容器。

CentOS Linux 6/7/8容器

$ lxc launch images:centos/6/amd64 cenots-c6
$ lxc launch images:centos/7/amd64 cenots-c7
$ lxc launch images:centos/8/amd64 cenots-db

Debian Linux 18.4 LTS

$ lxc launch images:ubuntu/18.04/amd64 ubuntu-www1

Fedora Linux 31

$ lxc launch images:fedora/31/amd64 fedora31-c1

好的,我已经在CentOS/RHEL 8.x上设置并使用LXD,下一步该怎么做?

列出您的容器:

$ lxc list

输出示例:

+-------------+---------+-----------------------+------+-----------+-----------+
|    NAME     |  STATE  |         IPV4          | IPV6 |   TYPE    | SNAPSHOTS |
+-------------+---------+-----------------------+------+-----------+-----------+
| cenots-c6   | RUNNING | 10.187.112.165 (eth0) |      | CONTAINER | 0         |
+-------------+---------+-----------------------+------+-----------+-----------+
| cenots-c7   | RUNNING | 10.187.112.26 (eth0)  |      | CONTAINER | 0         |
+-------------+---------+-----------------------+------+-----------+-----------+
| cenots-db   | RUNNING | 10.187.112.118 (eth0) |      | CONTAINER | 0         |
+-------------+---------+-----------------------+------+-----------+-----------+
| fedora31-c1 | RUNNING | 10.187.112.226 (eth0) |      | CONTAINER | 0         |
+-------------+---------+-----------------------+------+-----------+-----------+
| ubuntu-www1 | RUNNING | 10.187.112.125 (eth0) |      | CONTAINER | 0         |
+-------------+---------+-----------------------+------+-----------+-----------+

要启动/停止/重新启动容器,请使用:

$ lxc start container-name
$ lxc stop container-name
$ lxc restart container-name
$ lxc restart ubuntu-www1

删除容器

$ lxc delete container-name
## stop and delete container named fedora31-c1 ##
$ lxc stop fedora31-c1
$ lxc delete fedora31-c1

获取有关您的容器的信息:

$ lxc info container
$ lxc info centos-db

在实例/容器中执行命令:

$ lxc exec container command
$ lxc exec ubuntu-www1 ls /
$ lxc exec ubuntu-www1 -- apt -y update
$ lxc exec ubuntu-www1 -- apt-get -y upgrade
$ lxc exec cenots-db -- yum -y update

传递--user以在centos-c7中以Hyman用户身份运行命令:

$ lxc exec centos-c7 --user Hyman -- command1
$ lxc exec centos-c7 --user www-data -- my-app-server --debug

获得root shell:

$ lxc exec container sh
$ lxc exec centos-db sh
$ lxc exec ubuntu-www1 bash

如何设置firewall-cmd规则以重定向流量

现在,基于LXD的容器和服务正在运行。
您如何到达外界的内部容器?
您有两种选择:

  • 使用反向代理服务器,例如Nginx
  • 设置防火墙规则以将端口重定向到容器

示例(主机上的类型)

查找默认区域:

$ sudo firewall-cmd --get-default-zone
`public`

为公共区域打开端口443

$ sudo firewall-cmd --zone=public --add-service=https --permanent

将端口443转发到LXD服务器10.187.112.125:443

$ sudo firewall-cmd --permanent --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=10.187.112.125

重新加载防火墙:

$ sudo firewall-cmd --reload

测试一下。
打开浏览器并根据您的设置输入网址:

https://your-ip-here
https://your-domain-here