- En applikation, der er implementeret i en Kubernetes-klynge, kører som en samlingsbælg.
- Bælgene er i det væsentlige containere, der er planlagt på tværs af flere noder.
- Noder kan være fysiske servere eller VM'er, der tilbydes af din hostingudbyder. Det er klart, at du også kan Kubernetes på en lokal server, hvis du ønsker det.
- Hver Pod har en unik IP-adresse.
- Din applikation er opdelt i mange underkomponenter, ofte omtalt som mikrotjenester.
- For hver mikroservice i din applikation har du en tilsvarende service i Kubernetes.
- I forbindelse med Kubernetes, a Service udsætter en samling bælg til resten af klyngen som en enkelt abstraktion. En enkelt virtuel IP.
- Dette hjælper en tjeneste i din applikation med at kommunikere med en anden tjeneste. Det er en abstraktion, der giver dig mulighed for at adressere en samling af bælg snarere end at specificere IP-adressen på en pod, hver gang du vil tale med den.
- En Kubernetes-tjeneste fungerer også som en belastningsafbalancering for alle de bælg, den repræsenterer. Trafikken fordeles jævnt over alle knudepunkter.
Så langt så godt. Hver tjeneste kan tale med en anden tjeneste. Denne kommunikation er mulig i hele Kubernetes-klyngen
Eksponering af tjenester
“Hvis et træ falder i en skov, og ingen er omkring for at høre det, lyder det?”
På en lignende note, hvis din applikation ikke tjener et formål uden for Kubernetes-klyngen, betyder det virkelig noget, om din klynge er godt bygget? Sikkert ikke.
Lad os sige, at vi har en klassisk webapp sammensat af en frontend skrevet i Nodejs og en backend skrevet i Python, der bruger MySQL-database. Du distribuerer to tilsvarende tjenester i din Kubernetes-klynge.
Du laver en Dockerfile, der specificerer, hvordan du pakker frontend-softwaren i en container, og på samme måde pakker du din backend. Dernæst i din Kubernetes-klynge implementerer du to tjenester, der hver kører et sæt bælg bag den. Webtjenesten kan tale med databaseklyngen og omvendt.
Kubernetes udsætter dog ikke nogen af disse tjenester (som er essentielle HTTP-slutpunkter) for resten af verden. Som anført i de officielle dokumenter:
“Tjenester antages at have virtuelle IP'er, der kun kan routes inden for klyngenetværket”
Dette er helt rimeligt fra et sikkerhedsmæssigt synspunkt, dine tjenester kan tale med hinanden, men klyngen tillader ikke eksterne enheder at tale direkte med tjenesterne. For eksempel er det kun din webfront, der kan tale med databasetjenesten, og ingen andre kan endda sende anmodninger til databasetjenesten.
Problemet opstår, når vi ser på brugen af en frontend-tjeneste. Det skal udsættes for resten af offentligheden, så slutbrugere kan bruge din applikation. Vi udsætter sådanne tjenester ved hjælp af Kubernetes Ingress.
Kubernetes Ingress
Ingress udsætter HTTP- og HTTPS-ruter fra uden for klyngen til tjenester i klyngen. Du kan kontrollere rutningsreglerne ved at definere Kubernetes Ingress-ressourcen. Men det gør meget mere end det. Eksponering af en enkelt tjeneste kan opnås ved hjælp af forskellige andre alternativer som NodePort eller Load Balancers, men disse faciliteter har ikke funktioner, der er sofistikerede nok til en moderne webapp.
Funktioner som, udsætter flere apps på en enkelt IP, definerer ruter osv.
Så lad os forstå disse funktioner for den resterende del af artiklen:
Single Service Ingress
Dette er den enkleste version af at eksponere en enkelt tjeneste som en webfront med en IP (eller et domænenavn) og standard HTTP- og HTTPS-porte (i.e, 80 og 443).
Enkelt Fanout
Dette er en indgangsopsætning, der giver dig mulighed for at tillade indgående trafik til en enkelt IP og dirigere den til flere tjenester.
Den består af:
- En indgangsressource består af et værtsnavn foo.bar.com
- En liste over stier, hvor trafikken skal dirigeres som foo.bar.com / admin foo.bar.com / hjem foo.bar.com / sso
Single fanout er tilfældet, hvor en enkelt IP bruges til flere tjenester. Tjenesterne kan være på forskellige stier i URI som foo.bar.com / admin kan være en tjeneste for administratorer og foo.bar.com / home kan være den service, der genererer hver brugers startside.
Indgangsporten vil altid være 80 eller 443, men den havn, hvor tjenesterne kører (inde i klyngen), kan variere en hel del.
Denne form for indtrængen hjælper os med at minimere antallet af belastningsafbalancere i klyngen, da det i det væsentlige fungerer som en.
Navnebaseret virtuel hosting
Offentlige IP-adresser er endelige. De er også ret dyre. Idéen med navnebaseret virtuel hosting er ældre end Kubernetes. Kernen i det er, at du peger på DNS-poster for forskellige websteder som ww1.eksempel.com og ww2.eksempel.com til den samme IP-adresse. Serveren, der kører på den IP-adresse, vil se den indgående anmodning, og hvis værtsnavnet, der er nævnt i anmodningen, er til ww1.eksempel.com så tjener det webstedet for dig, og hvis ww2.eksempel.com anmodes om, så serveres det.
I forbindelse med Kubernetes kan vi køre to tjenester, der kører ved f.eks. Port 80 og udsætte dem begge for en enkelt IP-adresse ved hjælp af en indgang også af port 80. Ved indgangspunktet er trafikken på ww1.eksempel.com bliver adskilt fra trafikken til ww2.eksempel.com. Derfor udtryk navn baseret virtuel hosting.
Konklusion
Indtrængen i Kubernetes er ret sofistikeret til at blive dækket af et enkelt indlæg. Der er en række brugssager til det og en række Ingress Controllers, der vil tilføje Ingress-funktionaliteten til din klynge. Jeg vil anbefale at starte med Nginx Ingress Controller.
For yderligere detaljer og specifikationer kan du også følge den officielle dokumentation.