


我们正在积极寻找该项目的贡献者和维护者。如果您在容器内部有经验,例如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)(“许可证”)获得许可。有关更多信息,请阅读许可证。