Référence
Ressources
Le modèle d'objets déclaratif : les namespaces COSI et les ressources que vous appliquez pour façonner le dataplane.
SiHA se configure au moyen de ressources — des objets typés regroupés en
namespaces, un namespace par domaine de préoccupation. Vous les rédigez en YAML
et les appliquez avec sihactl config apply. Chaque ressource possède un id ;
pour les interfaces, les bindings d’ACL et les modes NAT, l’id correspond à
l’id réseau (ext, int, …).
Exécutez sihactl get rd sur un nœud pour lister tous les types de ressources
qu’il sert.
| Namespace | Ressources |
|---|---|
link | Interface, InterfaceRXMode |
acl | ACL, ACLBinding |
nat | NATPool, NATStaticMapping, NATIdentityMapping, NATInterfaceMode |
routing | VRF, Route |
bgp | BGPConfig, BGPPeer (+ BGPLearnedRoute en lecture seule) |
lb | NATLB |
dataplane | DataplaneConfig (singleton) |
Interfaces
Une Interface est n’importe quel port du dataplane. Elle possède huit
kinds — pmd (un port physique DPDK), host-interface, loopback, tap,
bond, vlan, qinq et vxlan — chacun avec ses propres attributs. Les
interfaces PMD sont adoptées (VPP les instancie au démarrage) ; les autres sont
créées à la demande.
# a physical port with an address
apiVersion: link.siha/v1
kind: Interface
metadata: { id: ext }
spec:
kind: pmd
addresses: ["203.0.113.1/24"]
---
# an 802.1Q sub-interface on that port
apiVersion: link.siha/v1
kind: Interface
metadata: { id: vlan10 }
spec:
kind: vlan
parent: ext
vlanId: 10
addresses: ["10.10.0.1/24"]
Une interface VXLAN L3VNI doit définir
peerAddr— sans cela VPP n’a aucun moyen de résoudre le pair du tunnel et la route connectée partirait en trou noir.
ACL
Une ACL est une liste ordonnée de règles avec une action par défaut ; un
ACLBinding l’attache à une interface dans une direction. accept_stateful
ouvre automatiquement le flux inverse.
apiVersion: acl.siha/v1
kind: ACL
metadata: { id: edge-in }
spec:
family: ipv4
defaultAction: drop
rules:
- { action: accept, protocol: icmp, destinationCidr: 10.0.1.0/24 }
- { action: accept, protocol: tcp, destinationCidr: 10.0.1.0/24,
destinationPortFirst: 80, destinationPortLast: 80 }
- { action: accept_stateful, protocol: tcp, sourceCidr: 10.0.2.10/32,
destinationPortFirst: 22, destinationPortLast: 22 }
---
apiVersion: acl.siha/v1
kind: ACLBinding
metadata: { id: edge-in }
spec: { acl: edge-in, interface: ext, direction: input }
NAT
NATPool déclare les adresses de translation ; NATInterfaceMode marque les
interfaces inside / outside ; les mappings statiques et d’identité épinglent
des translations spécifiques. Pour une sortie en masquerade, le pool est
l’adresse outside propre au nœud.
apiVersion: nat.siha/v1
kind: NATPool
metadata: { id: egress }
spec: { addresses: ["203.0.113.1"] }
---
apiVersion: nat.siha/v1
kind: NATInterfaceMode
metadata: { id: int }
spec: { mode: inside }
Routage & BGP
VRF crée une table FIB isolée ; Route ajoute une route statique. BGP
s’exécute par tenant à l’intérieur des VRF depuis un unique serveur embarqué :
un BGPConfig par VRF (id default = table 0), et des BGPPeer liés à un VRF
dont les meilleurs chemins appris sont programmés dans la FIB de ce VRF.
apiVersion: routing.siha/v1
kind: VRF
metadata: { id: tenant-a }
spec: { table: 100, family: dual, description: "tenant A" }
---
apiVersion: bgp.siha/v1
kind: BGPConfig
metadata: { id: default }
spec: { localAsn: 65011 }
---
apiVersion: bgp.siha/v1
kind: BGPPeer
metadata: { id: uplink }
spec:
peerAsn: 65000
peerAddress: 10.42.0.10
localAddress: 10.42.0.1
Répartition de charge
Un NATLB associe une VIP à des backends soumis à des health-checks ; combiné à
BGP, il fournit de l’anycast actif-actif entre nœuds.
apiVersion: lb.siha/v1
kind: NATLB
metadata: { id: web }
spec:
vip: "10.40.0.100"
port: 80
backends: ["10.41.0.10", "10.41.0.11"]
healthCheck: { type: tcp, port: 80 }
Dataplane
Le singleton DataplaneConfig (id: default) est propriétaire du
startup.conf de VPP. Le modifier re-génère le fichier et redémarre VPP via
l’application en deux phases à health-check et last-known-good décrite dans
l’architecture.
apiVersion: dataplane.siha/v1
kind: DataplaneConfig
metadata: { id: default }
spec:
workers: 2
requiredPlugins: ["dpdk_plugin", "acl_plugin", "nat44_ed_plugin"]
Les manifestes ci-dessus sont donnés à titre d’illustration — appliquez les vôtres avec
sihactl config apply -f <dir>/et inspectez le résultat avecsihactl get.