DHCP and dnsmasq - what happened?

Hi,

I have been using LXD on Ubuntu 16.04 having had dnsmasq allocating (static) IP addresses to the containers. The configuration was in /etc/default/lxd-dnsmasq (if I remember correctly at the moment) and lxd-bridge (/etc/default/lxd-bridge) was configured to read that file.

Now I wanted to create a new environment on Ubuntu 18.04. I realize that a lot has changed in Ubuntu Bionic since Xenial (e.g. netplan), but what happened to LXD and dnsmasq? Isn’t there such an easy way to allocate IP addresses anymore?

I have read about using profiles etc., but it appears to be much easier simply running the containers using DHCP and automagically giving them static IP addresses based on the container name (using dnsmasq).

What have I missed?

If you have a managed network in LXD, then LXD is taking care of providing for you a dedicated dnsmasq service to provide DHCP (and DNS) to the containers.

I do not remember seeing a dnsmasq service that works with LXD but is installed on the host’s system as you describe.

In Ubuntu 18.04 you are not affected much by netplan; the networking is there and LXD is doing its own thing with its own dnsmasq service for the managed networking.

When you perform the default configuration with LXD, with the bridge and all (default name lxdbr0), then you get a managed network and you are provided with a dedicated dnsmasq service to support DHCP and DNS to the containers.

Thanks for your answer.

I suppose I have a managed network as the container has network (can access servers on the LAN) and I have a lxdbr0 device.

I’m used to be able to assign custom IP:s to the containers based on their names. How do I do that on Bionic?

I want the following:

container1 -> 10.0.0.1
container2 -> 10.0.0.2
container3 -> 10.0.0.3

Everytime I create a container named container1 it automagically should get IP 10.0.0.1 when it fetches the IP using DHCP, container2 should get 10.0.0.2 and so on.

I know this is not as flexible as it should/could be, but I have an Apache reverse proxy in front of these containers and it needs to know the IP of an specific container… somehow.

This is at least how I have used LXD on Xenial so far.

My plan is to create a cluster consisting of two VM:s containing 2 containers each. The purpose of the cluster is to run a web site. Each VM will have an Apache reverse proxy in front of the containers. The containers should have “public” IP:s in order for the load balancer to be able to balance the load to the containers directly… or is there a better way to achieve this kind of cluster?

See Using static IPs with LXD on how to set a specific IP to a container on a managed network interface in LXD.

In practice, these dynamically provided IP address tend not to change. Obviously, there is no guarantee that LXD’s dnsmasq DHCP server will be giving out the same IP address so in any case it’s good to set specific IP addresses.

Having said that, it’s good that you talk more about your use-case.
I am not sure how well is Apache suited for load-balancing. You may want to try with HAProxy, and here’s a guide. Note that you can also put the load-balancer in a container.

Are your websites dynamic (requiring a DB)? Do you have a special requirement so that the DBs are synced between the two VMs?

I don’t want to build any load balancing stuff myself, I use our load balancer. This is roughly what I intend to do (I wonder how this base64-encoded image will look like in the ready post?):

