On Linux, it is very easy to use the local provider with KVM-based virtual machines. However, as the local provider is typically used with LXC containers users wishing to use KVM instead are urged to first read the more general writeup on Installing and configuring Juju for LXC (Linux).
Begin by adding the Juju stable release PPA:
sudo apt-add-repository ppa:juju/stable sudo apt-get update
Now install the local provider and the KVM/libvirt software, including helper tools:
sudo apt-get install juju-local qemu-kvm libvirt-bin bridge-utils virt-manager qemu-system uvtool-libvirt uvtool
Start by generating a generic configuration file for Juju and then switching to the local provider:
juju generate-config juju switch local
This will generate a file,
environments.yaml (if it doesn't already exist),
which will live, on Ubuntu, in your
~/.juju/ directory (and will create the
directory if it doesn't already exist).
Note: If you have an existing configuration, you can use
juju generate-config --show to output the new config file, then copy and
paste relevant areas in a text editor etc.
The key ingredient necessary to use KVM virtual machines is
An example working configuration for using them with the local provider is:
kvm: type: local container: kvm
Note that the name of this provider has been changed from "local" to "kvm". Recall that this label is arbitrary and therefore useful for description purposes.
Proceed to bootstrap your environment:
Verify the setup by adding a machine:
juju add-machine --constraints "root-disk=6G mem=2G"
A KVM guest should appear when using the libvirt client:
virsh list --all Id Name State ---------------------------------------------------- 1 ubuntu-local-machine-1 running
juju status should give something similar to:
"1": agent-state: started agent-version: 126.96.36.199 dns-name: 192.168.122.9 instance-id: ubuntu-local-machine-1 series: trusty hardware: arch=amd64 cpu-cores=1 mem=2048M root-disk=6144M
You can go further and use the KVM guest as a hosting system for LXC containers. This is achieved in the manner in which Juju commands are invoked; no extra Juju configuration is required. What is required, however, is the creation of a network bridge on the KVM guest (LXC host) in order for the containers to have access to the external network (that of the LXC host, or KVM guest).
Although not required, as covered in
Installing and configuring Juju for LXC (Linux), it is
recommended to use LXC cloning to speed up the creation of LXC containers.
lxc-clone cannot be specified during run-time with
Connect to the KVM guest, assuming a Juju machine # of '1' (based on the above
juju ssh 1
Create a simple bridge ('lxcbr0') by editing the primary interface network ('eth0' here, and using DHCP) configuration so it looks like:
auto lxcbr0 iface lxcbr0 inet dhcp bridge_ports eth0
Reboot the KVM guest to ensure the bridge comes up reliably.
To add two (to test connectivity) LXC containers to the KVM guest (machine #1):
juju add-machine lxc:1 juju add-machine lxc:1
The output to
juju status should now look like:
"1": agent-state: started agent-version: 188.8.131.52 dns-name: 192.168.122.9 instance-id: ubuntu-local-machine-1 series: trusty containers: 1/lxc/0: agent-state: started agent-version: 184.108.40.206 dns-name: 10.0.3.58 instance-id: ubuntu-local-machine-1-lxc-0 series: trusty hardware: arch=amd64 1/lxc/1: agent-state: started agent-version: 220.127.116.11 dns-name: 10.0.3.154 instance-id: ubuntu-local-machine-1-lxc-1 series: trusty hardware: arch=amd64 hardware: arch=amd64 cpu-cores=1 mem=2048M root-disk=6144M
And from the KVM guest:
sudo lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------------------------------ juju-trusty-lxc-template STOPPED - - NO ubuntu-local-machine-1-lxc-0 RUNNING 10.0.3.58 - YES ubuntu-local-machine-1-lxc-1 RUNNING 10.0.3.154 - YES
Note: The template container is used for cloning.
To remove one of these containers (1/lxc/0 here):
juju destroy-machine --force 1/lxc/0