Réseau et Sécurité avec Incus load balancer dns zone
5. Réseau et Sécurité avec Incus
- incus_network_load_balancer : Configuration de load balancers pour une haute disponibilité
- incus_network_zone et incus_network_zone_record : Gestion des zones et enregistrements DNS
Install ovn network
Les Load balancers sont actuellement disponibles que pour le réseau OVN.
sudo apt install ovn-host ovn-central
sudo ovs-vsctl set open_vswitch . \
external_ids:ovn-remote=unix:/run/ovn/ovnsb_db.sock \
external_ids:ovn-encap-type=geneve \
external_ids:ovn-encap-ip=127.0.0.1
# start all service ovn-*
# la plage de 192.168.10.2-192.168.10.20 est reservé pour les ip fixes des lb
sudo incus network set incusbr0 ipv4.dhcp.ranges=192.168.10.61-192.168.10.253 ipv4.ovn.ranges=192.168.10.21-192.168.10.60
sudo incus network create ovn-test --type=ovn network=incusbr0
incus_network_load_balancer : Load Balancer pour une Haute Disponibilité
La ressource incus_network_load_balancer permet de configurer un équilibrage de charge réseau afin de répartir le trafic entrant entre plusieurs instances ou services pour assurer une haute disponibilité. Ce mécanisme est essentiel dans les infrastructures à grande échelle, garantissant la continuité des services en cas de surcharge ou de panne d'un serveur.
Exemple d'utilisation :
- Créer un reseau ovn
- créer un profile avec le reseau ovn, limits resources et disk de 5 GB
- Créer 2 instances vm ubuntu 22
- Créer un LB avvec une ip de la plage fixe 192.168.10.2 qui ecoute sur le port 8080 et redirige le traffic sur le port 80 des vms

# Créer le réseau OVN
resource "incus_network" "network" {
name = "ovn-lb"
type = "ovn"
config = {
"ipv4.address" = "10.10.10.1/24"
"ipv4.nat" = "true"
"network" = "incusbr0"
"ipv6.address" = "none"
}
}
resource "incus_profile" "profile-lb" {
name = "profile-lb"
depends_on = [incus_network.network]
config = {
"boot.autostart" = true
"limits.cpu" = 1
"limits.memory" = "1GB"
}
device {
name = "eth0"
type = "nic"
properties = {
nictype = "ovn"
network = incus_network.network.name
}
}
device {
type = "disk"
name = "root"
properties = {
pool = "dev-lvm-incus"
path = "/"
size = "5GB"
}
}
}
# Liste des instances à créer
locals {
instance_count = 2 # Nombre d'instances à créer
}
# Créer les instances avec une boucle sans spécifier d'IP
resource "incus_instance" "vm" {
count = local.instance_count # Créer un nombre d'instances défini
name = "web-server-${count.index + 1}" # Noms d'instance : instance-1, instance-2, etc.
type = "virtual-machine"
image = "images:ubuntu/22.04"
ephemeral = false
profiles = ["${incus_profile.profile-lb.name}"]
}
# Créer le Load Balancer
resource "incus_network_lb" "load_balancer" {
network = incus_network.network.name
depends_on = [incus_instance.vm]
description = "Web Load Balancer"
listen_address = "192.168.10.160" # Adresse IP externe du Load Balancer
# Redirection du port 8080 vers les backends
port {
description = "Port 8080/tcp"
protocol = "tcp"
listen_port = "8080" # Le port écouté par le load balancer
target_backend = [for i in range(local.instance_count) : "instance-${i + 1}"] # Noms dynamiques des backends
}
# Ajouter chaque VM comme backend
dynamic "backend" {
for_each = range(local.instance_count)
content {
name = "instance-${backend.value + 1}" # Noms des backends : instance-1, instance-2, etc.
description = "Backend for instance-${backend.value + 1}"
target_address = incus_instance.vm[backend.key].ipv4_address
target_port = "80" # Port cible sur chaque VM
}
}
}
- Acceder à chaque instance depuis l'ui et installer nginx
apt install -y nginx
Aceder à l'ip du LB http://192.168.10.2:8080

