Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Dit is mijn update vorige maatstaf, dat nu draait op Kubernetes 1.14 met de nieuwste CNI-versie vanaf april 2019.

Allereerst wil ik het Cilium-team bedanken: de jongens hebben me geholpen bij het controleren en corrigeren van de metrische monitoringscripts.

Wat is er veranderd sinds november 2018

Dit is wat er sindsdien is veranderd (als je geïnteresseerd bent):

Flanel blijft de snelste en eenvoudigste CNI-interface, maar ondersteunt nog steeds geen netwerkbeleid en encryptie.

Romana wordt niet langer ondersteund, daarom hebben we het uit de benchmark verwijderd.

WeaveNet ondersteunt nu netwerkbeleid voor inkomend en uitgaand verkeer! Maar de productiviteit is afgenomen.

In Calico moet u de maximale pakketgrootte (MTU) nog steeds handmatig configureren voor de beste prestaties. Calico biedt twee opties voor het installeren van CNI, zodat u het zonder een aparte ETCD-repository kunt doen:

  • het opslaan van de status in de Kubernetes API als een gegevensarchief (clustergrootte < 50 knooppunten);
  • het opslaan van de status in de Kubernetes API als een gegevensarchief met een Typha-proxy om de belasting van de K8S API te verlichten (clustergrootte > 50 knooppunten).

Calico kondigde steun aan beleid op applicatieniveau bovenop Istio voor beveiliging op applicatieniveau.

Cilium ondersteunt nu encryptie! Cilium zorgt voor encryptie met IPSec-tunnels en biedt een alternatief voor het gecodeerde WeaveNet-netwerk. Maar WeaveNet is sneller dan Cilium als encryptie is ingeschakeld.

Cilium is nu eenvoudiger te implementeren dankzij de ingebouwde ETCD-operator.

Het Cilium-team heeft geprobeerd wat gewicht op de CNI te besparen door het geheugenverbruik en de CPU-kosten te verminderen, maar de concurrenten zijn nog steeds lichter.

Benchmarkcontext

De benchmark wordt uitgevoerd op drie niet-gevirtualiseerde Supermicro-servers met een 10 Gb Supermicro-switch. De servers zijn via passieve DAC SFP+ kabels rechtstreeks op de switch aangesloten en zijn op hetzelfde VLAN met jumboframes (MTU 9000) geconfigureerd.

Kubernetes 1.14.0 geïnstalleerd op Ubuntu 18.04 LTS met Docker 18.09.2 (de standaard Docker-versie in deze release).

Om de reproduceerbaarheid te verbeteren, hebben we besloten om de master altijd op het eerste knooppunt te configureren, het servergedeelte van de benchmark op de tweede server en het clientgedeelte op de derde. Om dit te doen, gebruiken we NodeSelector in Kubernetes-implementaties.

We beschrijven de benchmarkresultaten op de volgende schaal:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Een CNI selecteren voor een benchmark

Dit is alleen een benchmark voor CNI uit de lijst in de sectie over het maken van één mastercluster met kubeadm Zie de officiële Kubernetes-documentatie. Van de 9 CNI's nemen we er slechts 6: we sluiten degenen uit die moeilijk te installeren zijn en/of niet werken zonder configuratie volgens de documentatie (Romana, Contiv-VPP en JuniperContrail/TungstenFabric).

We vergelijken de volgende CNI's:

  • Calico v3.6
  • Canal v3.6 (in wezen Flanel voor netwerken + Calico als firewall)
  • Cilium 1.4.2
  • Flanel 0.11.0
  • Kube-router 0.2.5
  • WeaveNet 2.5.1

installatie

Hoe eenvoudiger de CNI te installeren is, hoe beter onze eerste indruk zal zijn. Alle CNI's uit de benchmark zijn zeer eenvoudig te installeren (met één of twee opdrachten).

Zoals we al zeiden, zijn de servers en switch geconfigureerd met ingeschakelde jumboframes (we hebben de MTU ingesteld op 9000). We zouden blij zijn als CNI de MTU automatisch zou bepalen op basis van de configuratie van de adapters. Alleen Cilium en Flanel slaagden hierin. De rest van de CNI's hebben verzoeken op GitHub om automatische MTU-detectie toe te voegen, maar we zullen dit handmatig configureren door de ConfigMap voor Calico, Canal en Kube-router te wijzigen, of een omgevingsvariabele door te geven voor WeaveNet.

