blog++: uncloud metadata
This commit is contained in:
		
					parent
					
						
							
								95fe4eb9d5
							
						
					
				
			
			
				commit
				
					
						c339bc86d7
					
				
			
		
					 3 changed files with 141 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -6,7 +6,7 @@ author: ungleich virtualisation team
 | 
			
		|||
---
 | 
			
		||||
twitter_handle: ungleich
 | 
			
		||||
---
 | 
			
		||||
_hidden: yes
 | 
			
		||||
_hidden: no
 | 
			
		||||
---
 | 
			
		||||
_discoverable: yes
 | 
			
		||||
---
 | 
			
		||||
| 
						 | 
				
			
			@ -16,16 +16,17 @@ Data begins to accumulate
 | 
			
		|||
body:
 | 
			
		||||
 | 
			
		||||
This time we describe how to
 | 
			
		||||
store information in a database.
 | 
			
		||||
store information in a database and why we selected etcd as the
 | 
			
		||||
primary database.
 | 
			
		||||
 | 
			
		||||
The previous time we described
 | 
			
		||||
[how to generate MAC
 | 
			
		||||
addresses(../how-to-build-an-openstack-alternative-step-3-automating-mac-addresses/),
 | 
			
		||||
addresses](../how-to-build-an-openstack-alternative-step-3-automating-mac-addresses/),
 | 
			
		||||
a key element of uncloud.
 | 
			
		||||
 | 
			
		||||
## More Data
 | 
			
		||||
 | 
			
		||||
We know have a couple of running VMs, we want to remember which VMs
 | 
			
		||||
We now have a couple of running VMs, we want to remember which VMs
 | 
			
		||||
are running and also add more information. Who owns a VM? And later
 | 
			
		||||
also where is the VM running.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +37,8 @@ The main reason for it is that we don't want to add a single point of
 | 
			
		|||
failure into uncloud and we don't need guarantees provided by
 | 
			
		||||
standard SQL.
 | 
			
		||||
 | 
			
		||||
An alternative we still consider to etcd is postgresql, which also
 | 
			
		||||
An alternative we still consider is postgresql. While it is not
 | 
			
		||||
inherently distributed (at all), it also
 | 
			
		||||
supports storing JSON and has quite a sophisticated messaging system.
 | 
			
		||||
 | 
			
		||||
## Refactoring: phasing in a database
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
title: How to build an OpenStack alternative: Step 5, adding metadata
 | 
			
		||||
---
 | 
			
		||||
pub_date: 2020-01-15
 | 
			
		||||
---
 | 
			
		||||
author: ungleich virtualisation team
 | 
			
		||||
---
 | 
			
		||||
twitter_handle: ungleich
 | 
			
		||||
---
 | 
			
		||||
_hidden: no
 | 
			
		||||
---
 | 
			
		||||
_discoverable: yes
 | 
			
		||||
---
 | 
			
		||||
abstract:
 | 
			
		||||
Let the VMs get information about themselves
 | 
			
		||||
---
 | 
			
		||||
body:
 | 
			
		||||
 | 
			
		||||
This time we describe how virtual machines can get information about
 | 
			
		||||
themselves like which ssh keys should have access to it.
 | 
			
		||||
 | 
			
		||||
The previous time we
 | 
			
		||||
[added a data base to
 | 
			
		||||
uncloud](../how-to-build-an-openstack-alternative-step-4-adding-a-database/).
 | 
			
		||||
 | 
			
		||||
## Motivation
 | 
			
		||||
 | 
			
		||||
If we were to start VMs without a metadata service, all of the VMs
 | 
			
		||||
would be looking identical and would not be able to know, whom to
 | 
			
		||||
allow access to it.
 | 
			
		||||
 | 
			
		||||
To customise a VM or to make it usable, we need to tell it who has
 | 
			
		||||
access to it and potentially inject even more information.
 | 
			
		||||
 | 
			
		||||
## Metadata service: how others do it
 | 
			
		||||
 | 
			
		||||
Enters the metadata service. OpenNebula solves this problem quite
 | 
			
		||||
nicely by attaching a virtual cdrom to the VMs. That cdrom contains
 | 
			
		||||
only one file, `context.sh`. This file contains information about
 | 
			
		||||
 | 
			
		||||
* networking
 | 
			
		||||
* ssh keys
 | 
			
		||||
 | 
			
		||||
OpenStack with cloud-init on the other side uses an HTTP based
 | 
			
		||||
service that is found on the address `http://169.254.169.254/`.
 | 
			
		||||
 | 
			
		||||
Both schemes come with disadvantages that we don't want to replicate
 | 
			
		||||
in uncloud:
 | 
			
		||||
 | 
			
		||||
In the opennebula case changing metadata information while the VM is
 | 
			
		||||
running requires to create a new CDROM and if that one is still
 | 
			
		||||
