容器技術方案)
功能介紹以及代碼架構解析
iSulad是啥
每天逛這openEuler的社區(qū)和社群,總是看到iSulad,今天啃已啃這個項目的入門玩法:
iSulad怎么用:先看大佬咋說——maintainer李峰
iSulad 輕量級容器引擎功能介紹以及代碼架構解析
lifeng2221dd1 2020-09-14
作者簡介:李峰, 具有多年容器、操作系統(tǒng)軟件開發(fā)經(jīng)驗,對容器引擎、runtime 等領域有比較深入的研究與理解。深度參與 lxc、containers 等開源容器社區(qū)。現(xiàn)在擔任 openEuler 輕量級容器引擎 iSulad 社區(qū) maintainer。
iSulad 是一種由 C/C++編程語言編寫的容器引擎,當前已經(jīng)在 openEuler 社區(qū)開源(https://gitee.com/openeuler/iSulad)。 當前主流的容器引擎 docker、containerd、cri-o 等均是由 GO 語言編寫。隨著邊緣計算、物聯(lián)網(wǎng)等嵌入式設備場景的不斷興起,在資源受限環(huán)境下,業(yè)務容器化的需求越來越強烈。由高級語言編寫的容器引擎在底噪占用上的劣勢越來越凸顯。另外由于容器引擎對外接口的標準化,因此用 C/C++重寫一個容器引擎成為了可能。iSulad 整體架構如下圖所示。
iSulad
iSulad 對外提供命令行以及基于 gRPC 的 CRI 兩種對外接口,其中核心功能根據(jù)業(yè)務分為鏡像管理和容器管理。
通過下圖可以理解 iSulad 在生態(tài)中的定位。
本文介紹 iSulad 的功能特性以及對整體架構進行介紹。
iSulad 功能特性介紹
提供客戶端命令行進行容器、鏡像操作
iSulad 是典型的 CS 架構模式。iSulad 作為 daemon 服務端,同時也提供了單獨的客戶端命令 isula,供用戶使用。
iSula 提供的命令參數(shù)覆蓋了常用的大部分的應用場景。包含容器的操作接口,如運行、停止、刪除、pause 等操作,也包含了鏡像相關的操作,如下載、導入、刪除等。
$ sudo isula --help
USAGE:
isula <command> [args...]
COMMANDS:
attach Attach to a running container
cp Copy files/folders between a container and the local filesystem
create Create a new container
events Get real time events from the server
exec Run a command in a running container
export export container
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container or image
kill Kill one or more running containers
load load an image from a tar archive
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
ps List containers
pull Pull an image or a repository from a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Display information about isula
wait Block until one or more containers stop, then print their exit codes
使用舉例
假設您使用的為openeuler發(fā)行版本,可以采用以下方式使用iSulad。
使用yum命令安裝isulad
[root@openeuler ~]# yum install -y iSulad
安裝完成后,查看服務運行狀態(tài)
[root@openeuler ~]# systemctl status isulad
● isulad.service - iSulad Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/isulad.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-09-14 15:53:43 CST; 4h 35min ago
Main PID: 1248 (isulad)
Tasks: 25
Memory: 88.3M
CGroup: /system.slice/isulad.service
├─1248 /usr/bin/isulad
修改isulad的配置文件,添加鏡像倉庫地址
[root@openeuler iSula]# vi /etc/isulad/daemon.json
{
.......
"registry-mirrors": [
"hub.oepkgs.net"
],
.......
重啟isulad服務
[root@openeuler iSula]# systemctl restart isulad
基于openeuler:20.09鏡像運行容器
創(chuàng)建容器:
[root@openeuler iSula]# isula create -it openeuler/openeuler:20.09
Unable to find image 'openeuler/openeuler:20.09' locally
Image "openeuler/openeuler:20.09" pulling
Image "8c788f4bfb7290e434b2384340a5f9811db6ed302f9247c5fc095d6ec4fc8f32" pulled
e91e5359be653f534312bc2b4703dcc6c4ca0436ac7819e09e1ff0e75ee1d733
由于沒有運行容器,所以利用isula ps命令無法找到剛剛創(chuàng)建的容器:
[root@openeuler iSula]# isula ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可以使用isula pa –a命令可以找到剛剛創(chuàng)建的容器:
[root@ecs-cdf3 ~]# isula ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e91e5359be65 openeuler/openeuler:20.09 "/bin/bash" 8 seconds ago Created e91e5359be653f534312bc2b4703dcc6c4ca0436ac7819e09e1ff0e75ee1d733
啟動容器:
[root@openeuler iSula]# isula start e91e5359be65
由于已經(jīng)運行容器,可以利用isula ps命令查找運行中的容器
[root@openeuler iSula]# isula ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e91e5359be65 openeuler/openeuler:20.09 "/bin/bash" 30 seconds ago Up 4 seconds e91e5359be653f534312bc2b4703dcc6c4ca0436ac7819e09e1ff0e75ee1d733
執(zhí)行命令輸出容器系統(tǒng)版本信息:
[root@ecs-cdf3 ~]# isula exec e91e5359be65 cat /etc/os-release
NAME="openEuler"
VERSION="20.09"
ID="openEuler"
VERSION_ID="20.09"
PRETTY_NAME="openEuler 20.09"
ANSI_COLOR="0;31"
可以看到我們在openeuler 20.03系統(tǒng)上成功運行openeuler 20.09容器。
暫停/恢復一個容器
[root@openeuler iSula]# isula pause e91e5359be65
e91e5359be65
[root@openeuler iSula]# isula unpause e91e5359be65
e91e5359be65
強制刪除運行中的容器
[root@openeuler iSula]# isula rm -f 6c1d81467d33
6c1d81467d3367a90dd6e388a16c80411d4ba76316d86b6f56463699306e1394
刪除鏡像
[root@openeuler iSula]# isula rmi openeuler/openeuler:20.09
Image " openeuler/openeuler:20.09" removed
支持 CRI 標準協(xié)議
CRI(Container Runtime Interface)是由 K8S 定義的容器引擎需要向 k8S 對外提供的容器和鏡像的服務的接口,供容器引擎接入 K8S。
CRI 接口基于 gRPC 實現(xiàn)。iSulad 遵循 CRI 接口規(guī)范,實現(xiàn) CRI gRPC Server,包括 Runtime Service 和 Image Service 分別用來提供容器運行時接口和鏡像操作接口。iSulad 的 gRPC Server 需要監(jiān)聽本地的 Unix socket,而 K8S 的組件 kubelet 則作為 gRPC Client 運行。
iSulad
支持 CNI 網(wǎng)絡標準協(xié)議
CNI(Container Network Interface) 是 google 和 CoreOS 主導制定的容器網(wǎng)絡標準協(xié)議。通過 CNI 協(xié)議,iSulad 通過 JSON 格式的文件與具體網(wǎng)絡插件進行通信,進而實現(xiàn)容器的網(wǎng)絡功能。容器網(wǎng)絡具體的功能均由網(wǎng)絡插件來實現(xiàn)。iSulad 中使用 C 語言實現(xiàn)了 clibcni 接口模塊,用來實現(xiàn)對應功能。
iSulad
遵循 OCI 標準
OCI 包含兩個標準規(guī)范 容器運行時標準 (runtime spec)和 容器鏡像標準(image spec)。
支持 OCI 標準鏡像格式
首先介紹下,什么是容器鏡像。容器運行所需的 rootfs 以及一些資源配置等信息被打包成特定的數(shù)據(jù)結構,稱為容器鏡像?;谌萜麋R像可以方便地運行容器。由于運行環(huán)境和應用被一起打包到了容器鏡像中,這樣就解決了應用部署時的環(huán)境依賴問題。每個容器鏡像由一個或多個層數(shù)據(jù)、以及一個 config.json 配置文件組成。多個層之間有依賴關系,這種依賴關系稱為父子關系(被依賴的層為父層)。運行容器之前,所有層的數(shù)據(jù)會合并掛載成一個 rootfs 供容器使用,稱為容器層。合并后的數(shù)據(jù)如果有沖突,則子層的數(shù)據(jù)會覆蓋父層中路徑名稱都相同的數(shù)據(jù),鏡像組織結構如下圖所示:
iSulad-img-single
鏡像的分層是為了解決空間占用問題。如果本層及其所有遞歸依賴的父層具有相同的數(shù)據(jù),這些數(shù)據(jù)就可以復用,以減少空間占用。下圖描述的是具有相同 layer0 層和 layer1 層的兩個容器鏡像的數(shù)據(jù)復用結構:
iSulad-img-dual
iSulad 支持 OCI 標準鏡像格式以及與 docker 兼容的鏡像格式。能夠 支持從 docker hub 等鏡像倉庫下載容器鏡像,或者導入由 docker 導出的鏡像文件來啟動容器使用。
支持 OCI 標準 runtime
iSulad 支持標準 OCI runtime 操作接口,可以進行容器生命周期管理。iSulad 不僅支持當前主流的容器 runtime 如 runc、kata,而且針對低底噪的需求,將 C 語言編寫的 lxc 進行了適配修改,使其能夠作為支持 OCI 標準協(xié)議的 C 語言 runtime,進一步降低了容器引擎基礎設施底噪開銷。 ? 下面使用 iSulad 來運行一個新的容器,通過查看運行過程中產(chǎn)生的進程以及持久化的配置,理解運行新容器的過程。
運行容器,首先需要下載鏡像,我們使用 前文中提到的 openeuler/openeuler:20.09 來作為容器鏡像。
調(diào)用 isula 客戶端命令下載鏡像。
$ sudo isula pull openeuler/openeuler:20.09
Image "openeuler/openeuler:20.09" pulling
Image "c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998" pulled
運行容器指創(chuàng)建一個新的容器,并啟動它。
$ sudo isula run -itd openeuler/openeuler:20.09
42fc2595f876b5a18f7729dfb10d0def29789fb73fe0f1327e0277e6d85189a1
運行容器后,可以通過本地文件查看持久化的容器配置文件。
# cd /var/lib/isulad/engines/lcr/42fc2595f876b5a18f7729dfb10d0def29789fb73fe0f1327e0277e6d85189a1
# ls -al
total 92
drwxr-x--- 3 root root 4096 7月 27 16:25 .
drwxr-x--- 3 root root 4096 7月 27 16:25 ..
-rw-r----- 1 root root 4045 7月 27 16:25 config
-rw-r----- 1 root root 23878 7月 27 16:25 config.json
-rw-r----- 1 root root 2314 7月 27 16:25 config.v2.json
-rw-r----- 1 root root 0 7月 27 16:25 console.log
-rw-r----- 1 root root 101 7月 27 16:25 hostconfig.json
-rw-r--r-- 1 root root 10 7月 27 16:25 hostname
-rw-r--r-- 1 root root 183 7月 27 16:25 hosts
drwx------ 3 root root 4096 7月 27 16:25 mounts
-rw-r----- 1 root root 5 7月 27 16:25 ocihooks.json
-rw-r--r-- 1 root root 707 7月 27 16:25 resolv.conf
-rw-r----- 1 root root 26140 7月 27 16:25 seccomp
其中 config.json 文件為符合 OCI 標準協(xié)議的容器配置文件,內(nèi)容包括啟動容器所需的配置信息。
# cat config.json
{
"ociVersion": "1.0.1",
"hooks": {
},
"hostname": "localhost",
"mounts": [
{
"source": "tmpfs",
"destination": "/dev",
"options": [
"nosuid",
"strictatime",
"mode=755",
"size=65536k"
],
"type": "tmpfs"
},
{
"source": "mqueue",
"destination": "/dev/mqueue",
"options": [
"nosuid",
"noexec",
"nodev"
],
"type": "mqueue"
},
...
config.v2.json 為 iSulad 維護管理容器持久化的一些信息,包括容器的基礎配置,以及創(chuàng)建時間,啟動時間,容器的 PID、運行啟動時間等信息。
# cat config.v2.json
{
"CommonConfig": {
"Path": "sh",
"Config": {
"Hostname": "localhost",
"User": "",
"Tty": true,
"OpenStdin": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh"
],
"WorkingDir": "",
"LogDriver": "json-file"
},
"Created": "2020-07-27T16:25:16.170149428+08:00",
"Image": "openeuler/openeuler:20.09",
"ImageType": "oci",
"Name": "42fc2595f876b5a18f7729dfb10d0def29789fb73fe0f1327e0277e6d85189a1",
"id": "42fc2595f876b5a18f7729dfb10d0def29789fb73fe0f1327e0277e6d85189a1"
},
"Image": "sha256:c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998",
"State": {
"FinishedAt": "0001-01-01T00:00:00Z",
"Pid": 19232,
"PPid": 19229,
"StartTime": 2731408,
"PStartTime": 2731402,
"Running": true,
"StartedAt": "2020-07-27T16:25:16.286812971+08:00"
}
}
- 性能表現(xiàn)
iSulad 代碼架構介紹
前面介紹了 iSulad 的主要的功能特性,現(xiàn)在讓我們深入到 iSulad 的代碼中,了解下 iSulad 的代碼組織架構。
DDD 分層架構設計
iSulad 采用 DDD(Domain Driven Design,領域驅動設計)的思想進行架構分層組織,層次劃分如下:
ddd
各邏輯分層劃分以及對應的職責如下:
層次 職責劃分
用戶界面 負責向用戶展現(xiàn)信息以及解釋用戶命令
接口層 客戶端服務端通信接口、CRI 接口的定義與實現(xiàn)
應用層 調(diào)用領域層的接口,實現(xiàn)對應的業(yè)務應用
領域層 本層包含關于領域的信息,這是 iSulad 軟件的核心所在。包含多種模塊,業(yè)務邏輯實際的執(zhí)行層
基礎設施層 本層作為其他層的支撐庫。它提供各種工具函數(shù)供其他層次調(diào)用使用
根據(jù)上述邏輯分層的設計思想,iSulad 對應源碼目錄架構設計為:
iSulad-img-single
其中 api 目錄中定義了 iSulad 對外提供的 gRPC 服務的 proto 文件,在編譯時會使用 grpc 生成對應客戶端、服務端代碼。
各層代碼組織結構
用戶界面層
用戶界面層的代碼位于 src/cmd 目錄下,在該目錄下,提供了 iSulad 對外的命令行接口。在 cmd 目錄下,提供了 isula 客戶端、isulad 服務端、isulad-shim 三個命令行相關的命令行解析、參數(shù)顯示。代碼組織結構如下:
├── CMakeLists.txt
├── command_parser.c
├── command_parser.h
├── isula # 客戶端命令行以及子命令的定義
│ ├── base # 容器操作基礎命令,如創(chuàng)建、啟動、刪除等命令
│ ├── client_arguments.c
│ ├── client_arguments.h
│ ├── CMakeLists.txt
│ ├── extend # 容器操作擴展命令,如update更新容器資源、events查看容器事件日志
│ ├── images # 鏡像相關操作命令,如下載、導入、刪除等操作
│ ├── information # 查詢?nèi)萜餍畔⒉僮髅睿鏸nspect、info等操作
│ ├── isula_commands.c
│ ├── isula_commands.h
│ ├── main.c
│ └── stream # 長連接命令,如cp、attach、exec等需要與服務端進行長連接操作的命令
├── isulad # 服務端命令行以及參數(shù)的定義
│ ├── CMakeLists.txt
│ ├── isulad_commands.c
│ ├── isulad_commands.h
│ └── main.c
└── isulad-shim # isulad-shim命令行以及參數(shù)的定義
│ ├── CMakeLists.txt
│ ├── common.c
│ ├── common.h
│ ├── main.c
│ ├── process.c
│ ├── process.h
│ ├── terminal.c
│ └── terminal.h
└── options # 通用的參數(shù)解析方法
│ ├── CMakeLists.txt
│ ├── opt_log.c
│ ├── opt_log.h
│ ├── opt_ulimit.c
│ └── opt_ulimit.h
接口層
iSulad 的接口層代碼位于 src/daemon/entry 目錄,其中提供了客戶端服務端通信接口、CRI 接口的定義。
用以處理客戶端接口的請求以及 CRI 接口請求。
其中 CRI 接口處理中,可以從文件名中看到,iSulad 分別實現(xiàn)了 image 和 runtime 的兩種 service。
├── CMakeLists.txt
├── connect # 處理客戶端請求
│ ├── CMakeLists.txt
│ ├── grpc # grpc 請求接口處理
│ ├── rest # restful 請求接口處理
│ ├── service_common.c
│ └── service_common.h
└── cri # 處理CRI接口請求
├── checkpoint_handler.cc
├── checkpoint_handler.h
├── CMakeLists.txt
├── cni_network_plugin.cc
├── cni_network_plugin.h
├── cri_container.cc # cri接口中容器相關操作請求接口處理
├── cri_container.h
├── cri_image_service.cc # cri接口中image相關操作請求接口處理
├── cri_image_service.h
├── cri_runtime_service.cc # cri接口中runtime相關操作請求接口處理
├── cri_runtime_service.h
├── cri_sandbox.cc # cri接口中pod相關操作請求接口處理
├── cri_sandbox.h
├── cri_security_context.cc # cri接口中安全配置處理
├── cri_security_context.h
└── websocket # 使用websocket服務處理CRI 流式服務請求
應用層
iSulad 的應用層代碼位于 src/daemon/executor 目錄,其作用為調(diào)用領域層的接口,實現(xiàn)對應的業(yè)務應用,屬于業(yè)務調(diào)度層??梢詮奈募A的命名中看到,應用層分別實現(xiàn)了 image 和 runtime 的兩種業(yè)務模塊。
├── callback.c
├── callback.h
├── CMakeLists.txt
├── container_cb # 容器業(yè)務模塊
│ ├── CMakeLists.txt
│ ├── execution.c
│ ├── execution_create.c
│ ├── execution_create.h
│ ├── execution_extend.c
│ ├── execution_extend.h
│ ├── execution.h
│ ├── execution_information.c
│ ├── execution_information.h
│ ├── execution_network.c
│ ├── execution_network.h
│ ├── execution_stream.c
│ ├── execution_stream.h
│ ├── list.c
│ └── list.h
└── image_cb # 鏡像業(yè)務模塊
├── CMakeLists.txt
├── image_cb.c
└── image_cb.h
領域層
領域層包含領域的信息,這是 iSulad 軟件的核心所在。其中包含各個業(yè)務模塊,是業(yè)務邏輯實際的執(zhí)行層。領域層代碼位于 src/daemon/modules。
├── api # 領域層統(tǒng)一對外提供的頭文件,供應用層調(diào)用
│ ├── CMakeLists.txt
│ ├── container_api.h
│ ├── events_collector_api.h
│ ├── events_sender_api.h
│ ├── event_type.h
│ ├── image_api.h
│ ├── io_handler.h
│ ├── log_gather_api.h
│ ├── plugin_api.h
│ ├── runtime_api.h
│ ├── service_container_api.h
│ ├── service_image_api.h
│ └── specs_api.h
├── CMakeLists.txt
├── container # 容器模塊,維護容器全生命周期,維護容器狀態(tài)
│ ├── CMakeLists.txt
│ ├── container_events_handler.c
│ ├── container_events_handler.h
│ ├── container_gc
│ ├── containers_store.c
│ ├── containers_store.h
│ ├── container_state.c
│ ├── container_state.h
│ ├── container_unix.c
│ ├── container_unix.h
│ ├── health_check
│ ├── restart_manager
│ ├── restore
│ └── supervisor
├── events # 事件收集模塊,負責收集iSulad運行過程中產(chǎn)生的容器、鏡像事件
│ ├── CMakeLists.txt
│ ├── collector.c
│ ├── monitord.c
│ └── monitord.h
├── events_sender # 事件發(fā)送模塊,該接口提供向事件收集模塊發(fā)送事件的接口
│ ├── CMakeLists.txt
│ └── event_sender.c
├── image # 鏡像管理模塊
│ ├── CMakeLists.txt
│ ├── embedded # embedded格式鏡像管理
│ ├── external # external格式鏡像管理
│ ├── image.c
│ ├── image_rootfs_handler.c
│ ├── image_rootfs_handler.h
│ └── oci # oci格式鏡像管理
├── log # 日志收集模塊
│ ├── CMakeLists.txt
│ └── log_gather.c
├── plugin # 插件機制模塊
│ ├── CMakeLists.txt
│ ├── plugin.c
│ ├── pspec.c
│ └── pspec.h
├── runtime # 容器運行時模塊
│ ├── CMakeLists.txt
│ ├── engines # 基于lxc的輕量級runtime對接接口
│ ├── isula # oci 標準runtime對接接口
│ └── runtime.c
├── service # 服務模塊,包含多個模塊協(xié)同調(diào)用的實現(xiàn)
│ ├── CMakeLists.txt
│ ├── io_handler.c
│ ├── service_container.c # 容器服務操作接口
│ └── service_image.c # 鏡像服務操作接口
└── spec # oci規(guī)范配置模塊,對外提供OCI spec合并、校驗等功能接口
├── CMakeLists.txt
├── specs.c
├── specs_extend.c
├── specs_extend.h
├── specs_mount.c
├── specs_mount.h
├── specs_namespace.c
├── specs_namespace.h
├── specs_security.c
├── specs_security.h
├── verify.c # 配置校驗功能接口
└── verify.h
基礎設施層
基礎設施層位于 src/utils 目錄下,本層作為其他層的支撐庫。它提供各種工具函數(shù)供其他層次調(diào)用使用:
├── buffer # buffer 工具函數(shù)
│ ├── buffer.c
│ ├── buffer.h
│ └── CMakeLists.txt
├── CMakeLists.txt
├── console # IO 終端處理工具函數(shù)
│ ├── CMakeLists.txt
│ ├── console.c
│ └── console.h
├── cpputils # C++ 使用到的工具函數(shù),包含基礎字符串處理、url、線程工具
│ ├── CMakeLists.txt
│ ├── cxxutils.cc
│ ├── cxxutils.h
│ ├── stoppable_thread.cc
│ ├── stoppable_thread.h
│ ├── url.cc
│ └── url.h
├── cutils # C使用到的工具函數(shù),包含基礎字符串處理、數(shù)據(jù)類型轉換、文件處理、正則表達式等工具函數(shù)
│ ├── CMakeLists.txt
│ ├── util_atomic.c
│ ├── util_atomic.h
│ ├── utils_aes.c
│ ├── utils_aes.h
│ ├── utils_array.c
│ ├── utils_array.h
│ ├── utils_base64.c
│ ├── utils_base64.h
│ ├── utils.c
│ ....
├── http # http 處理工具函數(shù),包含http請求、解析、認證等工具
│ ├── certificate.c
│ ├── certificate.h
│ ├── CMakeLists.txt
│ ├── http.c
│ ├── http.h
│ ├── mediatype.h
│ ├── parser.c
│ ├── parser.h
│ ├── rest_common.c
│ └── rest_common.h
├── sha256 # sha256 工具函數(shù),用來計算sha256
│ ├── CMakeLists.txt
│ ├── sha256.c
│ └── sha256.h
└── tar # 壓縮、解壓工具函數(shù),用來壓縮、解壓文件
├── CMakeLists.txt
├── isulad_tar.c
├── isulad_tar.h
├── util_archive.c
├── util_archive.h
├── util_gzip.c
└── util_gzip.h
調(diào)用流程
可以借助Structure101 代碼分析工具,梳理出 iSulad 各個代碼目錄之前的調(diào)用依賴關系。
iSulad
首先,用戶界面層(cmd)作為上層,僅會調(diào)用其他模塊的接口,不會被其他模塊所依賴。cmd 會調(diào)用 client 目錄中的函數(shù),與 daemon 端進行通信。由于 cmd 目錄中存在 iSulad daemon 的命令行接口,因此會依賴 daemon 目錄下的函數(shù)定義。
daemon 目錄作為服務端代碼的頂層目錄,其中包含接口層(entry)、應用層(executor)、領域層(modules)的代碼。接口層作為調(diào)用 daemon 服務的入口,需要調(diào)用其他層中的函數(shù)進行業(yè)務調(diào)度處理,而不會被其他層次所依賴。應用層需要調(diào)用領域層(modules)中各個模塊的接口來實現(xiàn)具體的業(yè)務。
modules 目錄作為 iSulad 的核心領域層代碼,包含各個子功能模塊的具體實現(xiàn)。以 image 模塊為例,首先在 src/daemon/modules/api 中提供了 image_api.h,屏蔽了各種不同鏡像格式的差異,對外提供統(tǒng)一的 image 操作函數(shù)接口。
int image_module_init(const isulad_daemon_configs *args);
void image_module_exit();
int im_list_images(const im_list_request *request, im_list_response **response);
int im_rm_image(const im_rmi_request *request, im_remove_response **response);
int im_tag_image(const im_tag_request *request, im_tag_response **response);
int im_inspect_image(const im_inspect_request *request, im_inspect_response **response);
int im_import_image(const im_import_request *request, char **id);
int im_load_image(const im_load_request *request, im_load_response **response);
int im_pull_image(const im_pull_request *request, im_pull_response **response);
char *im_get_image_type(const char *image, const char *external_rootfs);
bool im_config_image_exist(const char *image_name);
int im_login(const im_login_request *request, im_login_response **response);
int im_logout(const im_logout_request *request, im_logout_response **response);
int im_container_export(const im_export_request *request);
void free_im_export_request(im_export_request *ptr);
在鏡像管理模塊內(nèi)部,對不同格式的鏡像操作進行區(qū)分。
static const struct bim_type g_bims[] = {
#ifdef ENABLE_OCI_IMAGE
{
.image_type = IMAGE_TYPE_OCI,
.ops = &g_oci_ops,
},
#endif
{ .image_type = IMAGE_TYPE_EXTERNAL, .ops = &g_ext_ops },
#ifdef ENABLE_EMBEDDED_IMAGE
{ .image_type = IMAGE_TYPE_EMBEDDED, .ops = &g_embedded_ops },
#endif
};
其他模塊也都是類似的設計,具體深入到不同模塊的詳細解析,在后續(xù)的博客中會一一進行分析。
【版權聲明】Copyright ? 2024 openEuler Community。本文由openEuler社區(qū)首發(fā),歡迎遵照 CC-BY-SA 4.0 協(xié)議規(guī)定轉載。轉載時敬請在正文注明并保留原文鏈接和作者信息。
原文鏈接:https://www.openeuler.org/zh/blog/lifeng2221dd1/2020-09-14-isulad-architecture.html
P.S.
iSulad提問
問他們:在倉庫里提issue文章來源:http://www.zghlxwxcb.cn/news/detail-832653.html
iSulad_SIG
iSulad是一個有趣的SIG(興趣小組)
有18個倉:文章來源地址http://www.zghlxwxcb.cn/news/detail-832653.html
iSulad的倉庫:
倉庫鏈接:https://gitee.com/openeuler/iSulad 官網(wǎng)鏈接:https://www.openeuler.org/zh/other/projects/isula/
到了這里,關于DP讀書:社區(qū)文檔(小白向)解讀——iSulad 輕量級容器引擎功能介紹以及代碼架構解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!