Wat is het probleem met een onjuiste MTU? Dit diagram toont het verschil tussen WeaveNet met standaard MTU en jumboframes ingeschakeld:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Hoe beïnvloedt MTU de doorvoer?

We hebben gezien hoe belangrijk MTU is voor de prestaties. Laten we nu eens kijken hoe onze CNI's dit automatisch bepalen:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
CNI detecteert automatisch MTU

De grafiek laat zien dat u de MTU voor Calico, Canal, Kube-router en WeaveNet moet configureren voor optimale prestaties. Cilium en Flannel konden de MTU zelf correct bepalen zonder enige instellingen.

veiligheid

We zullen CNI-beveiliging op twee aspecten vergelijken: de mogelijkheid om verzonden gegevens te versleutelen en de implementatie van Kubernetes-netwerkbeleid (gebaseerd op echte tests, niet op documentatie).

Slechts twee CNI's coderen gegevens: Cilium en WeaveNet. Encryptie WeaveNet ingeschakeld door het coderingswachtwoord in te stellen als een CNI-omgevingsvariabele. IN documentatie WeaveNet beschrijft het op een ingewikkelde manier, maar alles wordt eenvoudig gedaan. Encryptie cilium geconfigureerd door commando's, door het creëren van Kubernetes-geheimen, en door aanpassing van de daemonSet (een beetje ingewikkelder dan in WeaveNet, maar Cilium heeft stapsgewijze instructies).

Wat de implementatie van het netwerkbeleid betreft, zijn ze daarin geslaagd Calico, Canal, Cilium en WeaveNet, waarin u regels voor inkomend en uitgaand verkeer kunt configureren. Voor Kube-router er zijn alleen regels voor Ingress, en Flanel Er is helemaal geen netwerkbeleid.

Hier zijn de algemene resultaten:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Benchmarkresultaten veiligheidsprestaties

Производительность

Deze benchmark toont de gemiddelde doorvoer over ten minste drie uitvoeringen van elke test. We testen de prestaties van TCP en UDP (met behulp van iperf3), echte applicaties zoals HTTP (met Nginx en curl) of FTP (met vsftpd en curl) en ten slotte de applicatieprestaties met behulp van SCP-gebaseerde encryptie (met behulp van client en server OpenSSH).

Voor alle tests hebben we een bare metal benchmark (groene lijn) uitgevoerd om de CNI-prestaties te vergelijken met de native netwerkprestaties. Hier gebruiken we dezelfde schaal, maar dan in kleur:

  • Geel = zeer goed
  • Oranje = goed
  • Blauw = zo-zo
  • Rood = slecht

We nemen geen onjuist geconfigureerde CNI's en tonen alleen resultaten voor CNI's met de juiste MTU. (Opmerking: Cilium berekent de MTU niet correct als u codering inschakelt, dus u zult de MTU handmatig moeten verlagen naar 8900 in versie 1.4. De volgende versie, 1.5, doet dit automatisch.)

Hier zijn de resultaten:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
TCP-prestaties

Alle CNI's presteerden goed in de TCP-benchmark. CNI met encryptie blijft ver achter omdat encryptie duur is.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
UDP-prestaties

Ook hier doen alle CNI's het goed. CNI met encryptie liet vrijwel hetzelfde resultaat zien. Cilium ligt iets achter op de concurrentie, maar het bestaat slechts uit 2,3% blank metaal, dus het is geen slecht resultaat. Vergeet niet dat alleen Cilium en Flannel de MTU zelf correct hebben bepaald, en dit zijn hun resultaten zonder enige aanvullende configuratie.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Hoe zit het met een echte applicatie? Zoals u kunt zien, zijn de algehele prestaties voor HTTP iets lager dan voor TCP. Zelfs als u HTTP met TCP gebruikt, hebben we iperf3 in de TCP-benchmark geconfigureerd om een ​​langzame start te voorkomen die de HTTP-benchmark zou beïnvloeden. Iedereen heeft hier goed werk geleverd. Kube-router heeft een duidelijk voordeel, maar WeaveNet presteerde niet goed: zo'n 20% slechter dan bare metal. Cilium en WeaveNet met encryptie zien er echt triest uit.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Met FTP, een ander op TCP gebaseerd protocol, variëren de resultaten. Flanel en Kube-router doen het werk, maar Calico, Canal en Cilium lopen iets achter en zijn ongeveer 10% langzamer dan bare metal. WeaveNet loopt maar liefst 17% achter, maar het gecodeerde WeaveNet loopt 40% voor op het gecodeerde Cilium.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Met SCP kunnen we direct zien hoeveel SSH-encryptie ons kost. Bijna alle CNI's doen het goed, maar WeaveNet blijft opnieuw achter. Cilium en WeaveNet met encryptie zijn naar verwachting het slechtst vanwege dubbele encryptie (SSH + CNI).

