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.

NamespaceRessources
linkInterface, InterfaceRXMode
aclACL, ACLBinding
natNATPool, NATStaticMapping, NATIdentityMapping, NATInterfaceMode
routingVRF, Route
bgpBGPConfig, BGPPeer (+ BGPLearnedRoute en lecture seule)
lbNATLB
dataplaneDataplaneConfig (singleton)

Interfaces

Une Interface est n’importe quel port du dataplane. Elle possède huit kindspmd (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 avec sihactl get.