Kubernetes, ook bekend als K8s, is een open-source orchestratiesysteem voor het automatiseren van de implementatie, schaling en het beheer van gecontaineriseerde applicaties. De portabiliteit, flexibiliteit en automatische schalingsmogelijkheden maken het een veelgebruikt systeem. Bovenal maakt de optie om DNS-records voor services en pods aan te maken het onverslaanbaar ten opzichte van andere softwaresystemen. Met de Kubernetes DNS-service kunt u contact opnemen met services via consistente DNS-namen in plaats van IP-adressen.
Vereisten
Om het meeste uit de handleiding te halen en de Kubernetes DNS-service beter te begrijpen, moet u ervoor zorgen dat u uw kennis opfrist over de basisprincipes van Kubernetes. U zult ook baat hebben bij het lezen van het Overzicht van DNS-terminologieën, componenten en concepten om een beter begrip te krijgen van de DNS-concepten. Daarnaast zal een overzicht van het Docker-ecosysteem en de basisprincipes van containerisatietechnologie een groot voordeel bieden.
Wat is een DNS-systeem?
Het Domain Name System (DNS) is een mechanisme om verschillende soorten informatie te koppelen aan gemakkelijk te onthouden namen, zoals IP-adressen. Het gebruik van een DNS-systeem om opgevraagde namen te vertalen naar IP-adressen maakt het voor eindgebruikers eenvoudig om moeiteloos hun doel-domeinnaam te bereiken. De meeste Kubernetes-clusters bevatten een interne DNS-service die standaard is geconfigureerd om een lichtgewicht benadering voor service discovery te bieden. Zelfs wanneer pods en services worden gemaakt, verwijderd of verplaatst tussen nodes, vereenvoudigt de ingebouwde service discovery het voor applicaties om Kubernetes-clusters te identificeren en ermee te communiceren.
In recente versies van Kubernetes, zijn de technische specificaties van de Kubernetes DNS-service gewijzigd. Deze handleiding is bedoeld om zowel de kube-dns- als de CoreDNS-implementaties van de Kubernetes DNS-service te introduceren. We zullen de Kubernetes DNS-records in detail bekijken en demonstreren hoe Kubernetes DNS werkt.
Wat is inbegrepen in de Kubernetes DNS-service?
Voorheen, vóór de release van versie 1.11, was de Kubernetes DNS-service gebaseerd op kube-dns. Beveiliging en privacy waren echter nog steeds een ernstig probleem. Later introduceerde de Kubernetes-community CoreDNS in de nieuwe versie 1.11 om de beveiligings- en stabiliteitsproblemen van kube-dns aan te pakken.
Ongeacht welke softwareversie u gebruikt om DNS-records te beheren, kube-dns en CoreDNS werken op een vergelijkbare manier:
- Er wordt een kube-dns-service en een of meer pods gemaakt.
- De kube-dns-service controleert de Kubernetes API op service- en eindpuntevenementen en wijzigt de DNS-vermeldingen waar nodig. Wanneer u deze Kubernetes-services en hun gerelateerde pods wijzigt met acties voor het maken, bewerken of verwijderen, worden deze gebeurtenissen automatisch geactiveerd.
- Kubelet wijst het cluster-IP van de kube-dns-service toe aan elke nieuwe pod etc/resolv.conf nameserver-optie, samen met geschikte search-instellingen om kortere hostnamen mogelijk te maken:
|
1 2 3 |
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 |
-
Gecontaineriseerde applicaties kunnen vervolgens hostnamen oplossen zoals example-service.namespace naar het juiste cluster-IP-adres.
Een overzicht van de Kubernetes DNS-records
Laten we de Kubernetes DNS-records beter begrijpen aan de hand van een voorbeeld. Het volledige DNS A-record voor een Kubernetes-service ziet er als volgt uit:
service.namespace.svc.cluster.local
Een pod heeft een record in dit formaat, dat het echte IP-adres van de pod vertegenwoordigt:
10.32.0.125.namespace.pod.cluster.local
Daarnaast worden er SRV-records gemaakt voor de opgegeven poorten van een Kubernetes-service:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
Als gevolg hiervan kan uw applicatie of microservice een eenvoudige en consistente hostnaam aanroepen om andere services of pods op het cluster te bereiken, dankzij het ingebouwde op DNS gebaseerde service discovery-mechanisme.
Kortere hostnamen oplossen en domeinen zoeken
Je zult niet altijd de volledige hostnaam hoeven te gebruiken om toegang te krijgen tot een andere service vanwege de zoekdomeinsuffixen die zijn ingesteld in de resolv.conf bestand. Als je contact opneemt met een service in dezelfde namespace, kun je deze gewoon bij de naam noemen:
|
1 |
other-service |
Voeg other-service toe aan de query als de service zich in een andere namespace bevindt:
|
1 |
other-service.other-namespace |
Je moet ten minste het volgende gebruiken als je een pod wilt bereiken:
|
1 |
pod-ip.other-namespace.pod |
Alleen de .svc suffixen worden automatisch aangevuld in het standaard resolv.conf bestand. Daarom is het essentieel om de instellingen op te geven tot .pod. Laten we vervolgens de fijne kneepjes doornemen van de twee alternatieve Kubernetes DNS-implementaties waar we tot nu toe over hebben geleerd.
Kubernetes DNS-implementatie
Kubernetes-versie 1.11 leverde nieuwe software om de kube-dns service te beheren, zoals vermeld in de vorige sectie. De belangrijkste reden achter de nieuwe update was om de prestaties en beveiliging van de service te verbeteren. Laten we beginnen met de kube-dns integratie vanaf het begin.
-
kube-dns
In de vorige Kubernetes 1.11-versie had de kube-dns service drie containers die actief waren in een kube-dns pod in de kube-system namespace. Bekijk de drie onderstaande containers:
- kube-dns: een container die SkyDNS uitvoert en fungeert als een DNS-queryresolutieservice.
- dnsmasq: SkyDNS-antwoorden worden gecached door dnsmasq, een veelgebruikte lichtgewicht DNS-resolver en cache.
- sidecar: een container aan de zijkant van de service die metrische rapportages uitvoert en reageert op health checks.
CoreDNS is gemaakt als gevolg van beveiligingskwetsbaarheden in Dnsmasq en schaalbaarheidsproblemen met SkyDNS.
-
CoreDNS
Als een nieuwe Kubernetes DNS-service is CoreDNS geüpgraded naar General Availability in Kubernetes 1.11. Dit houdt in dat het klaar is voor productie en door veel installatietools en beheerde Kubernetes-providers zal worden gebruikt als de standaard cluster DNS-service.
CoreDNS is een flexibele en uitbreidbare DNS-server die fungeert als een Kubernetes DNS-cluster. Het voert alle functionaliteiten van het vorige systeem uit. Een DNS-container is verantwoordelijk voor het oplossen en cachen van DNS-query's. CoreDNS reageert op health checks en levert statistieken in een enkele container. Daarnaast pakt het een paar kleine tekortkomingen aan en biedt het nieuwe mogelijkheden om prestatie- en beveiligingsproblemen op te lossen:
- Sommige conflicten tussen het gebruik van stubDomains and externe services zijn opgelost.
- Door de volgorde waarin sommige vermeldingen worden geretourneerd willekeurig te maken, kan CoreDNS op DNS gebaseerde round-robin load balancing.
- Door beter te itereren over elk van de zoekdomeinsuffixen die zijn gedefinieerd in resolv.conf, kan een functie genaamd autopath de DNS-responstijden verbeteren bij het oplossen van externe hostnamen.
- Zelfs als de pod niet bestaat, zal kube-dns 10.32.0.125.namespace.pod.cluster.local altijd oplossen naar 10.32.0.125. CoreDNS biedt een gevalideerde pod-modus die alleen zal oplossen als er een pod met het juiste IP-adres en de juiste namespace bestaat.
Om je kennis over Kubernetes endpoints, autopaths, en wildcards te vergroten, bekijk dan een handleiding over hoe Kubernetes het lezen van zonegegevens mogelijk maakt vanuit zijn cluster.
Aanpassingsfuncties
Kubernetes stelt je in staat om DNS-pods te configureren en de DNS-resolutie van het cluster aan te passen, dankzij de Kubernetes customizing DNS service. Beheerders kunnen deze services gebruiken om de upstream nameservers of zoekdomeinsuffixen te wijzigen die zijn gedefinieerd in resolv.conf. Bovendien is er een add-on-functie om pods en containers te personaliseren met behulp van de dnsConfig optie:

