commit
6048144487
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.vagrant/
|
19
README.md
19
README.md
@ -23,6 +23,8 @@ Docker daemon is not required on the host system.
|
||||
- [Nomad](https://www.nomadproject.io/downloads.html) >=v0.11
|
||||
- [Go](https://golang.org/doc/install) >=v1.11
|
||||
- [Containerd](https://containerd.io/downloads/) >=1.3
|
||||
- [Vagrant](https://www.vagrantup.com/downloads.html) >=v2.2
|
||||
- [VirtualBox](https://www.virtualbox.org/) v6.0 (or any version vagrant is compatible with)
|
||||
|
||||
## Building nomad-driver-containerd
|
||||
|
||||
@ -37,19 +39,18 @@ $ make build (This will build your containerd-driver binary)
|
||||
## Wanna try it out!?
|
||||
|
||||
```
|
||||
./setup.sh
|
||||
$ vagrant up
|
||||
```
|
||||
The setup script will setup `containerd 1.3.4` and `nomad server+nomad-driver-containerd` (nomad server/client should already be installed on your system, and `setup.sh` only builds the driver) on your system, so you can try out [`example`](https://github.com/Roblox/nomad-driver-containerd/tree/master/example) jobs.
|
||||
or `vagrant provision` if the vagrant VM is already running.
|
||||
|
||||
**NOTE** `setup.sh` overrides your existing `containerd` to `containerd-1.3.4`. This is needed for `io.containerd.runc.v2` runtime.<br/>
|
||||
Your original containerd systemd unit file will be backed up at `/lib/systemd/system/containerd.service.bkp` in case you wanna revert later.
|
||||
|
||||
Once `setup.sh` is complete and the nomad server is up and running, you can check the registered task drivers (which will also show `containerd-driver`) using:
|
||||
Once setup (`vagrant up` OR `vagrant provision`) is complete and the nomad server is up and running, you can check the registered task drivers (which will also show `containerd-driver`) using:
|
||||
```
|
||||
$ nomad node status (Note down the <node_id>)
|
||||
$ nomad node status <node_id> | grep containerd-driver
|
||||
```
|
||||
|
||||
**NOTE:** [`setup.sh`](vagrant/setup.sh) is part of the vagrant setup and should not be executed directly.
|
||||
|
||||
## Run Example jobs.
|
||||
|
||||
There are few example jobs in the [`example`](https://github.com/Roblox/nomad-driver-containerd/tree/master/example) directory.
|
||||
@ -59,7 +60,6 @@ $ nomad job run <job_name.nomad>
|
||||
```
|
||||
will launch the job.<br/>
|
||||
|
||||
**NOTE:** You need to run `setup.sh` before trying out the example jobs.<br/>
|
||||
More detailed instructions are in the [`example README.md`](https://github.com/Roblox/nomad-driver-containerd/tree/master/example)
|
||||
|
||||
## Supported options
|
||||
@ -120,6 +120,11 @@ make clean
|
||||
```
|
||||
This will delete your binary: `containerd-driver`
|
||||
|
||||
```
|
||||
vagrant destroy
|
||||
```
|
||||
This will destroy your vagrant VM.
|
||||
|
||||
## Currently supported environments
|
||||
Ubuntu (>= 16.04)
|
||||
|
||||
|
54
Vagrantfile
vendored
Normal file
54
Vagrantfile
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
# Specify minimum Vagrant version and Vagrant API version
|
||||
Vagrant.require_version ">= 1.6.0"
|
||||
VAGRANTFILE_API_VERSION = "2"
|
||||
|
||||
# Create box
|
||||
Vagrant.configure("2") do |config|
|
||||
config.vm.define "containerd-linux"
|
||||
config.vm.box = "hashicorp/bionic64"
|
||||
config.vm.synced_folder ".", "/home/vagrant/go/src/nomad-driver-containerd"
|
||||
config.ssh.extra_args = ["-t", "cd /home/vagrant/go/src/nomad-driver-containerd; bash --login"]
|
||||
config.vm.network "forwarded_port", guest: 4646, host: 4646, host_ip: "127.0.0.1"
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
vb.name = "containerd-linux"
|
||||
vb.cpus = 2
|
||||
vb.memory = 2048
|
||||
end
|
||||
config.vm.provision "shell", inline: <<-SHELL
|
||||
apt-get update
|
||||
apt-get install -y unzip gcc runc
|
||||
echo "export GOPATH=/home/vagrant/go" >> /home/vagrant/.bashrc
|
||||
echo "export PATH=$PATH:/usr/local/go/bin" >> /home/vagrant/.bashrc
|
||||
source /home/vagrant/.bashrc
|
||||
|
||||
# Install golang-1.14.3
|
||||
if [ ! -f "/usr/local/go/bin/go" ]; then
|
||||
curl -s -L -o go1.14.3.linux-amd64.tar.gz https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz
|
||||
sudo tar -C /usr/local -xzf go1.14.3.linux-amd64.tar.gz
|
||||
sudo chmod +x /usr/local/go
|
||||
rm -f go1.14.3.linux-amd64.tar.gz
|
||||
fi
|
||||
|
||||
# Install nomad-0.11.3
|
||||
if [ ! -f "/usr/bin/nomad" ]; then
|
||||
wget --quiet https://releases.hashicorp.com/nomad/0.11.3/nomad_0.11.3_linux_amd64.zip
|
||||
unzip nomad_0.11.3_linux_amd64.zip -d /usr/bin
|
||||
chmod +x /usr/bin/nomad
|
||||
rm -f nomad_0.11.3_linux_amd64.zip
|
||||
fi
|
||||
|
||||
# Install containerd-1.3.4
|
||||
if [ ! -f "/usr/local/bin/containerd" ]; then
|
||||
curl -L --silent -o containerd-1.3.4.linux-amd64.tar.gz https://github.com/containerd/containerd/releases/download/v1.3.4/containerd-1.3.4.linux-amd64.tar.gz
|
||||
tar -C /usr/local -xzf containerd-1.3.4.linux-amd64.tar.gz
|
||||
rm -f containerd-1.3.4.linux-amd64.tar.gz
|
||||
fi
|
||||
|
||||
# Create source directory for privileged.nomad example job.
|
||||
mkdir -p /tmp/s1
|
||||
|
||||
# Run setup
|
||||
cd /home/vagrant/go/src/nomad-driver-containerd/vagrant
|
||||
./setup.sh
|
||||
SHELL
|
||||
end
|
235
setup.sh
235
setup.sh
@ -1,235 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
export CONTAINERD_VERSION=1.3.4
|
||||
|
||||
main() {
|
||||
echo "INFO: Welcome! nomad-driver-containerd setup."
|
||||
check_root
|
||||
check_os
|
||||
check_nomad
|
||||
check_golang
|
||||
|
||||
echo "WARN: Some installation steps are time consuming. Please be patient!"
|
||||
|
||||
# Save present working directory (pwd).
|
||||
curr_dir=$(echo $PWD)
|
||||
|
||||
if systemctl -q is-active "containerd.service"; then
|
||||
echo "WARN: Containerd detected on the system."
|
||||
read -p "INFO: Backup existing containerd and deploy containerd-${CONTAINERD_VERSION} (Y/N)? Press Y to continue. " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "INFO: Aborting setup..."
|
||||
exit 0
|
||||
fi
|
||||
systemctl stop containerd
|
||||
if [ -f "/lib/systemd/system/containerd.service" ]; then
|
||||
echo "INFO: Backup containerd systemd unit /lib/systemd/system/containerd.service."
|
||||
mv /lib/systemd/system/containerd.service /lib/systemd/system/containerd.service.bkp
|
||||
echo "WARN: Backup file saved at: /lib/systemd/system/containerd.service.bkp"
|
||||
fi
|
||||
fi
|
||||
setup_containerd
|
||||
|
||||
read -p "INFO: Setup nomad server + nomad-driver-containerd (Y/N)? Press Y to continue. " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "INFO: Aborting setup..."
|
||||
cleanup
|
||||
exit 0
|
||||
fi
|
||||
echo "INFO: Cleanup any old binaries."
|
||||
make clean >/dev/null 2>&1
|
||||
echo "INFO: Build nomad-driver-containerd binary: containerd-driver."
|
||||
make build >/dev/null 2>&1 || (cleanup && exit 1)
|
||||
echo "INFO: Create plugin-dir for containerd-driver: /tmp/nomad-driver-containerd."
|
||||
mkdir -p /tmp/nomad-driver-containerd || (cleanup && exit 1)
|
||||
echo "INFO: Move containerd-driver to /tmp/nomad-driver-containerd."
|
||||
mv containerd-driver /tmp/nomad-driver-containerd || (cleanup && exit 1)
|
||||
drop_nomad_unit_file $curr_dir
|
||||
echo "INFO: Reload nomad.service systemd unit."
|
||||
systemctl daemon-reload
|
||||
echo "INFO: Starting nomad server + nomad-driver-containerd."
|
||||
systemctl start nomad || (cleanup && exit 1)
|
||||
if ! systemctl -q is-active "nomad.service"; then
|
||||
echo "ERROR: nomad.service didn't come up. journalctl -u nomad.service for more info."
|
||||
exit 1
|
||||
fi
|
||||
echo "INFO: Setup finished successfully."
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
echo "INFO: Starting cleanup."
|
||||
pushd $curr_dir >/dev/null 2>&1
|
||||
if [ -f "/lib/systemd/system/containerd.service.bkp" ]; then
|
||||
if systemctl -q is-active "containerd.service"; then
|
||||
echo "INFO: Stopping containerd."
|
||||
systemctl stop containerd.service
|
||||
fi
|
||||
|
||||
if [ -f "/tmp/containerd.service" ]; then
|
||||
echo "INFO: Cleanup /tmp/containerd.service."
|
||||
rm -f /tmp/containerd.service
|
||||
fi
|
||||
|
||||
if [ -f "/lib/systemd/system/containerd.service" ]; then
|
||||
echo "INFO: Cleanup: /lib/systemd/system/containerd.service."
|
||||
rm -f /lib/systemd/system/containerd.service
|
||||
fi
|
||||
|
||||
if [ -f "/tmp/containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz" ]; then
|
||||
echo "INFO: Cleanup: /tmp/containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz."
|
||||
rm -f /tmp/containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz
|
||||
fi
|
||||
fi
|
||||
|
||||
if systemctl -q is-active "nomad.service"; then
|
||||
echo "INFO: Stopping nomad server+nomad-driver-containerd."
|
||||
systemctl stop nomad
|
||||
fi
|
||||
|
||||
if [ -f "$curr_dir/nomad.service" ]; then
|
||||
echo "INFO: Cleanup $curr_dir/nomad.service."
|
||||
rm -f $curr_dir/nomad.service
|
||||
fi
|
||||
|
||||
if [ -f "/lib/systemd/system/nomad.service" ]; then
|
||||
echo "INFO: Cleanup: /lib/systemd/system/nomad.service."
|
||||
rm -f /lib/systemd/system/nomad.service
|
||||
fi
|
||||
|
||||
echo "INFO: Cleanup /tmp/nomad-driver-containerd."
|
||||
rm -rf /tmp/nomad-driver-containerd
|
||||
|
||||
echo "INFO: Cleanup containerd-driver binary."
|
||||
make clean >/dev/null 2>&1
|
||||
popd >/dev/null 2>&1
|
||||
echo "INFO: Cleanup complete."
|
||||
}
|
||||
|
||||
setup_containerd() {
|
||||
read -p "INFO: Download containerd (Y/N)? Press Y to continue. " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "INFO: Aborting setup..."
|
||||
cleanup
|
||||
exit 0
|
||||
fi
|
||||
pushd /tmp >/dev/null 2>&1
|
||||
curl -L --silent -o containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz || (cleanup && exit 1)
|
||||
tar -C /usr/local -xzf containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz || (cleanup && exit 1)
|
||||
rm -f containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz
|
||||
read -p "INFO: Drop systemd unit containerd.service into /lib/systemd/system/containerd.service (Y/N)? Press Y to continue. " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "INFO: Aborting setup..."
|
||||
cleanup
|
||||
exit 0
|
||||
fi
|
||||
drop_containerd_unit_file
|
||||
echo "INFO: Reload containerd.service systemd unit."
|
||||
systemctl daemon-reload
|
||||
echo "INFO: Starting containerd daemon."
|
||||
systemctl start containerd || (cleanup && exit 1)
|
||||
popd >/dev/null 2>&1
|
||||
if ! systemctl -q is-active "containerd.service"; then
|
||||
echo "ERROR: containerd.service didn't come up. journalctl -u containerd.service for more info."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
drop_nomad_unit_file() {
|
||||
local nomad=$(which nomad)
|
||||
# Drop nomad server (dev) + nomad-driver-containerd systemd unit file into /lib/systemd/system.
|
||||
cat << EOF > nomad.service
|
||||
# /lib/systemd/system/nomad.service
|
||||
[Unit]
|
||||
Description=nomad server (dev) + nomad-driver-containerd
|
||||
Documentation=https://nomadproject.io
|
||||
After=network.target containerd.service
|
||||
|
||||
[Service]
|
||||
ExecStart=$nomad agent -dev -config=$1/example/agent.hcl -plugin-dir=/tmp/nomad-driver-containerd
|
||||
KillMode=process
|
||||
Delegate=yes
|
||||
LimitNOFILE=1048576
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
TasksMax=infinity
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
mv nomad.service /lib/systemd/system/nomad.service
|
||||
}
|
||||
|
||||
drop_containerd_unit_file() {
|
||||
# Drop containerd systemd unit file into /lib/systemd/system.
|
||||
cat << EOF > containerd.service
|
||||
# /lib/systemd/system/containerd.service
|
||||
[Unit]
|
||||
Description=containerd container runtime
|
||||
Documentation=https://containerd.io
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStartPre=-/sbin/modprobe overlay
|
||||
ExecStart=/usr/local/bin/containerd
|
||||
KillMode=process
|
||||
Delegate=yes
|
||||
LimitNOFILE=1048576
|
||||
# Having non-zero Limit*s causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
TasksMax=infinity
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
mv containerd.service /lib/systemd/system/containerd.service
|
||||
}
|
||||
|
||||
check_golang() {
|
||||
set +e
|
||||
go version >/dev/null 2>&1
|
||||
rc=$?
|
||||
set -e
|
||||
if [ $rc -ne 0 ];then
|
||||
echo "ERROR: Golang is missing. Please install golang >=1.11 to continue with the setup."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_nomad() {
|
||||
set +e
|
||||
which nomad >/dev/null 2>&1
|
||||
rc=$?
|
||||
set -e
|
||||
if [ $rc -ne 0 ];then
|
||||
echo "ERROR: Nomad is missing. Please install nomad >=0.11 to continue with the setup."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_root() {
|
||||
if [ $(id -u) != 0 ]; then
|
||||
echo "ERROR: Run as root user."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_os() {
|
||||
set +e
|
||||
cat /etc/os-release|grep -q -i "Ubuntu"
|
||||
rc=$?
|
||||
set -e
|
||||
if [ $rc -ne 0 ];then
|
||||
echo "ERROR: Unsupported host OS. Run tests on Ubuntu."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
98
vagrant/setup.sh
Executable file
98
vagrant/setup.sh
Executable file
@ -0,0 +1,98 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
echo "INFO: Welcome! nomad-driver-containerd setup."
|
||||
echo "WARN: Some installation steps are time consuming. Please be patient!"
|
||||
|
||||
# Save project root directory.
|
||||
root_dir="/home/vagrant/go/src/nomad-driver-containerd"
|
||||
pushd $root_dir >/dev/null 2>&1
|
||||
echo "INFO: Drop systemd unit containerd.service into /lib/systemd/system/containerd.service."
|
||||
drop_containerd_unit_file
|
||||
echo "INFO: Reload containerd.service systemd unit."
|
||||
systemctl daemon-reload
|
||||
echo "INFO: Starting containerd daemon."
|
||||
systemctl start containerd
|
||||
if ! systemctl -q is-active "containerd.service"; then
|
||||
echo "ERROR: containerd.service didn't come up. journalctl -u containerd.service for more info."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "INFO: Setup nomad server + nomad-driver-containerd."
|
||||
export PATH=$PATH:/usr/local/go/bin
|
||||
echo "INFO: Cleanup any old binaries."
|
||||
make clean >/dev/null 2>&1
|
||||
echo "INFO: Build nomad-driver-containerd binary: containerd-driver."
|
||||
make build >/dev/null 2>&1
|
||||
echo "INFO: Create plugin-dir for containerd-driver: /tmp/nomad-driver-containerd."
|
||||
mkdir -p /tmp/nomad-driver-containerd
|
||||
echo "INFO: Move containerd-driver to /tmp/nomad-driver-containerd."
|
||||
mv containerd-driver /tmp/nomad-driver-containerd
|
||||
drop_nomad_unit_file $root_dir
|
||||
echo "INFO: Reload nomad.service systemd unit."
|
||||
systemctl daemon-reload
|
||||
echo "INFO: Starting nomad server + nomad-driver-containerd."
|
||||
systemctl start nomad
|
||||
if ! systemctl -q is-active "nomad.service"; then
|
||||
echo "ERROR: nomad.service didn't come up. journalctl -u nomad.service for more info."
|
||||
exit 1
|
||||
fi
|
||||
popd >/dev/null 2>&1
|
||||
echo "INFO: Setup finished successfully."
|
||||
}
|
||||
|
||||
drop_nomad_unit_file() {
|
||||
local nomad=$(which nomad)
|
||||
# Drop nomad server (dev) + nomad-driver-containerd systemd unit file into /lib/systemd/system.
|
||||
cat << EOF > nomad.service
|
||||
# /lib/systemd/system/nomad.service
|
||||
[Unit]
|
||||
Description=nomad server (dev) + nomad-driver-containerd
|
||||
Documentation=https://nomadproject.io
|
||||
After=network.target containerd.service
|
||||
|
||||
[Service]
|
||||
ExecStart=$nomad agent -dev -bind=0.0.0.0 -config=$1/example/agent.hcl -plugin-dir=/tmp/nomad-driver-containerd
|
||||
KillMode=process
|
||||
Delegate=yes
|
||||
LimitNOFILE=1048576
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
TasksMax=infinity
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
mv nomad.service /lib/systemd/system/nomad.service
|
||||
}
|
||||
|
||||
drop_containerd_unit_file() {
|
||||
# Drop containerd systemd unit file into /lib/systemd/system.
|
||||
cat << EOF > containerd.service
|
||||
# /lib/systemd/system/containerd.service
|
||||
[Unit]
|
||||
Description=containerd container runtime
|
||||
Documentation=https://containerd.io
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStartPre=-/sbin/modprobe overlay
|
||||
ExecStart=/usr/local/bin/containerd
|
||||
KillMode=process
|
||||
Delegate=yes
|
||||
LimitNOFILE=1048576
|
||||
# Having non-zero Limit*s causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
TasksMax=infinity
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
mv containerd.service /lib/systemd/system/containerd.service
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
x
Reference in New Issue
Block a user