


我們正在積極尋找該項目的貢獻者和維護者。如果您在容器內部有經驗,例如cgroup,命名空間或已為容器周圍的任何開源項目做出了貢獻,例如docker , containerd , nerdctl ,Podman, podman等或涉及處理集裝箱內部設置的構建工具,並有興趣為這個項目做出貢獻,我很樂意與您交談! Golang經驗是首選,但不是必需的。
如果您有興趣為此項目做出貢獻,請與我聯繫@_shishir_m或在此存儲庫中打開一個問題。
Nomad任務驅動程序用於使用集裝箱啟動容器。
集裝箱(containerd.io)是一個輕巧的容器守護程序,用於運行和管理容器生命週期。
Docker守護程序還使用集裝箱。
dockerd (docker daemon) --> containerd --> containerd-shim --> runc
Nomad-Driver-Containerd使Nomad Client可以使用Containerd直接啟動容器,而無需Docker!
主機系統不需要Docker守護程序。

確保正確設置您的$ Gopath 。
$ mkdir -p $GOPATH/src/github.com/Roblox
$ cd $GOPATH/src/github.com/Roblox
$ git clone [email protected]:Roblox/nomad-driver-containerd.git
$ cd nomad-driver-containerd
$ make build (This will build your containerd-driver binary)
如果要為arm64編譯,可以運行:
make -f Makefile.arm64
$ vagrant up
如果流浪VM已經在運行,則vagrant provision 。
設置( vagrant up或vagrant provision )完成並運行Nomad服務器後,您可以使用以下方式檢查註冊的任務驅動程序(也將顯示containerd-driver ):
$ nomad node status (Note down the <node_id>)
$ nomad node status <node_id> | grep containerd-driver
注意: setup.sh是流浪設置的一部分,不應直接執行。
example目錄中幾乎沒有示例作業。
$ nomad job run <job_name.nomad>
將啟動這項工作。
在example README.md
要直接與images和containers進行交互,您可以使用nerdctl ,這是docker兼容CLI的containerd 。 nerdctl已經安裝在/usr/local/bin VAGRANT VM中。
驅動程序配置
| 選項 | 類型 | 必需的 | 預設 | 描述 |
|---|---|---|---|---|
| 啟用 | 布爾 | 不 | 真的 | 啟用/禁用任務驅動程序。 |
| containerd_runtime | 細繩 | 是的 | N/A。 | 容器的運行時,例如io.containerd.runc.v1或io.containerd.runc.v2 。 |
| Stats_interval | 細繩 | 不 | 1s | 收集TaskStats的間隔。 |
| 允許_ privileged | 布爾 | 不 | 真的 | 如果設置為false ,驅動程序將拒絕運行特權作業。 |
| auth | 堵塞 | 不 | N/A。 | 為私人註冊表提供身份驗證。有關更多詳細信息,請參見身份驗證。 |
任務配置
| 選項 | 類型 | 必需的 | 描述 |
|---|---|---|---|
| 圖像 | 細繩 | 是的 | 您的容器的OCI圖像(也是OCI兼容)。 |
| image_pull_timeout | 細繩 | 不 | 控制containerd-driver將等待多長時間,然後取消image中指定的OCI圖像的過程。默認為"5m" 。 |
| 命令 | 細繩 | 不 | 命令覆蓋圖像中定義的命令。 |
| args | []細繩 | 不 | 對命令的論點。 |
| 入口點 | []細繩 | 不 | 字符串列表覆蓋了圖像的入口點。 |
| CWD | 細繩 | 不 | 為您的容器過程指定當前的工作目錄。如果目錄不存在,將為您創建一個目錄。 |
| 特權 | 布爾 | 不 | 在特權模式下運行容器。在特權模式下運行時,您的容器將具有所有Linux功能。 |
| pids_limit | INT64 | 不 | 整數值指定容器的PID限制。默認為無限。 |
| pid_mode | 細繩 | 不 | host或不設置(默認)。設置host與主機共享PID名稱空間。 |
| 主機名 | 細繩 | 不 | 主機名分配給容器。在此選項集啟動多個任務(使用count )時,任務啟動的每個容器都將具有相同的主機名。 |
| host_dns | 布爾 | 不 | 默認值( true )。默認情況下,使用containerd-driver啟動的容器將使用host /etc/resolv.conf 。這類似於docker behavior 。但是,如果您不想使用主機DNS,則可以通過設置host_dns=false關閉此標誌。 |
| seccomp | 布爾 | 不 | 啟用默認的seccomp配置文件。 allowed syscalls列表。 |
| seccomp_profile | 細繩 | 不 | 自定義Seccomp配置文件的路徑。必須將seccomp設置為true才能使用seccomp_profile 。 here找到的默認docker SecComp配置文件可以用作參考,並修改以創建自定義SECCOMP配置文件。 |
| shm_size | 細繩 | 不 | /dev /shm的大小,例如“ 1.28m”,如果您要128 MB /dev /shm。 |
| sysctl | 地圖[字符串]字符串 | 不 | SYSCTL配置的鍵值映射,可以在開始時設置為容器。 |
| READONLY_ROOTFS | 布爾 | 不 | 容器根文件系統將僅讀取。 |
| host_network | 布爾 | 不 | 啟用主機網絡。這相當於--net=host 。 |
| extra_host | []細繩 | 不 | 將作為主機:IP的主機列表添加到 /etc /hosts。 |
| cap_add | []細繩 | 不 | 添加個人功能。 |
| cap_drop | []細繩 | 不 | 刪除不可或缺的功能。 |
| 裝置 | []細繩 | 不 | 要暴露於容器的設備列表。 |
| auth | 堵塞 | 不 | 為私人註冊表提供身份驗證。有關更多詳細信息,請參見身份驗證。 |
| 坐騎 | []堵塞 | 不 | 安裝在容器中的坐騎列表。支持音量,綁定和TMPFS類型安裝座。支持FSTAB樣式mount options 。 |
安裝塊
{
-類型(String)(可選):支持的值是volume , bind或tmpfs 。默認值:卷。
-目標(字符串)(必需):容器中的目標路徑。
-源(字符串)(可選):主機上的源路徑。
-選項([]字符串)(可選):FSTAB樣式mount options 。注意:對於綁定安裝,需要至少rbind和ro 。
}
綁定安裝示例
mounts = [
{
type = "bind"
target = "/target/t1"
source = "/src/s1"
options = ["rbind", "ro"]
}
]
在Task Config中的mounts選項中,您還可以使用Nomad volume_mount stanza將捲安裝到容器中
請參閱example job volume_mount 。
自定義Seccomp個人資料示例
可以下載here找到的默認docker Seccomp配置文件,並修改(通過刪除/添加SYSCALLS)創建自定義Seccomp配置文件。
然後,可以在Nomad客戶端節點上的/opt/seccomp/seccomp.json下保存自定義的seccomp配置文件。
可以使用此自定義SecComp配置文件啟動Nomad作業。
config {
seccomp = true
seccomp_profile = "/opt/seccomp/seccomp.json"
}
sysctl示例
config {
sysctl = {
"net.core.somaxconn" = "16384"
"net.ipv4.ip_forward" = "1"
}
}
auth Stanza允許您為私人註冊表設置憑據,例如,如果您想從Docker Hub的私人存儲庫中提取圖像,則可以為您設置憑據。
可以在Driver Config或Task Config或兩者中設置auth Stanza。
如果在兩個地方設置, Task Config auth將優先於Driver Config驗證。
注意:在下面的示例中, user和pass只是佔位符值,在指定憑據時,需要用實際的username和password替換。下面的auth Stanza可用於Driver Config和Task Config 。
auth {
username = "user"
password = "pass"
}
nomad-driver-containerd支持主機和橋樑網絡。
注意: host和bridge是相互排斥的選項,一次只能使用其中一個。
可以通過將host_network設置為作業規格的任務配置中的true來啟用主機網絡(請參閱Supported options下)。
可以通過在作業規範的任務組部分中設置network節來啟用橋樑網絡。
network {
mode = "bridge"
}
您需要在/opt/cni/bin的Nomad客戶端節點上安裝CNI插件,然後才能使用bridge網絡。
安裝CNI插件的說明。
$ curl -L -o cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
$ sudo mkdir -p /opt/cni/bin
$ sudo tar -C /opt/cni/bin -xzf cni-plugins.tgz
另外,確保已配置了Linux操作系統分佈,以允許通過iPtables路由橋樑網絡進行集裝箱流量。這些可調節物可以設置為如下:
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-arptables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
要在Nomad客戶端節點的啟動上保留這些設置,請在/etc/sysctl.d/或刪除Linux Distribution在該目錄中放置的文件。
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
Nomad支持靜態和動態端口映射。
可以在network節中添加靜態端口映射。
network {
mode = "bridge"
port "lb" {
static = 8889
to = 8889
}
}
在這裡, host端口8889被映射到container端口8889 。
注意:通常不建議使用靜態端口,除了system或專門工作(例如負載平衡器)。
在network節中還啟用了動態端口映射。
network {
mode = "bridge"
port "http" {
to = 8080
}
}
在這裡,Nomad將分配host上的動態端口,該端口將在容器中映射到8080 。
您還可以在nomad official documentation中閱讀有關network stanza更多信息
Nomad在一組通用主機群中安排各種類型的工作負載。因此,未知的位置是不知道的,您需要使用服務發現將任務連接到整個集群中部署的其他服務。 Nomad與領事集成在一起,以提供服務發現和監視。
可以將service節添加到您的工作規範中,以啟用服務發現。
服務節指示Nomad在領事上註冊服務。
如果要在本地運行測試,請使用存儲庫中提供的vagrant VM 。
$ vagrant up
$ vagrant ssh containerd-linux
$ sudo make test
注意:這些是破壞性測試,可以將系統留在變化狀態。
強烈建議作為CI/CD系統的一部分進行這些測試,例如CircleCi或在不可變的基礎架構上,例如Vagrant VM。
您還可以通過指定測試名稱來運行單獨的測試。例如
$ cd tests
$ sudo ./run_tests.sh 001-test-redis.sh
make clean
這將刪除您的二進制: containerd-driver
vagrant destroy
這將破壞您的流浪VM。
ubuntu(> = 16.04)
版權2020 Roblox Corporation
根據Apache許可證(版本2.0)(“許可證”)獲得許可。有關更多信息,請閱讀許可證。