Singularity 基礎介紹

Singularity 基礎介紹

Singularity 是 Greg Kurtzer 在 Lawrence Berkley National 實驗室時,他特別針對大規模、跨節點 HPC 應用和 Deep Leaning 工作負載所開發出的容器化技術,而現在是由他的公司 Sylabs 持續對於可用性與安全性做更進一步的開發,也推出針對企業級版本 Singulairty PRO。Singularity 與其他標準容器格式(OCI)兼容,部署容易並能與所有現有應用和 HPC 基礎架構結合使用,包括資源管理、並行檔案系統、MPI、GPU、InfiniBand 和 FPGA 等。

與當前相容於 OCI Runtime 的解決方案相比,Singularity 有許多優勢,其中使用校驗和加密簽名進行驗證,來保證對所包含容器中應用和數據的信任,以及協助在非安全環境和雲端運行時環境的可重複性和有效性。

Singularity 基本概念

Singularity 主要具備輕量資源開銷小、啟動迅速、快速部署、方便遷移與擴展等等,且支援直接從 Docker Image 轉換為 Singularity SIF Image。

使用 Singularity 有以下幾項好處:

  • 限制容器使用者權限: Singularity 同時支援 root 使用者和非 root 使用者啟動,且容器啟動前後,使用者上情境保持不變,這使得使用者權限在容器內部和外部都是相同的。

這部分對於開發者會有部署困擾,非 root 使用者無法自行建構 Contaienr Image,需要額外通過利用使用者命名空間的 UID/GID 映射,允許非特權使用者以 --fakeroot 使用者的身份運行 Singularity Contaienr,等於使用者擁有與 root 幾乎相同的管理權限。 [更多資訊: Fakeroot feature ]

  • 弱化完全隔離性: Singularity 強調容器服務的便捷性、可移動性和可擴展性,使用單個文件為容器 Singularity Image Format,而弱化容器程序的高度隔離性,性能損失更小、容器體積更小。
    • 開發時進入容器後常會與當前執行環境搞混,需自行修改配置來區分正在執行的是容器內還是容器外
  • 單文件格式增強環境遷徙: Singularity 所依賴的東西都在 Singularity Image Format (SIF™) 文件中,可以輕鬆創建儲存在單文件中,並完整封裝容器環境,不需要再單獨打包/導入,直接複製整個 Image 文件,就可以將整個容器環境從當前系統轉移至其他系統環境。沒有複雜的緩存機制,並且提供特殊壓縮方式,建構出來的 Image 只需佔用非常少的硬碟空間,容器啟動成本應更低。

  • 與當前系統無縫銜接:容器內系統使用者權限、網路、UTS namespace 直接繼承當前主機配置,並且無需進入某個 Image 後再執行指令,可以直接在外部啟用交互模式執行 Image 並進行容器指令。
  • 可以自行啟動無需依賴其他 Daemon: Singularity 提供的完全是一個運行時的環境,不使用時不需要運行單獨的 process,不佔用任何資源,因此所有不由 daemon 代為執行指令,因此解決容器取用資源限制和使用者權限安全問題。

  • 限制執行權限優勢: 大多數執行容器都是對於受信任的容器使用者前提下運行容器,但 Singularity 允許不受信任的使用者,以可信任的方式執行不受信任的容器,防止使用者在容器升級執行權限的能力,方法是保持父行程和容器內的子行程之間連結,使這些子行程與當前使用者有相同權限,來傳遞執令。


Usage Workflow

使用者操作 Singularity 的方法

和 Docker 類似,要運行 Singularity 也需要先獲取 Image,Singularity 可以從 Singularity Hub 或者 Docker Hub 來獲取預編譯的 Image,或者自己撰寫 Singularityfile 建構 Image。

1
2
3
4
5
6
7
8
9
10
11
12
13
# Pull with Docker Hub
$ singularity pull docker://ubuntu:16.04
# Pull with Singularity Hub (ubuntu_16.04.sif)
$ singularity pull sub://ubuntu:16.04


# Singularity Hub build
$ singularity -d build lolcow.simg shub://GodloveD/lolcow

# Docker Hub build
$ singularity -d build lolcow.simg docker://godlovedc/lolcow
$ singularity -d build centos.simg docker://centos
$ singularity -d build ubuntu.simg docker://ubuntu

交互模式運行 (run, shell, exec, instance)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ singularity shell ubuntu_16.04.sif
Singularity>

$ singularity exec ubuntu_16.04.sif cat /etc/os-release
Singularity> cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

$ singularity pull library://alpine

[command] [image] [name of instance]
$ singularity instance start alpine_latest.sif service1

$ singularity instance list

INSTANCE NAME PID IMAGE
service 12715 /home/alpine_latest.sif

補充: 官方相關資源

Sylabs 提供的遠程編譯 Image 服務,可以直接線上撰寫 Singularity file 建構 Image,其在 Cloud 建造你的 Container Image 而不需要 root 權限,可以解決部分使用者沒有權限編譯 Image需求,然後可 build 出來的 Image 暫時放在託管在 Sylabs Library 中提供下載、驗證和使用容器。

Singularity Library

1
2
$ singularity push my.sif library://user/collection/my.sif:latest
$ singularity pull library://user/collection/my.sif:latest

Singularity Remote Builder


Summary

我覺得公司內部選擇 Container Runtime ,以團隊後續規劃方向與需求為主,相信長期針對 AI 資料科學和高效能運算(HPC) 測試及兼具安全為出發點,Singularity 是非常合適採用的容器技術,至於其他很特別的優勢是在於,它可以在使用者無權限的情況下使用 pull/run Container,並且是不需要的額外啟動 daemon,相對於容器內部就無法獲得額外的資源訪問權。

Reference

評論