Networking

kube-router

CNI tout-en-un (cloudnativelabs, Apache 2.0). BGP via GoBGP, IPVS pour les Services (remplace kube-proxy), NetworkPolicies iptables. Un seul binaire pour trois fonctions.

kube-router est un plugin CNI Kubernetes développé par cloudnativelabs qui combine trois fonctions dans un seul binaire : le networking des pods via BGP, le proxy des Services via IPVS (en remplacement de kube-proxy), et l'application des NetworkPolicies via iptables. Chaque fonction peut être activée ou désactivée indépendamment.

kube-router n'utilise pas d'overlay réseau. Il annonce les routes des pods directement via BGP (protocole GoBGP embarqué), ce qui signifie que les nœuds doivent être capables de se router mutuellement (même L2 ou peering BGP configuré).

Idéal pour : clusters où l'intégration BGP avec l'infrastructure réseau existante est requise, environnements souhaitant remplacer kube-proxy par IPVS, cas d'usage bare-metal avec un switch BGP-capable.


Informations essentielles

Origine : cloudnativelabs  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Projet communautaire actif. Releases régulières.

Trois modes d'utilisation

ModeFlagRôle
Pod networking--run-routerBGP pour les routes des pods (remplace CNI overlay)
Service proxy--run-service-proxyIPVS pour les Services (remplace kube-proxy)
NetworkPolicy--run-firewalliptables pour les NetworkPolicies Kubernetes

Les trois modes peuvent être utilisés ensemble ou séparément. kube-router peut par exemple ne gérer que le service proxy IPVS, en complément d'un autre CNI.


Installation

Via manifeste (tous les modes)

# Déployer kube-router (networking + service proxy + NetworkPolicies)
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml

# Vérifier
kubectl -n kube-system get pods -l k8s-app=kube-router -o wide

Avec kubeadm (mode complet - remplace kube-proxy)

# kubeadm : désactiver kube-proxy et utiliser kube-router pour les Services
kubeadm init --skip-phases=addon/kube-proxy

# Déployer kube-router
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml

# Supprimer les règles iptables legacy de kube-proxy si nécessaire
docker run --privileged --net=host registry.k8s.io/kube-proxy:v1.32.0 \
  kube-proxy --cleanup

Via Helm

helm repo add kube-router https://helm.kuberouter.io
helm install kube-router kube-router/kube-router \
  --namespace kube-system \
  --set "fullnameOverride=kube-router" \
  --set "agentArguments.run-router=true" \
  --set "agentArguments.run-service-proxy=true" \
  --set "agentArguments.run-firewall=true"

Networking BGP

kube-router utilise GoBGP (embarqué) pour annoncer les CIDRs des pods de chaque nœud au reste de la topologie réseau.

# Vérifier les sessions BGP sur un nœud
kubectl -n kube-system exec ds/kube-router -- gobgp neighbor

# Routes annoncées
kubectl -n kube-system exec ds/kube-router -- gobgp global rib

# Si les nœuds sont sur des sous-réseaux différents, configurer un AS BGP
# via l'annotation des nœuds :
kubectl annotate node worker-1 \
  kube-router.io/node.asn=65001 \
  kube-router.io/node.bgppeer-router=192.168.1.1

Peering BGP avec un routeur externe

# ConfigMap pour le peering BGP
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-router-cfg
  namespace: kube-system
data:
  cni-conf.json: |
    {
      "bridge": "kube-bridge",
      "ipam": {
        "type": "host-local"
      }
    }
  kubeconfig: |
    # ... (auto-généré)
# Annoter les nœuds pour le peering BGP
kubectl annotate node <nom-noeud> \
  kube-router.io/node.bgppeer-router=<IP_ROUTEUR_BGP>

Service proxy IPVS

kube-router peut remplacer kube-proxy par une implémentation IPVS plus performante pour les clusters avec beaucoup de Services.

# Vérifier les virtual servers IPVS créés par kube-router
kubectl -n kube-system exec ds/kube-router -- ipvsadm -ln

# Comparaison : IPVS est O(1) vs iptables O(n) pour la résolution des Services
# Avantage significatif sur les clusters avec >1000 Services

NetworkPolicies

kube-router applique les NetworkPolicies Kubernetes standard via iptables.

# NetworkPolicy standard (compatible kube-router)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Mise à jour

# Via manifeste
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml

# Vérifier la version
kubectl -n kube-system get ds kube-router -o jsonpath='{.spec.template.spec.containers[0].image}'

Troubleshooting

Sessions BGP KO

# Vérifier l'état BGP
kubectl -n kube-system exec ds/kube-router -- gobgp neighbor

# Logs kube-router
kubectl -n kube-system logs ds/kube-router | grep -i bgp

# Vérifier la connectivité réseau entre nœuds (BGP port 179)
telnet <IP_NOEUD> 179

Services inaccessibles (mode IPVS)

# Vérifier les virtual servers
kubectl -n kube-system exec ds/kube-router -- ipvsadm -ln

# Vérifier que kube-proxy n'est pas en conflit
kubectl -n kube-system get pods | grep kube-proxy

Commandes utiles

# État des pods kube-router
kubectl -n kube-system get pods -l k8s-app=kube-router -o wide

# BGP
kubectl -n kube-system exec ds/kube-router -- gobgp neighbor
kubectl -n kube-system exec ds/kube-router -- gobgp global rib

# IPVS
kubectl -n kube-system exec ds/kube-router -- ipvsadm -ln

# Logs
kubectl -n kube-system logs ds/kube-router

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic