Committing to backup work so far.
This commit is contained in:
parent
a799148f63
commit
5e8cb0a2aa
337
demo.md
337
demo.md
|
@ -1,92 +1,131 @@
|
||||||
# Mini-omschrijving voice platform
|
# Mini-omschrijving XS4ALL voice platform
|
||||||
|
|
||||||
* 3 hardware LXD hosts, met tig geheugen en tig CPU
|
* een aantal hardware LXD hosts, met tig geheugen en tig CPU
|
||||||
* verspreid over 3 lokaties
|
* verspreid over meerdere lokaties
|
||||||
* alle applicaties draaien in LXD containers op deze hosts
|
* alle applicaties draaien in LXD containers op deze hosts
|
||||||
* naasts deze hosts nog een paar SBC clusters, die zorgen
|
* naasts deze hosts zijn er nog een paar SBC clusters, die zorgen
|
||||||
voor goede en veilige interconnectie met externe partijen
|
voor goede en veilige interconnectie met externe partijen
|
||||||
(onze uplink naar het KPN netwerk en alle connecties met
|
(onze uplink naar het KPN netwerk en alle connecties met
|
||||||
de klantapparatuur / softphones)
|
de klantapparatuur / softphones)
|
||||||
|
|
||||||
|
Configuration management is een hybride setup:
|
||||||
|
|
||||||
* puppet beheert een stuk van de LXD host configuratie
|
* puppet beheert een stuk van de LXD host configuratie
|
||||||
* Ansible beheert andere stukken van de LXD host configuratie,
|
* Ansible beheert andere stukken van de LXD host configuratie,
|
||||||
plus alle LXD containers in volledigheid (dus geen 2 kapiteins
|
plus alle LXD containers in volledigheid (dus geen 2 kapiteins
|
||||||
op 1 schip, maar een strakke verdeling in taken)
|
op 1 schip, maar een strakke verdeling in taken)
|
||||||
|
|
||||||
Het op te lossen vraagstuk voor Ansible was vooral: hoe beheren
|
De op te lossen vraagstukken voor Ansible waren vooral:
|
||||||
we de LXD containers die op de 3 hardware nodes staan eenvoudig
|
|
||||||
vanuit 1 Ansible omgeving?
|
|
||||||
|
|
||||||
Taken van Ansible:
|
* Hoe kunnen we geautomatiseerd LXD containers optrekken?
|
||||||
|
* Hoe beheren we het OS op al die LXD containers vanuit 1 Ansible omgeving?
|
||||||
|
* Hoe kunnen we development en acceptatie handig inrichten?
|
||||||
|
|
||||||
|
Verschillende soorten inzet van Ansible:
|
||||||
|
|
||||||
* Nieuwe LXD containers optrekken indien nodig (one-shot runs)
|
* Nieuwe LXD containers optrekken indien nodig (one-shot runs)
|
||||||
* Alle LXD containers en LXD hosts configureren (one-shot runs)
|
* Configuratiemanagement LXD containers en LXD hosts (one-shot runs)
|
||||||
* Onderhoudstaken op regelmatige basis (periodieke runs in cron)
|
* Onderhoudstaken op regelmatige basis (periodieke runs in cron)
|
||||||
|
|
||||||
|
# Waarom LXD?
|
||||||
|
* Het platform bestaat uit heel veel verschillende applicaties
|
||||||
|
* Allemaal in het verleden gebouwd als Ubuntu hosts (hardware en VM's)
|
||||||
|
* Te veel niet gebruikte resources, containerization was een logische keuze
|
||||||
|
* Veel van de applicaties hebben ook een veelheid aan scheduled jobs en support scripts
|
||||||
|
* Statisch netwerk, omdat SBC's geen dynamische config kennen
|
||||||
|
* Daardoor ook geen hippe autoscaling behoefte
|
||||||
|
* Migratie naar LXD binnen XS4ALL was strak tijdgebonden (gekoppeld aan einde Edutel)
|
||||||
|
|
||||||
Installatie VM's voor de demo
|
Doordat de beschikbare tijd gelimiteerd was en LXD de mogelijkheid bood om de
|
||||||
=============================
|
bestaande omgeving vrijwel 1-op-1 na te bouwen op basis van LXD systeemcontainers,
|
||||||
|
was de keuze voor virtualisatie snel gemaakt.
|
||||||
|
|
||||||
- 2 VM's: sidn-demo-01, sidn-demo-02
|
Het platform omzetten naar bijvoorbeeld Docker was ongetwijfeld mogelijk geweest,
|
||||||
- virtual machine met NAT netwerk: 192.168.56.0/24, gateway/DNS 192.168.56.1
|
maar dat zou heel veel extra werk hebben opgeleverd en voor extra complexiteit
|
||||||
- Ubuntu 18.04 LTS
|
op de netwerklaag hebben gezorgd.
|
||||||
|
|
||||||
Na installatie:
|
Jammer? Nee! Met LXD en Ansible hebben we een mooi evenwicht bereikt tussen de
|
||||||
|
bekende cattle en pets analogie. Het voice platform heeft diverse pets in zich,
|
||||||
|
maar die kunnen zonder blikken of blozen naar de slachtbank.
|
||||||
|
|
||||||
sidn-demo-0X# apt update && apt upgrade -y
|
# Inhoud van de demo
|
||||||
|
* Twee VM's in KVM, die dienst doen als LXD host
|
||||||
|
* Netwerktopologie
|
||||||
|
* LXD clustering
|
||||||
|
* Inrichten van een Ansible container
|
||||||
|
*
|
||||||
|
|
||||||
|
# Installatie VM's voor de demo
|
||||||
|
* 2 VM's: sidn-demo-01, sidn-demo-02
|
||||||
|
* virtual machine met NAT netwerk: 192.168.56.0/24, gateway/DNS 192.168.56.1
|
||||||
|
* Ubuntu 18.04 LTS
|
||||||
|
|
||||||
LXD snap versie installeren
|
#### Upgrade na installatie
|
||||||
===========================
|
|
||||||
|
|
||||||
Standaard gebruikt 18.04 een apt-package voor LXD.
|
```text
|
||||||
Deze is prima bruikbaar, maar voor een meer up-to-date feature set
|
sidn-demo-0X# apt update && apt upgrade -y
|
||||||
is het beter om de snap installatie te gebruiken. Snap is op dit moment
|
```
|
||||||
de aanbevolen method voor het draaien van LXD.
|
|
||||||
|
|
||||||
sidn-demo-0X# snap refresh
|
#### LXD snap-versie installeren ipv apt-versie
|
||||||
sidn-demo-0X# snap install lxd
|
|
||||||
sidn-demo-0X# lxd.migrate ("no" voor automatisch verwijderen LXD)
|
|
||||||
sidn-demo-0X# apt remove --purge lxd lxd-client (want zo zie ik wel hoe ver deze is)
|
|
||||||
|
|
||||||
|
Standaard gebruikt 18.04 een apt-package voor LXD. Deze is prima bruikbaar,
|
||||||
|
maar voor een meer up-to-date feature set is het beter om de snap
|
||||||
|
installatie te gebruiken. Snap is op dit moment de aanbevolen method
|
||||||
|
voor het draaien van LXD.
|
||||||
|
|
||||||
LXD initialiseren
|
```
|
||||||
=================
|
sidn-demo-0X# snap refresh
|
||||||
|
sidn-demo-0X# snap install lxd
|
||||||
|
sidn-demo-0X# lxd.migrate ("no" voor automatisch verwijderen LXD)
|
||||||
|
sidn-demo-0X# apt remove --purge lxd lxd-client (want zo zie ik wel hoe ver deze is)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### LXD initialiseren
|
||||||
|
|
||||||
Voor deze demo:
|
Voor deze demo:
|
||||||
|
|
||||||
sidn-demo-0X# lxd init
|
```text
|
||||||
|
sidn-demo-0X# lxd init
|
||||||
> clustering: no
|
> clustering: no
|
||||||
> storage pool: yes, default, dir
|
> storage pool: yes, default, dir
|
||||||
> connect to MAAS: no
|
> connect to MAAS: no
|
||||||
> network bridge: no
|
> network bridge: no
|
||||||
> available over the network: yes, all interfaces, port 8443, password
|
> available over the network: yes, all interfaces, port 8443, password
|
||||||
|
```
|
||||||
|
|
||||||
Op productie doen we het (uiteraard) anders:
|
Op productie doen we het (uiteraard) anders:
|
||||||
|
|
||||||
- ZFS als filesystem
|
* ZFS als filesystem
|
||||||
- "Available over network" alleen op een private space mgmt VLAN
|
* "Available over network" alleen op het management VLAN
|
||||||
|
|
||||||
|
|
||||||
Netwerk volledig op basis van LXD host bridges
|
# Netwerktoplogie
|
||||||
==============================================
|
Belangrijke keuze qua netwerk: elk netwerk interface in de LXD host
|
||||||
|
is ondergebracht in een bridge interface.
|
||||||
|
|
||||||
Belangrijkste keuze qua netwerk: elk netwerk interface in de LXD host
|
* Elke container kan simpel op elk benodigd netwerk "ingeplugd" worden
|
||||||
is ondergebracht in een bridge interface. Voordeel is dat elke LXD
|
door een interface van de container aan de bridge toe te voegen.
|
||||||
container daarmee "ingeplugd" kan worden op alle ontsloten netwerken.
|
* Elke container is daarmee ook direct exposed op dat netwerk.
|
||||||
Twee LXD containers op twee verschillende hosts die in eenzelfde
|
* Containers kunnen ook containers op een andere LXD host bereiken,
|
||||||
bridge netwerk zitten, kunnen simpel op layer 2 bij elkaar.
|
mits het layer 2 netwerk doorgetrokken is uiteraard.
|
||||||
|
* Containers kunnen eenvoudig naar een andere LXD host worden verplaatst,
|
||||||
|
mits de nieuwe host dezelfde netwerkbridges heeft geconfigureerd.
|
||||||
|
|
||||||
** Dit lijkt dus op hoe je het met hardware switches zou regelen**
|
__Praktisch gezien lijkt dit op hoe je het netwerk met hardware hosts en
|
||||||
|
switches zou regelen__
|
||||||
|
|
||||||
Daarom wordt tijdens lxd init niet automatisch een bridge aangemaakt.
|
#### Netwerk bridges op de LXD hosts
|
||||||
Je kunt natuurlijk de standaard lxdbr0 bridge maken en gebruiken,
|
|
||||||
maar dat netwerk is alleen voor intern gebruik binnen de host.
|
|
||||||
In een multi-host setup zou je netwerk-trucs moeten uithalen om
|
|
||||||
te zorgen dat hosts bij elkaar kunnen komen.
|
|
||||||
|
|
||||||
|
Tijdens lxd init maken we niet de standaard lxdbr0 bridge aan.
|
||||||
|
Die bridge is alleen voor intern gebruik binnen de host. Wanneer
|
||||||
|
je services beschikbaar wilt stellen aan andere systemen, dan moeten
|
||||||
|
daar trucs voor uitgehaald worden (vgl. met Docker/Traefik).
|
||||||
|
|
||||||
|
In plaats daarvan worden de bridges door onszelf geconfigureerd in Netplan.
|
||||||
Netplan-config op productie ziet er ongeveer zo uit:
|
Netplan-config op productie ziet er ongeveer zo uit:
|
||||||
|
|
||||||
network:
|
```yaml
|
||||||
|
network:
|
||||||
version: 2
|
version: 2
|
||||||
ethernets:
|
ethernets:
|
||||||
eno1: {} # management network (untagged)
|
eno1: {} # management network (untagged)
|
||||||
|
@ -125,6 +164,7 @@ Netplan-config op productie ziet er ongeveer zo uit:
|
||||||
dhcp6: no
|
dhcp6: no
|
||||||
interfaces: ["vlan.9"]
|
interfaces: ["vlan.9"]
|
||||||
addresses: ["10.116.1.132/24"]
|
addresses: ["10.116.1.132/24"]
|
||||||
|
```
|
||||||
|
|
||||||
Met een dergelijke setup is het heel eenvoudig om de LXD containers
|
Met een dergelijke setup is het heel eenvoudig om de LXD containers
|
||||||
beschikbaar te maken binnen bepaalde netwerksegmenten. De containers kunnen
|
beschikbaar te maken binnen bepaalde netwerksegmenten. De containers kunnen
|
||||||
|
@ -132,6 +172,7 @@ een of meer netwerk interfaces krijgen, die verbonden kunnen worden met de
|
||||||
benodigde netwerken. Dat zien er dan bijvoorbeeld zo uit (afwijkende
|
benodigde netwerken. Dat zien er dan bijvoorbeeld zo uit (afwijkende
|
||||||
bridge-namen ivm de ruimte):
|
bridge-namen ivm de ruimte):
|
||||||
|
|
||||||
|
```text
|
||||||
GATEWAY
|
GATEWAY
|
||||||
|
|
|
|
||||||
|
|
|
|
||||||
|
@ -154,12 +195,18 @@ bridge-namen ivm de ruimte):
|
||||||
| CONTAINER2 | | | | CONTAINER5 |
|
| CONTAINER2 | | | | CONTAINER5 |
|
||||||
| | | | | |
|
| | | | | |
|
||||||
+----------------------+ +----------------------+ +----------------------+
|
+----------------------+ +----------------------+ +----------------------+
|
||||||
LXD Host 1 LXD Host 2 LXD Host 3
|
LXD Host 1 LXD Host 2 LXD Host ... n
|
||||||
|
```
|
||||||
|
|
||||||
|
Hier is bijvoorbeeld CONTAINER1 aangesloten op het public en het SIP netwerk, terwijl
|
||||||
|
CONTAINER2 aangesloten is op SIP en mgmt. CONTAINER4 is alleen aangesloten op het
|
||||||
|
SIP netwerk, en kan via dat netwerk op layer 2 CONTAINER1 en CONTAINER2 ook bereiken.
|
||||||
|
|
||||||
|
|
||||||
Voor de demo gebruiken we een simpeler opzet:
|
__Voor de demo gebruiken we een simpeler opzet:__
|
||||||
|
|
||||||
network:
|
```yaml
|
||||||
|
network:
|
||||||
version: 2
|
version: 2
|
||||||
ethernets:
|
ethernets:
|
||||||
enp1s0: {}
|
enp1s0: {}
|
||||||
|
@ -172,10 +219,12 @@ Voor de demo gebruiken we een simpeler opzet:
|
||||||
gateway4: "192.168.56.1"
|
gateway4: "192.168.56.1"
|
||||||
nameservers:
|
nameservers:
|
||||||
addresses: ["192.168.56.1"]
|
addresses: ["192.168.56.1"]
|
||||||
|
```
|
||||||
|
|
||||||
Dus maar 1 bridge en het "fysieke" interface enp1s0 van de VM zit
|
Dus maar 1 bridge "br-demo" en het "fysieke" interface enp1s0 van de VM zit
|
||||||
"ingeplugd" in deze bridge. In een plaatje:
|
"ingeplugd" in deze bridge. In een plaatje:
|
||||||
|
|
||||||
|
```text
|
||||||
KVM host
|
KVM host
|
||||||
192.168.56.1 (gateway + DHCP + DNS)
|
192.168.56.1 (gateway + DHCP + DNS)
|
||||||
|
|
|
|
||||||
|
@ -196,50 +245,60 @@ Dus maar 1 bridge en het "fysieke" interface enp1s0 van de VM zit
|
||||||
| | | |
|
| | | |
|
||||||
+----------------------+ +----------------------+
|
+----------------------+ +----------------------+
|
||||||
KVM guest: sidn-demo-01 KVM guest: sidn-demo-02
|
KVM guest: sidn-demo-01 KVM guest: sidn-demo-02
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Netwerkinterfaces op LXD containers
|
#### Netwerk interfaces op de LXD containers
|
||||||
===================================
|
|
||||||
|
|
||||||
Met bovenstaande setup is het dus mogelijk om een LXD container netwerk
|
Met bovenstaande setup is het dus mogelijk om een LXD container netwerk
|
||||||
interfaces te geven die "ingeplugd" worden in een of meer van de br-* bridge
|
interfaces te geven die "ingeplugd" worden in een of meer van de br-\* bridges.
|
||||||
interfaces. Een SIPproxy server bijvoorbeeld, krijgt drie netwerk interfaces
|
Een SIPproxy server bijvoorbeeld, krijgt drie netwerk interfaces in drie
|
||||||
in drie verschillende bridges:
|
verschillende bridges:
|
||||||
|
|
||||||
- br-mgmt: voor host management, o.a. Ansible aansturing
|
* br-mgmt: voor host management, o.a. Ansible aansturing
|
||||||
- br-public: op een SIPproxy voor SSH toegang en OS updates
|
* br-public: op een SIPproxy voor SSH toegang en OS updates
|
||||||
- br-sipcore: voor SIP signalling verkeer richting SBC's
|
* br-sipcore: voor SIP signalling verkeer richting SBC's
|
||||||
|
|
||||||
Om op een container eenvoudig het doel voor de verschillende interfaces te
|
Om binnen een container het herkennen van de netwerk interfaces zo simpel
|
||||||
herkennen, wordt in de naamgeving de bridge-naamgeving gevolgd. Een interface
|
mogelijk te houden, wordt de naamgeving van de bridges gevolg. Bijvoorbeeld
|
||||||
dat in "br-public" wordt geplugd heet bijvoorbeeld "if-public". Veel handiger
|
een interface dat in bridge "br-aap" wordt geplugd, heet dan "if-aap".
|
||||||
dan "eth0" o.i.d.
|
Veel handiger dan "eth0" o.i.d.
|
||||||
|
|
||||||
|
Op de SIPproxy zul je dan ook de interfaces if-mgmt, if-public en if-sipcore
|
||||||
|
terug kunnen vinden.
|
||||||
|
|
||||||
|
__Interfaces vanuit LXD profielen__
|
||||||
|
|
||||||
Om bij het optrekken van een LXD container de benodigde netwerk interfaces
|
Om bij het optrekken van een LXD container de benodigde netwerk interfaces
|
||||||
aan te maken, wordt gebruik gemaakt van profielen. Er zijn verschillende
|
aan te maken, wordt gebruik gemaakt van profielen. Er zijn verschillende
|
||||||
profielen gemaakt voor verschillende netwerkbehoeftes:
|
profielen gemaakt voor verschillende netwerkbehoeftes:
|
||||||
|
|
||||||
# lxc profile list
|
```text
|
||||||
+---------------+---------+
|
# lxc profile list
|
||||||
| NAME | USED BY |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| NAME | USED BY |
|
||||||
| ansible-acc | 1 |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| ansible-acc | 1 |
|
||||||
| default | 11 |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| default | 11 |
|
||||||
| sipproxy | 2 |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| sipproxy | 2 |
|
||||||
| voicemail | 2 |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| voicemail | 2 |
|
||||||
| voiceservices | 2 |
|
+---------------+---------+
|
||||||
+---------------+---------+
|
| voiceservices | 2 |
|
||||||
|
+---------------+---------+
|
||||||
|
```
|
||||||
|
|
||||||
Hier het stuk van het profiel wat voor het bovenstaande SIPproxy netwerk wordt gebruikt.
|
Hier het stuk van het profiel wat voor het netwerk van de hierboven beschreven
|
||||||
|
SIPproxy container wordt gebruikt:
|
||||||
|
|
||||||
productie# lxc profile show sipproxy
|
```text
|
||||||
config:
|
productie# lxc profile show sipproxy
|
||||||
---8<-------
|
|
||||||
devices:
|
config:
|
||||||
|
---8<-------
|
||||||
|
devices:
|
||||||
if-mgmt:
|
if-mgmt:
|
||||||
name: if-mgmt
|
name: if-mgmt
|
||||||
nictype: bridged
|
nictype: bridged
|
||||||
|
@ -255,40 +314,43 @@ Hier het stuk van het profiel wat voor het bovenstaande SIPproxy netwerk wordt g
|
||||||
nictype: bridged
|
nictype: bridged
|
||||||
parent: br-sipcore
|
parent: br-sipcore
|
||||||
type: nic
|
type: nic
|
||||||
---8<-------
|
---8<-------
|
||||||
|
```
|
||||||
|
|
||||||
Noot:
|
Noot:
|
||||||
Voor het voice platform is dit een handige setup. Uiteraard kan elke mogelijk
|
Voor het voice platform is dit een handige setup. Uiteraard kan elke mogelijk
|
||||||
setup worden gemaakt op basis van de behoefte. Als de behoefte alleen maar
|
setup worden gemaakt op basis van de behoefte. Als de behoefte alleen maar
|
||||||
een lokaal werkende bridge met private IP space was, dan zou ik het geheel nog
|
een lokaal werkende bridge met private IP space was, dan zou ik het geheel nog
|
||||||
steeds wel handmatig inrichten zoals hierboven, alleen dan met een loopback
|
steeds wel handmatig inrichten zoals hierboven, alleen dan met een loopback
|
||||||
bridge met een naam als "br-local".
|
bridge met een duidelijk naam als "br-local" of "br-private".
|
||||||
|
|
||||||
|
|
||||||
Voorbeeldprofiel voor de demo
|
#### Aanmaken LXD profile voor de demo
|
||||||
=============================
|
|
||||||
|
|
||||||
Op basis van de gevolgde lxd init methode, is er een default profiel aangemaakt
|
Op basis van de gevolgde lxd init methode, is er al een default profiel aangemaakt
|
||||||
voor LXD. Deze is heel erg basaal, omdat we geen netwerk hebben geconfigureerd:
|
voor LXD. Deze is heel erg basaal, omdat we geen netwerk bridge hebben geconfigureerd:
|
||||||
|
|
||||||
sidn-demo-0X# lxc profile show default
|
```text
|
||||||
config: {}
|
sidn-demo-0X# lxc profile show default
|
||||||
description: Default LXD profile
|
|
||||||
devices:
|
config: {}
|
||||||
|
description: Default LXD profile
|
||||||
|
devices:
|
||||||
root:
|
root:
|
||||||
path: /
|
path: /
|
||||||
pool: default
|
pool: default
|
||||||
type: disk
|
type: disk
|
||||||
|
|
||||||
name: default
|
name: default
|
||||||
used_by: []
|
used_by: []
|
||||||
|
```
|
||||||
|
|
||||||
Het beheer van profielen regelen we primair vanuit Ansible, maar op dit punt
|
Het beheer van profielen regelen we primair vanuit Ansible, maar op dit punt
|
||||||
van de demo maak ik met de hand een profiel aan.
|
van de demo maak ik met de hand een profiel aan.
|
||||||
|
|
||||||
sidn-demo-0X# lxc profile create demo
|
```text
|
||||||
sidn-demo-0X# lxc profile edit demo
|
sidn-demo-0X# lxc profile create demo
|
||||||
|
sidn-demo-0X# lxc profile edit demo
|
||||||
|
|
||||||
config:
|
config:
|
||||||
user.user-data: |
|
user.user-data: |
|
||||||
|
@ -309,7 +371,8 @@ van de demo maak ik met de hand een profiel aan.
|
||||||
pool: default
|
pool: default
|
||||||
type: disk
|
type: disk
|
||||||
|
|
||||||
sidn-demo-0X# lxc profile show demo
|
sidn-demo-0X# lxc profile show demo
|
||||||
|
```
|
||||||
|
|
||||||
In deze config zijn wat cloud-init statements toegevoegd om te laten zien dat
|
In deze config zijn wat cloud-init statements toegevoegd om te laten zien dat
|
||||||
cloud-init te gebruiken is in een profiel. De installatie van Python is handig,
|
cloud-init te gebruiken is in een profiel. De installatie van Python is handig,
|
||||||
|
@ -324,56 +387,78 @@ gepusht met de cloud-init configuratie. En zelfs de netwerkconfguratie slechts
|
||||||
deels, omdat deze met de cloud-init van Ubuntu 14.04 nog niet mogelijk was.
|
deels, omdat deze met de cloud-init van Ubuntu 14.04 nog niet mogelijk was.
|
||||||
|
|
||||||
|
|
||||||
Geen LXD clustering
|
# LXD clustering
|
||||||
===================
|
Of beter gezegd: __geen__ LXD clustering.
|
||||||
|
|
||||||
Het klinkt heel goed: LXD clustering. Functioneel heb ik er echter nog
|
|
||||||
weinig nuttigs in gevonden voor onze setup. Bovendien heb ik op clustersystemen
|
|
||||||
regelmatig problemen gezien met het goed werkend houden van het cluster,
|
|
||||||
door het uit sync raken van de quorum database bijvoorbeeld.
|
|
||||||
|
|
||||||
Een cluster zorgt er voornamelijk voor dat je een aantal LXD hosts aan elkaar
|
Een cluster zorgt er voornamelijk voor dat je een aantal LXD hosts aan elkaar
|
||||||
koppelt, die onderling gaan uitwisselen welke containers er op de hosts draaien.
|
koppelt, die onderling gaan uitwisselen welke containers er op de hosts draaien.
|
||||||
Daarna krijg je met bijvoorbeeld "lxc list" geen inzicht in de containers die
|
Daarna krijg je met bijvoorbeeld "lxc list" niet alleen inzicht in de containers
|
||||||
op de lokale host draaien, maar inzicht in alle containers die op alle hosts
|
die op de lokale host draaien, maar ook in alle containers die op alle cluster
|
||||||
draaien.
|
hosts draaien.
|
||||||
|
|
||||||
|
Het klinkt heel goed: LXD clustering. Functioneel heb ik er echter nog
|
||||||
|
weinig heil in gevonden voor onze setup. Bovendien heb ik op clustersystemen
|
||||||
|
regelmatig problemen gezien met het goed werkend houden van het cluster,
|
||||||
|
door bijvoorbeeld het uit sync raken van de quorum database (gebaseerd op dqlite,
|
||||||
|
wat een distributed sqlite database is.)
|
||||||
|
|
||||||
|
Voordat clustering bestond in LXD liepen wel al wel tegen een probleem aan
|
||||||
|
dat clustering probeert op te lossen: het werken met containers, verspreid
|
||||||
|
over meerdere LXD hosts.
|
||||||
|
|
||||||
Voordat clustering bestond in LXD liepen wel al wel tegen het probleem aan
|
|
||||||
wat clustering probeert op te lossen: containers verspreid over meerdere hosts.
|
|
||||||
Onze aanpak:
|
Onze aanpak:
|
||||||
|
|
||||||
- De LXD daemon kan luisteren op het netwerk (zoals hierboven aangezet)
|
* De LXD daemon laten luisteren op het netwerk (zoals bij lxd init al aangezet)
|
||||||
- Je kunt vanuit de ene LXD host een andere LXD host als "remote" toevoegen
|
* Je kunt vanuit de ene LXD host een andere LXD host als "remote" toevoegen
|
||||||
onder een bepaalde naam.
|
onder een bepaalde naam.
|
||||||
- Vanaf dan kunnen lxc commando's de naam van de remote gebruiken om
|
* Vanaf dan kunnen lxc commando's de naam van de remote gebruiken om
|
||||||
operaties op de andere host te doen.
|
operaties op de andere host te doen.
|
||||||
- We hebben alle LXD hosts op deze manier kruislings gekoppeld, zodat vanuit
|
* We hebben alle LXD hosts op deze manier kruislings gekoppeld, zodat vanuit
|
||||||
elke host elke andere host aangesproken kan worden.
|
elke host elke andere host aangesproken kan worden.
|
||||||
|
|
||||||
Zorg eerst dat alle LXD hosts remote access actief hebben, mocht dat nog
|
Om dit op te zetten, zorg dan eerst dat alle LXD hosts remote access actief hebben,
|
||||||
niet geconfigureerd zijn vanuit lxd init. Doe het volgende op elke host:
|
mocht dat nog niet geconfigureerd zijn vanuit lxd init. Doe het volgende op elke host:
|
||||||
|
|
||||||
sidn-demo-0X# lxc config set core.https_address [::]:8443
|
```
|
||||||
sidn-demo-0X# lxc config set core.trust_password SuperGeheimGoedWachtwoordHorseStaple
|
sidn-demo-0X# lxc config set core.https_address [::]:8443
|
||||||
|
sidn-demo-0X# lxc config set core.trust_password SuperGeheimGoedWachtwoordHorseStaple
|
||||||
|
```
|
||||||
|
|
||||||
Nu kunnen de remotes op elke LXD host worden aangemaakt.
|
Nu kunnen de remotes op elke LXD host worden aangemaakt.
|
||||||
Merk op dat we ook voor de lokale LXD daemon een remote aanmaken.
|
Merk op dat we ook voor de lokale LXD daemon een remote aanmaken.
|
||||||
Dat maakt een aantal zaken vanuit Ansible een stuk simpeler.
|
Dat maakt een aantal zaken vanuit Ansible een stuk simpeler, omdat we dan
|
||||||
|
vanaf elke willekeurige host bijv `lxc list sidn-demo-01:` kunnen doen en niet
|
||||||
|
op die bestreffende host `lxc list local:` hoeven te gebruiken
|
||||||
Als wachtwoord gebruiken we uiteraard het bovenstaande wachtwoord.
|
Als wachtwoord gebruiken we uiteraard het bovenstaande wachtwoord.
|
||||||
|
|
||||||
sidn-demo-0X# lxc remote add --accept-certificate sidn-demo-01 192.168.56.150
|
```
|
||||||
sidn-demo-0X# lxc remote add --accept-certificate sidn-demo-02 192.168.56.151
|
sidn-demo-0X# lxc remote add --accept-certificate sidn-demo-01 192.168.56.150
|
||||||
|
sidn-demo-0X# lxc remote add --accept-certificate sidn-demo-02 192.168.56.151
|
||||||
|
```
|
||||||
|
|
||||||
Vanaf nu kun je vanaf elk van de twee LXD hosts commando's uitvoeren
|
Vanaf nu kun je vanaf elk van de twee LXD hosts commando's uitvoeren op alle
|
||||||
op alle LXD hosts, bijv:
|
LXD hosts, bijv:
|
||||||
|
|
||||||
sidn-demo-0X# lxc list -cns sidn-demo-01:
|
```
|
||||||
sidn-demo-0X# lxc list -cns sidn-demo-02:
|
sidn-demo-0X# lxc list -cns sidn-demo-01:
|
||||||
sidn-demo-0X# lxc launch ubuntu:18.04 sidn-demo-02:test
|
sidn-demo-0X# lxc list -cns sidn-demo-02:
|
||||||
|
sidn-demo-0X# lxc launch ubuntu:18.04 sidn-demo-02:test
|
||||||
|
```
|
||||||
|
|
||||||
|
__Ja, maar, hoe wordt dit gebruikt dan?__
|
||||||
|
|
||||||
|
Het belangrijkste gebruik hiervan, is dat er vanuit cron op elke LXD host een job draait
|
||||||
|
die een `lxc list` uitvoert op alle remotes. Daarmee wordt een lijst gemaakt waarin
|
||||||
|
de containers en hun LXD hosts staan. Vanuit die lijst wordt een bestand gemaakt, met
|
||||||
|
daarin een serie bash aliases voor `lxc exec <remote>:<containernaam> bash`.
|
||||||
|
|
||||||
|
Als ik wil inloggen op bijvoorbeeld de container `tel-prd-sipproxy-02`, dan kan ik na
|
||||||
|
het sourcen van het gegenereerde aliassen bestand simpelweg `tel-prd-sipproxy-02` als
|
||||||
|
commando uitvoeren op een willekeurige LXD host, waarna ik binnenval op een shell op
|
||||||
|
die container.
|
||||||
|
|
||||||
|
|
||||||
Een eerste container: Ansible management host
|
# De Ansible container
|
||||||
=============================================
|
|
||||||
|
|
||||||
De Ansible management host is een container op het voice platform zelf. Vanwege de
|
De Ansible management host is een container op het voice platform zelf. Vanwege de
|
||||||
kip/ei problematiek en het feit dat deze container niet steeds opnieuw gebouwd
|
kip/ei problematiek en het feit dat deze container niet steeds opnieuw gebouwd
|
||||||
|
|
Loading…
Reference in New Issue