Het bijwerken van deze configuratie dwingt een herschrijving af van de resolv.conf van een pod, waardoor de wijzigingen van kracht worden. De bovenstaande configuratie maakt een bestand aan met nameserver 203.0.113.44 en search custom.dns.local regels, wat direct wordt overgedragen naar de normale resolv.conf opties.
Conclusie
In deze handleiding hebben we u door de basisprincipes van de Kubernetes DNS-service en de implementatie ervan in verschillende versies geleid. Kubernetes DNS-records werden ook besproken aan de hand van een voorbeeld. Daarnaast hebben we enkele aanvullende configuratieopties belicht voor het aanpassen van pods en het oplossen van DNS-query's. Dit behandelt de basisprincipes van de Kubernetes DNS-service, maar uw leerproces hoeft hier niet te eindigen. Bekijk de officiële Kubernetes-documentatie om meer over het onderwerp te ontdekken.
Om uw DevOps-kennis verder uit te breiden en in de essentie van Kubernetes te duiken, kunt u de volgende handleidingen bekijken op onze blog:
- Inleiding tot Helm: Pakketbeheerder voor Kubernetes
- Hoe u Kubernetes installeert en gebruikt op Ubuntu 20.04
- Een PHP-applicatie implementeren op een Kubernetes-cluster met Ubuntu 18.04
Veel computerplezier!
Reacties
Nog geen reacties. Wees de eerste.