Merge pull request #26 from Roblox/vagrant

Vagrant setup.
This commit is contained in:
Shishir 2020-07-15 17:37:54 -07:00 committed by GitHub
commit 6048144487
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 165 additions and 242 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vagrant/

View File

@ -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
View 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
View File

@ -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
View 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 "$@"