Verifier en cli le lb
incus network load-balancer list ovn-lb
incus network load-balancer edit ovn-lb 192.168.10.2

Ressource incus_network_zone : Gestion d'une zone réseau Incus
La ressource incus_network_zone permet de gérer une zone DNS au sein du réseau d'Incus. Une zone DNS est une partie d'un domaine qui est administrée en tant qu'unité distincte. Elle peut contenir plusieurs sous-domaines et enregistrements DNS.
Exemple d'utilisation :
resource "incus_network_zone" "zone" {
name = "internal-registry.techledger.io" # Nom de la zone réseau
config = {
"dns.nameservers" = "ns.techledger.io" # Serveur DNS pour cette zone
"peers.ns.address" = "10.10.10.1" # Adresse IP de pairage des serveurs DNS. Ici notre reseau ovn-lb
}
}
Dans cet exemple, une zone DNS nommée internal-registry.techledger.io est créée avec les configurations suivantes :
- dns.nameservers : Le serveur DNS utilisé pour résoudre cette zone est ns.techledger.io
- peers.ns.address : L'adresse IP 127.0.0.1 est spécifiée pour le pairage des serveurs DNS.
Arguments :
- name (Requis) : Nom de la zone réseau.
- description (Optionnel) : Description de la zone réseau.
- config (Optionnel) : Carte de paires clé/valeur des paramètres de configuration de la zone réseau (comme les serveurs DNS et les adresses de pairage).
- project (Optionnel) : Nom du projet dans lequel la zone sera créée.
- remote (Optionnel) : Hôte distant sur lequel la ressource sera créée. Si non fourni, l'hôte distant par défaut du fournisseur sera utilisé.
Ressource incus_network_zone_record : Gestion des enregistrements DNS d'une zone
La ressource incus_network_zone_record permet de gérer les enregistrements DNS d'une zone réseau. Ces enregistrements spécifient comment le trafic doit être dirigé dans la zone DNS, tels que les enregistrements de type A (adresses IP) ou CNAME (alias de nom).
Exemple d'utilisation :
resource "incus_network_zone" "zone" {
name = "internal-registry.techledger.io" # Nom de la zone
config = {
"dns.nameservers" = "ns.techledger.io" # Serveur DNS pour cette zone
"peers.ns.address" = "10.10.10.1" # Adresse IP de pairage des serveurs DNS. Ici notre reseau ovn-lb
}
}
resource "incus_network_zone_record" "record" {
name = "ns" # Nom de l'enregistrement
zone = incus_network_zone.zone.name # Nom de la zone DNS associée
entry {
type = "CNAME" # Type d'enregistrement CNAME (alias)
value = "registry-prod-srv-01." # Alias pointant vers le nom d'hôte Incus
ttl = 3600 # Ajoutez un TTL explicite (en secondes)
}
entry {
type = "A" # Type d'enregistrement A (adresse IP)
value = "10.10.10.2" # Adresse IP de l'hôte Incus
ttl = 3600 # Ajoutez un TTL explicite (en secondes)
}
}
Dans cet exemple :
- Un enregistrement DNS ns est ajouté à la zone DNS créée précédemment (internal-registry.techledger.io).
- Deux entrées sont définies :
- Une entrée de type CNAME pour faire correspondre un alias avec le nom d'hôte registry-prod-srv-01.
- Une entrée de type A pour associer une adresse IP statique à l'hôte registry.
Arguments :
- name (Requis) : Nom de l'enregistrement DNS.
- zone (Requis) : Nom de la zone à laquelle cet enregistrement appartient.
- entry (Optionnel) : Un ou plusieurs enregistrements à ajouter à la zone. Chaque enregistrement doit inclure un type (CNAME, A, etc.) et une valeur.
- description (Optionnel) : Description de l'enregistrement DNS.
- config (Optionnel) : Paramètres supplémentaires sous forme de clé/valeur.
- project (Optionnel) : Nom du projet dans lequel l'enregistrement sera créé.
- remote (Optionnel) : Hôte distant sur lequel la ressource sera créée, si non fourni, le remote par défaut sera utilisé.
Commentaires
Aucun commentaire pour le moment.