Running a KVM virtual machine inside a runc contianer.
- A host which can run KVM virtual machines using Vagrant.
| #!/bin/sh | |
| # Amazon Linux AMI startup script for a supervisor instance | |
| # | |
| # chkconfig: 2345 80 20 | |
| # description: Autostarts supervisord. | |
| # Source function library. | |
| . /etc/rc.d/init.d/functions | |
| supervisorctl="/usr/local/bin/supervisorctl" |
| GOCMD=go | |
| GOBUILD=$(GOCMD) build | |
| GOCLEAN=$(GOCMD) clean | |
| BINARY_NAME=myapp | |
| .PHONY: test | |
| test: | |
| $(GOCMD) test -v ./... | |
| .PHONY: build |
| # Put this file under /etc/systemd/system/redis.service | |
| [Unit] | |
| Description=Redis Container | |
| After=docker.service | |
| Requires=docker.service | |
| [Service] | |
| TimeoutStartSec=0 | |
| Restart=always |
| L0 = bare metal machine | |
| L1 = VM on bare metal | |
| L2 = VM on VM | |
| First, ensure virtualization is enabled on L0 as described here: https://docs.fedoraproject.org/en-US/quick-docs/using-nested-virtualization-in-kvm/#proc_enabling-nested-virtualization-in-kvm | |
| Next, launch L1 with the following Vagrant config (or an equivalent directly on the hypervisor): | |
| Vagrant.configure("2") do |config| | |
| config.vm.box = "generic/ubuntu1604" |
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - | |
| sudo add-apt-repository \ | |
| "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ | |
| $(lsb_release -cs) \ | |
| stable" | |
| sudo apt-get update | |
| sudo apt-get install -y docker-ce | |
| sudo gpasswd -a $USER docker | |
| echo "Please re-log" |
| # This is based on a Redhat blogpost: | |
| # https://www.projectatomic.io/blog/2014/10/libvirtd_in_containers/ | |
| # https://github.com/projectatomic/docker-image-examples/blob/master/rhel-libvirt/libvirtd/Dockerfile | |
| FROM centos:7 | |
| ENV VAGRANT_VERSION=2.2.0 | |
| RUN yum -y install systemd libvirt-daemon-driver-* libvirt-daemon libvirt-daemon-kvm libvirt-devel qemu-kvm gcc make wget openssh-clients && yum clean all; \ | |
| (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ | |
| rm -f /lib/systemd/system/multi-user.target.wants/*;\ |
| provider "packet" { | |
| auth_token = "${var.auth_token}" | |
| } | |
| # Packet auth token. Generate it on your Packet account. More info: | |
| # https://support.packet.com/kb/articles/api-integrations | |
| variable "auth_token" {} | |
| # The Packet project ID. More info: https://support.packet.com/kb/articles/api-integrations | |
| variable "project_id" {} |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: httpbin | |
| labels: | |
| app: httpbin | |
| spec: | |
| replicas: 3 | |
| selector: |
These instructions assume running Vagrant with a libvirt provider.
Install the vagrant-libvirt plugin using the following:
vagrant plugin install vagrant-libvirt