data:image/png;base64,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Utd48eKFfN/f+36usrEeJmH87ETdzEI97ETddlPU+B3iRm0b5wYh9QYPHz7UkydPct3ms2fP1v58874lmvZOVK1480J6gRqdkeJdG5iOVPOqGiY3vG3aVCXoaLbr/m4Uq18L1d5wRzbOZ1A301APO1G33RQxfi9fvtTdu3f3vh8b5wYhdQNvv/22Pvjgg9y298Ybb8h1XXU6nZU/36xvqSatihyvrs5wqiiONB11VPddhd1otwZuGFKVTDUazZTutrd1DVE07ql9HMp1KoTUkqNuZqEedqJuuyli/J4/f6579+7tfT82zg1C6obefvvt3M6ovvfee/rkJz8p13X12muvXQurG/Ut7qvqVtSaXo6IyehYYb2nSJKUKho2VfVdOY6rSr2t8dlp1llbQdjWoFNXxXXkeFW1xomkmbpVdz4x/LqGSapp71iB58hxHHnBsfqz+T4vnUnN3N6iXeOO6pX5dv1qS8NFO9JpS0HY0aBVlV9p6XJ3Eo07TZ0c11VxCallR93MQj3sRN12U8T4PX36VA8ePNj7fmycG4TULTx8+FC+7+v09FRPnz7V8+fPX/l7VN98882zwb8UVj/++OON+paManJv+lN71FXoBmqNIiXJTINjX159OL8cYNZWxfFU7UyUpLHG7VBu0J2H2+UzqVFXgReqM55vY3jiy2uMlep6SM3cXjxQzavoZDibt+OkIjecB+l02lLF8RSc9DWexavPyqYTnfiE1LKjbmahHnaibrspYvxOT0/16NGjve/HxrlBSN3Sixcv9PjxYz148ED37t3T3bt3df/+/fPAucvrzp07eueddzbqW9wP5VYHWvcX+VknkNcYXbwn7il0qxokmodKr6HRWSqctRWcnclcDqlpojhebCGNNW5X5NZGq0NqxvbifiivNrxoRzJUzauqHy9CqlfXaF1HXiGk8uKV9+v+/fu6e/eu7t27pwcPHujRo0d68eLFZpPSQo5j3+cCqNuuihg/3/cPspbYODcW66+dDbfZ8pnUo6Mjua6rb33rW/roo4826lsyzDiTms406A00S1NNmr4qy8kuHavhBepGuhxKpeyQqljDVl1hUFFQratR8zJD6urtpZq1K3Kc+Rnj+cuR44TqRouQeu3P/Ff7xJnU28CGur18+VLPnz/X06dPdXp6Kt/39fDhw6KbtRc21APXbV43brxd5abx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

In this solution the nodes should have several aliases (cnames). Apache can then based on them pick the right vhost. Or maybe there should be only one vhost per node and the right container is then selected based on some environment variable set on the load balancer? Anyway, that’s not LXD’s responsibility.

I’ll start playing around with lxd network and let’s see what happens.

I’m really confused. It has really become complicated to find answers.

The link you provided above didn’t work for me (or the link worked but the solution didn’t). The container always gets the DHCP address no matter what I do. Any thoughts?

Personally, I prefer to manage my own DHCP/DNS using the actual dnsmasq package. This requires that you configure the dhcp pool for your bridge and then create static dhcp entries for the containers you want,as per below example:

dhcp-range=lxdbr0,10.0.0.1,10.0.0.253,12h
dhcp-host=container1,10.0.0.1
dhcp-host=container2,10.0.0.2
dhcp-host=container3,10.0.0.3

The nice thing is that it will still create DNS entries for these machines from the host, which you can provide downstream.

1 Like

Hi, thanks for the tip! That looks like what I’m used to.

How does it work? A quick test was unsuccessful…

  1. Installed package dnsmasq.
  2. Added your conf lines to /etc/dnsmasq.conf.
  3. Restarted dnsmasq.
  4. Restarted and relaunched container, but in both cases it got the wrong IP.

What else should be done?

If you have set up your bridge to be managed by LXD, there will be a link under /etc/dnsmasq.d/ to /etc/dnsmasq.d-available/lxd, will actually specifically excludes that bridge from being bound by dnsmaq itself. If you want to follow my proposal, you should remove this symlink and restart dnsmasq.

Thanks for your answer, unfortunately it didn’t help.

I removed the symbolic link, and even removed the target file, rebooted the host, but still incorrect IP:s. It still looks like this:

