持續部署
背景
旨在實體機資源不足的條件下,使用虛擬容器進行持續部署工作。
資源充足的條件下,可快速拉起多個部署環境進行驗證,例如如下情況:
- 滿足多人的機器使用需求:每個元件或每個人都可擁有自己的測試環境進,可規避其他人的修改對自身的影響
- 基於 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部落格