Hier is een samenvattende tabel met de resultaten:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Het verbruik van hulpbronnen

Laten we nu eens vergelijken hoe CNI bronnen verbruikt onder zware belasting (tijdens TCP-overdracht, 10 Gbps). In prestatietests vergelijken we CNI met bare metal (groene lijn). Laten we voor het resourceverbruik pure Kubernetes (paarse lijn) zonder CNI weergeven en kijken hoeveel extra resources CNI verbruikt.

Laten we beginnen met het geheugen. Hier is de gemiddelde waarde voor het RAM-geheugen van knooppunten (exclusief buffers en cache) in MB tijdens de overdracht.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Geheugenverbruik

Flanel en Kube-router lieten uitstekende resultaten zien - slechts 50 MB. Calico en Canal hebben er elk 70. WeaveNet verbruikt duidelijk meer dan de anderen: 130 MB, en Cilium gebruikt maar liefst 400 MB.
Laten we nu het CPU-tijdverbruik controleren. Opmerkelijk: het diagram toont geen percentages, maar ppm, dat wil zeggen dat 38 ppm voor “blank ijzer” 3,8% is. Hier zijn de resultaten:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
CPU-verbruik

Calico, Canal, Flannel en Kube-router zijn zeer CPU-efficiënt - slechts 2% meer dan Kubernetes zonder CNI. WeaveNet blijft ver achter met een extra 5%, gevolgd door Cilium met 7%.

Hier is een samenvatting van het hulpbronnenverbruik:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)

Resultaten van

Tabel met alle resultaten:

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Algemene benchmarkresultaten

Conclusie

In het laatste deel zal ik mijn subjectieve mening geven over de resultaten. Houd er rekening mee dat deze benchmark alleen de doorvoer van een enkele verbinding op een zeer klein cluster (3 knooppunten) test. Het is niet van toepassing op grote clusters (<50 knooppunten) of parallelle verbindingen.

Ik raad aan om de volgende CNI's te gebruiken, afhankelijk van het scenario:

  • Heeft u in uw cluster knooppunten met weinig middelen (meerdere GB RAM, meerdere cores) en je hebt geen beveiligingsfuncties nodig - kies Flanel. Dit is een van de meest kosteneffectieve CNI's. En het is compatibel met een grote verscheidenheid aan architecturen (amd64, arm, arm64, enz.). Bovendien is dit een van de twee (de andere is Cilium) CNI die automatisch de MTU kan bepalen, zodat u niets hoeft te configureren. Kube-router is ook geschikt, maar is niet standaard en je zult de MTU handmatig moeten configureren.
  • Indien nodig het netwerk versleutelen voor de veiligheid, neem WeaveNet. Vergeet niet de MTU-grootte op te geven als u jumboframes gebruikt, en schakel codering in door een wachtwoord op te geven via een omgevingsvariabele. Maar het is beter om de prestaties te vergeten: dat zijn de kosten van encryptie.
  • Voor normaal gebruik Ik adviseer Calico. Deze CNI wordt veel gebruikt in verschillende Kubernetes-implementatietools (Kops, Kubespray, Rancher, etc.). Net als bij WeaveNet moet u ervoor zorgen dat u de MTU in ConfigMap configureert als u jumboframes gebruikt. Het is een multifunctioneel hulpmiddel dat efficiënt is in termen van hulpbronnenverbruik, prestaties en beveiliging.

En tot slot raad ik je aan de ontwikkeling te volgen cilium. Deze CNI heeft een zeer actief team dat veel aan hun product werkt (functies, besparingen op hulpbronnen, prestaties, beveiliging, clustering...) en ze hebben zeer interessante plannen.

Kubernetes Network Plugin (CNI) Benchmarkresultaten via 10 Gbps netwerk (bijgewerkt: april 2019)
Visueel diagram voor CNI-selectie

Bron: www.habr.com

Voeg een reactie