lxd容器

circlelll發表於2024-03-14

持續部署

背景

旨在實體機資源不足的條件下,使用虛擬容器進行持續部署工作。

資源充足的條件下,可快速拉起多個部署環境進行驗證,例如如下情況:

  • 滿足多人的機器使用需求:每個元件或每個人都可擁有自己的測試環境進,可規避其他人的修改對自身的影響
  • 基於 feature 的測試驗證需求:針對每一個 feature ,可以進行環境部署進行驗證
  • 基於多分支的測試驗證需求:同時有多版本和多分支的情況下,可進行不同環境的部署

同時,自動化簡化了部署需要的中間過程,更加高效。

目標

系統部署條件需求:

  • ubuntu18.04 系統
  • 服務透過 systemd 進行管理

基於以上條件,需要選擇合適的容器進行部署。

技術

此處選擇 lxd 的容器進行部署

1 簡介

1.1 lxd

lxd 全稱是 Linux容器守護程式(Linux Container Daemon),其實就是一個提供了 REST API 的 lxc 容器管理器,可以透過 API 進行容器的管理和控制。

lxd 構建在 lxc(Linux Containers)之上。lxc提供了容器技術的基礎,而 lxd則是對 lxc進行了更高階別的管理和控制,提供了更多的功能和工具。

1.2 lxc

lxc 是 Linux Container 的縮寫,也就是 Linux 容器,用於透過單個 Linux 核心在受控主機上虛擬執行多個 Linux 系統。

LXC起源於cgroup和namespaces,使得程序之間相互隔離。

1、lxc 使用核心的 Cgroups 功能,來提供程序和網路空間的隔離,來替代透過建立一個完整的虛擬機器來為應用程式提供隔離環境。

2、lxc 就是一種輕量級虛擬化,將 Linux 程序沙盒化,使用的是 Linux 中的 namespace 技術進行資源隔離:

  • pid namespace 隔離了程序,
  • mount namespace 隔離了檔案系統,
  • network namespace 隔離了網路

2 使用場景

lxd 的使用場景介於虛擬機器和 docker 容器之間。如果需要一個完整的系統,要在這個系統裡面執行較複雜的操
作,比如mount、systemctl、snap之類的,這個時候docker容器可能就無法滿足,但是虛擬機器又
大笨重,一臺機器開幾個例項,宿主機就吃不消了。也就是說在需要大量輕量虛擬機器的場景下,lxd 比較合適。

為什麼選擇 lxd 容器而不是 docker 容器?

docker 容器是一個應用程式級容器,它將應用和其依賴環境全部打包到一個單一物件中,在不包含完整的作業系統的情況下就能執行普通應用。並且,docker 容器通常不直接執行 systemd,因為 systemd 是 Linux 系統的 init 管理器,用於啟動和管理系統服務,而 docker 容器通常只執行單個應用程式。如果使用docker來進行部署,systemd管理需要單獨處理。

lxd/lxc 是一個系統級別的容器,和 docker 容器最大的不同是提供了完整的作業系統虛擬化。

總結:docker 容器是面向應用程式的,而 lxd/lxc 是面向系統的,它提供了一個完整的系統。

3 基本使用

3.1 安裝和初始化lxd

lxd 的例項包括容器和虛擬機器,此處只介紹容器。

在 ubuntu 上透過 snap 進行安裝:

①安裝 snap

檢視版本,看是否已安裝

>snap version
snap    2.61.1
snapd   2.61.1
series  16
ubuntu  18.04
kernel  5.4.0-150-generic

若未安裝

sudo apt update
sudo apt install snapd

②安裝lxd

sudo snap install lxd

若錯誤說明已安裝,更新以確保最新版本

sudo snap refresh lxd

③初始化lxd,此處使用最小化

lxd init --minimal

3.2 建立並啟動容器

①建立並啟動一個新的容器,ubuntu:22.04為映象,first為容器名

