Kubernetes Headless Service gegen ClusterIP und Traffic Distribution

Der standardmäßige Kubernetes-Diensttyp ist clusterIP. Wenn Sie einen headless-Dienst durch Festlegen von clusterIP None erstellen, wird kein Lastenausgleich durchgeführt und diesem Dienst keine Cluster-IP zugewiesen. Nur DNS wird automatisch konfiguriert. Wenn Sie eine DNS-Abfrage für den Headless-Dienst ausführen, erhalten Sie die Liste der Pods-IPs und normalerweise wählt Client-DNS den ersten DNS-Eintrag aus.

Machen wir einen schnellen Test für Headless- und ClusterIP-Dienste. Ich werde stenote / nginx-hostname image verwenden, um den Hostnamen jedes Pods in der http-Antwort abzurufen.

Erstellen Sie eine Nginx-Bereitstellung

$ kubectl create deployment nginx --image = stenote / nginx-hostname

Auf 3 Hülsen skalieren.
$ kubectl scale --replicas = 3 Deployment-Nginx

Stellen Sie einen Headless-Dienst bereit, indem Sie --cluster-ip = None festlegen

$ kubectl expose deployment nginx --name nginxheadless --cluster-ip = Keine
service / nginxheadless ausgesetzt

Bereitstellen eines Standarddienstes (ClusterIP-Typ)

$ kubectl expose deployment nginx --name nginxclusterip --port = 80 --target-port = 80
service / nginxclusterip ausgesetzt

Um unseren Fall zu testen, müssen wir DNS-Abfragen und den Befehl curl ausführen. arunvelsriram / utils enthält alles, was wir brauchen.

$ kubectl run --generator = run-pod / v1 --rm utils -it --image arunvelsriram / utils bash
root @ utils: / # host nginxheadless
nginxheadless.default.svc.cluster.local hat die Adresse 100.64.10.148
nginxheadless.default.svc.cluster.local hat die Adresse 100.64.10.206
nginxheadless.default.svc.cluster.local hat die Adresse 100.64.2.87

Wie Sie oben sehen können, gibt die host nginxheadless-Abfrage die IP-Liste der Pods in der Antwort zurück. Machen wir es uns mit diesem Dienstnamen gemütlich.

root @ utils: / # für i in $ (Seq. 1 10); Locken Sie nginxheadless; getan
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-kpqgm
root @ utils: / #
root @ utils: / # curl -v nginxheadless
* URL neu aufgebaut zu: nginxheadless /
* 100.64.10.148 wird versucht…
* TCP_NODELAY gesetzt
* Verbunden mit nginxheadless (100.64.10.148) Port 80 (# 0)
> GET / HTTP / 1.1
> Host: nginxheadless
> User-Agent: curl / 7.58.0
> Akzeptieren: * / *
>

Wie Sie oben sehen können, verbindet sich unser Client-Pod immer mit der ersten IP in DNS-Antwort. Hier gibt es keinen echten Lastausgleich :(

Testen wir den ClusterIP-Dienst

root @ utils: / # host nginxclusterip
nginxclusterip.default.svc.cluster.local hat die Adresse 10.100.65.120
root @ utils: / #
root @ utils: / # für i in $ (Seq. 1 10); Locke nginxclusterip; getan
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-kpqgm
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-sfw5h
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-m7knq
nginx-66cf4d99b5-sfw5h
nginx-66cf4d99b5-m7knq
root @ utils: / #

Perfekt! Der clusterIP-Dienst erstellt eine einzelne Cluster-IP und verteilt den Datenverkehr zwischen den Pods.

Wenn Sie einen einzelnen Pod wie einen Datenbankserver (mysql, pgsql) verwenden, können Sie den Headless-Service verwenden. Wenn Sie jedoch mehrere Pods für einen Dienst ausführen möchten, ist es besser, einen ClusterIP-Kubernetes-Dienst zu erstellen

Ismail YENIGUL

Devops Engineer bei Feedstock Inc.

Folgen Sie uns auf Twitter und Facebook und treten Sie unserer Facebook-Gruppe bei.

Um unserer Community Slack beizutreten und unsere wöchentlichen Faunthemen zu lesen, klicken Sie hier

Wenn dieser Beitrag hilfreich war, klicken Sie bitte einige Male auf die Schaltfläche zum Klicken ap, um Ihre Unterstützung für den Autor anzuzeigen! ⬇