skade@host1:~$ ps -ef | grep dns
lxd        1354      1  0 12:15 ?        00:00:00 dnsmasq --strict-order --bind-interfaces --pid-file=/var/lib/lxd/networks/lxdbr0/dnsmasq.pid --except-interface=lo --interface=lxdbr0 --quiet-dhcp --quiet-dhcp6 --quiet-ra --listen-address=10.234.133.1 --dhcp-no-override --dhcp-authoritative --dhcp-leasefile=/var/lib/lxd/networks/lxdbr0/dnsmasq.leases --dhcp-hostsfile=/var/lib/lxd/networks/lxdbr0/dnsmasq.hosts --dhcp-range 10.234.133.2,10.234.133.254,1h -s lxd -S /lxd/ --conf-file=/var/lib/lxd/networks/lxdbr0/dnsmasq.raw -u lxd

Obviously the “LXD-internal” dnsmasq is operating, but I don’t know how to shut it down. The “distro-dnsmasq” cannot start because port 53 is already in use.

I don’t know what to do. It cannot possible be this difficult to manage containers in newer LXD versions. There MUST be an easy way to set a static IP to the container or preferable have the container in DHCP mode and define the DHCP-stuff outside LXD. By the way, the instructions in “Using static IPs with LXD” linked to above by @simos didn’t work either (=the container didn’t get the IP I wanted it to have). So… what is the problem? My fresh install of Bionic? Or am I myself the problem? :slight_smile:

Impossibru.

Here we go.

$ lxc launch ubuntu:18.04 mystaticip
Creating mystaticip
Starting mystaticip

$ lxc list mystaticip
+------------+---------+----------------------+------+
|    NAME    |  STATE  |         IPV4         | IPV6 |
+------------+---------+----------------------+------+
| mystaticip | RUNNING | 10.10.10.42 (eth0)   |      |
+------------+---------+----------------------+------+

$ lxc stop mystaticip

$ lxc network attach lxdbr0 mystaticip eth0 eth0

$ lxc config device set mystaticip eth0 ipv4.address 10.10.10.2

$ lxc start mystaticip

$ lxc list mystaticip
+------------+---------+---------------------+------+
|    NAME    |  STATE  |        IPV4         | IPV6 |
+------------+---------+---------------------+------+
| mystaticip | RUNNING | 10.10.10.2 (eth0)   |      |
+------------+---------+---------------------+------+

Note that you need to assign an available IP address to the container. The IP address 10.10.10.1 (ends with .1) is obviously not available because it’s the address for the bridge.

Also, regarding your question on how to get the LXD managed bridge not to provide DHCP services to the container, you can just set ipv4.dhcp to false (see https://lxd.readthedocs.io/en/latest/networks/).

Personally, I think it gets very messy (difficult to manage) when you do your own networking on the containers. I would suggest to look into what is provided by LXD and use those. There is lots of functionality in there.

OK, yeah, you mentioned the magic words. Thanks! The static IP obviously must be within the range that the IP and netmask of the bridge defines. I didn’t think of that. Now I can also add the NIC to the container and set the static IP.

You are of course also right that it’s probably easier to use the tools LXD provide than to do stuff in an unintended way.

This is very manual and when I start new containers I don’t want to do stuff manually. How could the lines you typed above (network attach and config device) be automated and applied when launching new containers? Would that be in profiles? How?

The lxc network attach command has a lxc network attach-profile counterpart.
You can create a separate profile like staticip and attach that setting to this profile.
I have not seen an easy way to specify the IP address during lxc launch (https://lxd.readthedocs.io/en/latest/containers/).

Therefore, one option to specify the static IP address during the launch of the container, is to use cloud-init.
See https://blog.simos.info/how-to-preconfigure-lxd-containers-with-cloud-init/

The other option is to do this as before, but not having to start/stop/start the container.
You can use lxc init (note: it’s lxc init, not lxd init) to initialize the container (created but not started yet).
Then, do the configuration of the static IPv4 address and finally start the container.

OK, thanks a lot for your patience.

I think I stick to what you just explained (network attach and config device) and then just make an alias (i.e. script) the container launching. In my case that would be quite all right. I won’t be using the distro-dnsmasq of course.

Thanks a lot!