lxc launch ubuntu:22.04 first

這步會慢,需要下載映象,如果網路無法下載,可使用export和import進行匯出和匯入

②建立並啟動容器second

lxc launch ubuntu:22.04 second

這步會快些,因為映象已經下載過了

③複製容器

# 執行複製
lxc copy first third
# 檢視容器列表,可見複製出來的容器third不會自動啟動
lxc list
# 啟動容器,此處使用restart會報錯
lxc start third

④檢視容器詳細資訊

lxc info first

3.3 配置容器

可在建立時分配資源,如記憶體、cpu、磁碟等

①建立容器:限制一個vCPU和192M記憶體,limited為容器名

lxc launch ubuntu:22.04 limited --config limits.cpu=1 --config limits.memory=192MiB

②檢視配置

lxc config show limited

③檢視實體機和容器中限制

# 記憶體
free -m
lxc exec limited -- free -m
# cpu
nproc
lxc exec limited -- nproc

④容器執行時可更新配置

# 設定配置:limited為配置名
lxc config set limited limits.memory=128MiB、
# 檢查配置
lxc config show limited
lxc exec limited -- free -m

3.4 與容器互動

①命令互動

# 互動式
# 執行命令:進入互動介面
lxc exec first -- bash
# 執行命令
cat /etc/*release
# 退出互動shell
exit

# 非互動式
lxc exec first -- apt-get update
lxc exec first -- apt-get install sl -y
lxc exec first -- /usr/games/sl

②檔案匯入和匯出

# 從 lxd 容器中拉取檔案或目錄到本地系統
lxc file pull <container_name>/<remote_path> [<local_path>]
# 用於將本地系統中的檔案或目錄推送到 lxd 容器中	
lxc file push [<local_path>] <container_name>/<remote_path>

3.5 快照管理

①建立容器first的快照clean

lxc snapshot first clean

②恢復快照

lxc restore first clean

③刪除快照

lxc delete first/clean

4 常用命令

一、映象
檢視映象:lxc image list
刪除映象:lxc image delete <fingerprint-or-alias>
匯出映象:lxc image export <image-alias> /home/exported-image.tar.xz
		 此處會生成兩個檔案
匯入映象:lxc image import 檔案1.xz 檔案2.root --alias <new-image-alias>
二、容器 	
檢視容器:lxc list
建立容器:lxc launch <image-name> <container-name>
	 或:lxc launch <fingerprint> <container-name>	
容器互動:lxc exec first -- bash或者lxc shell 容器名
停止容器:lxc stop <container-name>
刪除容器:lxc delete <container-name>
強制刪除:lxc delete <container-name> --force
三、配置
1、設定埠對映:
lxc config device add <container-name> <device-name> proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80
    - proxy: 裝置型別,表示埠代理。
    - listen=tcp:0.0.0.0:8080: 定義在主機上監聽的地址和埠。
    - connect=tcp:127.0.0.1:80: 定義連線到容器內部的地址和埠。
2、設定磁碟目錄/掛載目錄:
lxc config device add <container-name> <device-name>t disk source=/host/path/path/on/host path=/container/path
3、檢視所有裝置:lxc config device list
四、快照
建立快照:lxc snapshot first clean
檢視快照:lsx list first/lsx info first
恢復快照:lxc restore first clean
刪除快照:lxc delete first/clean

實現

實際部署方案:

資源受限:只使用兩個容器

容器1:作為基礎安裝驗證

容器2:進行各元件的替換更新

資源不限制:

容器1:作為基礎安裝驗證

容器...:針對每個feature驗證時,建立新容器進行驗證

參考:

1、官方文件:Canonical LXD documentation (ubuntu.com)

2、docker、LXC、LXD的區別及傳統的虛擬機器與作業系統虛擬化的區別_lxd容器-CSDN部落格

3、LXC 和 LXD 容器總結_lxc lxd-CSDN部落格

相關文章