mounted, the VM might not get the up-to-date information. This is a
 | 
			
		||||
bit of a theorethical case, as the metadata is rarely re-used after
 | 
			
		||||
booting.
 | 
			
		||||
 | 
			
		||||
However changing the information provided in the context.sh inside the
 | 
			
		||||
ISO always requires to generate a new ISO. While technical possible,
 | 
			
		||||
not very elegant.
 | 
			
		||||
 | 
			
		||||
The OpenStack based approach has (from our point of view) a much
 | 
			
		||||
bigger problem: it relies on IPv4. VMs running on uncloud primarily
 | 
			
		||||
run IPv6 and should function without any IPv4 stack.
 | 
			
		||||
 | 
			
		||||
The motivation for using the 169.254.0.0/16 network is clear: it works
 | 
			
		||||
without having an IP address management system in place.
 | 
			
		||||
 | 
			
		||||
## Solving it the smart way
 | 
			
		||||
 | 
			
		||||
So it seems like the general approach of OpenStack/cloud-init is
 | 
			
		||||
actually quite elegant, if it wasn't forcing IPv4.
 | 
			
		||||
 | 
			
		||||
In the IPv6 world, we always have link local addresses in the
 | 
			
		||||
**fe80::/10** network. Should we just replace the OpenStack approach
 | 
			
		||||
with IPv6?
 | 
			
		||||
 | 
			
		||||
We don't think so, it has the same argument in favor for IPv4 networks
 | 
			
		||||
that we have in favor for IPv6 networks.
 | 
			
		||||
 | 
			
		||||
Instead, we suggest to add a simple change to the OpenStack approach:
 | 
			
		||||
Use http://metadata instead of using an IP address.
 | 
			
		||||
 | 
			
		||||
## http://metadata
 | 
			
		||||
 | 
			
		||||
So how should this work and why is this better than using
 | 
			
		||||
http://169.254.169.254/?
 | 
			
		||||
 | 
			
		||||
Using a name, it doesn't matter whether the VM is on an IPv4 ore
 | 
			
		||||
IPv6 network.
 | 
			
		||||
 | 
			
		||||
Using just the hostname, not an FQDN (i.e. metadata.example.com) makes
 | 
			
		||||
it portable.
 | 
			
		||||
 | 
			
		||||
The name can be resolved via various methods:
 | 
			
		||||
 | 
			
		||||
* uncloud: it will be delivered by DNS
 | 
			
		||||
* openstack: either via DNS (like uncloud) or if there is no IPAM, it
 | 
			
		||||
  can be statically set in /etc/hosts
 | 
			
		||||
 | 
			
		||||
In the DNS resolving case, this actually gets even more interesting,
 | 
			
		||||
because we can use the **DNS search path**. So while the client tries
 | 
			
		||||
to resolve the hostname **metadata**, the underlying resolver library
 | 
			
		||||
will also look for **metadata.example.com**, if example.com is in the
 | 
			
		||||
search path.
 | 
			
		||||
 | 
			
		||||
## uncloud implementation
 | 
			
		||||
 | 
			
		||||
In uncloud we have implemented a sample [metadata
 | 
			
		||||
service](https://code.ungleich.ch/uncloud/uncloud/tree/master/uncloud/metadata).
 | 
			
		||||
 | 
			
		||||
However IPAM (i.e. router advertisements) and DNS servers are not part
 | 
			
		||||
of uncloud and can be used from the regular system infrastructure.
 | 
			
		||||
 | 
			
		||||
In one of the next versions we plan to include helpers that allow you
 | 
			
		||||
to bootstrap IPAM and DNS easily.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Status
 | 
			
		||||
 | 
			
		||||
At this point uncloud can create VMs and the VMs can get the ssh keys
 | 
			
		||||
that should have access from the metadata service.
 | 
			
		||||
 | 
			
		||||
With this latest add-on uncloud gets near the range of a usable
 | 
			
		||||
prototype. A lot of things will probably need to be refactored in the
 | 
			
		||||
future, but at the moment uncloud supports already:
 | 
			
		||||
 | 
			
		||||
* creating VMs (using qemu)
 | 
			
		||||
* securing the VM network (using nftables)
 | 
			
		||||
* generating unique mac addresses (uncloud python code)
 | 
			
		||||
* storing information in a distributed database (using pytho-etcd3 and
 | 
			
		||||
  etcd)
 | 
			
		||||
* providing basic metadata inforamtion (uncloud python code)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
- step 4 = database!
 | 
			
		||||
x step 4 = database!
 | 
			
		||||
- image contextualisation
 | 
			
		||||
- dnsmasq
 | 
			
		||||
- metadata
 | 
			
		||||
  - for getting keys
 | 
			
		||||
- user metadata
 | 
			
		||||
- user authentication
 | 
			
		||||
  - otp or ldap or plain file
 | 
			
		||||
  - for registering keys
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue