Υπηρεσίες Kubernetes — ουσιαστικές έννοιες

2 λεπτά

Έργο projet11-kubernetes-services · η χρήσιμη θεωρία πριν (ή κατά) την πρακτική.

Γιατί ένα Service;

Ένα Pod είναι εφήμερο: μπορεί να διαγραφεί, να αναδημιουργηθεί, να μετακινηθεί σε άλλο κόμβο — και η διεύθυνση IP του αλλάζει. Αδύνατο λοιπόν να κωδικοποιήσουμε «στα σκληρά» την IP ενός Pod.

Το Service λύνει αυτό το πρόβλημα: παρέχει μια σταθερή διεύθυνση (IP + όνομα DNS) και κατανέμει αυτόματα την κίνηση προς όλα τα Pods που αντιστοιχούν στον επιλογέα ετικετών του.

Ο δεσμός Service → Pods δεν είναι μια παγωμένη IP: είναι ένας επιλογέας ετικετών. Το Kubernetes διατηρεί μόνο του τη λίστα των αντίστοιχων Pods (τα Endpoints).


Οι τρεις κύριοι τύποι

1. ClusterIP (προεπιλογή)

  • Διεύθυνση IP εσωτερική στο σύμπλεγμα, απρόσιτη από έξω.
  • Χρησιμεύει στην επικοινωνία μεταξύ Pods (π.χ. το frontend καλεί το backend).
  • Βάση της ανακάλυψης υπηρεσιών: προσβάσιμο με όνομα DNS (http://demo-clusterip).

2. NodePort

  • Ανοίγει μια σταθερή θύρα σε κάθε κόμβο (εύρος 30000–32767).
  • Απλή εξωτερική πρόσβαση: http://<ip-du-noeud>:<nodePort> (εδώ http://localhost:30082).
  • Πρακτικό σε dev/τοπικό· σπάνια εκτίθεται ως έχει στην παραγωγή.

3. LoadBalancer

  • Ζητά μια εξωτερική IP από την υποδομή.
  • Στο νέφος (AWS/GCP/Azure): προμηθεύει έναν πραγματικό εξισορροπητή φορτίου.
  • Με το Docker Desktop: το EXTERNAL-IP γίνεται localhost (http://localhost:8090).

Συγκριτικός πίνακας

ΤύποςΕμβέλειαΠρόσβασηΤυπική χρήση
ClusterIPΕσωτερικόΕσωτερικό όνομα DNSΒάση δεδομένων, εσωτερική API, επικοινωνία Pod↔Pod
NodePortΕξωτερικόlocalhost:<30000-32767>Επίδειξη / τοπικό dev
LoadBalancerΕξωτερικόΔημόσια IP (localhost τοπικά)Δημόσια υπηρεσία σε παραγωγή cloud

Υπάρχει επίσης το ExternalName (ψευδώνυμο DNS προς εξωτερική υπηρεσία) και το Ingress (δρομολόγηση HTTP/HTTPS ανά όνομα τομέα, αργότερα) — εκτός αυτού του έργου.


Η ανακάλυψη υπηρεσιών (εσωτερικό DNS)

Το Kubernetes εκτελεί το CoreDNS στο σύμπλεγμα. Κάθε Service λαμβάνει ένα όνομα DNS:

<nom-du-service>                       # από τον ίδιο χώρο ονομάτων
<nom-du-service>.<namespace>           # από άλλον χώρο ονομάτων
<nom-du-service>.<namespace>.svc.cluster.local   # πλήρες όνομα (FQDN)

Έτσι, από οποιοδήποτε Pod του ίδιου χώρου ονομάτων:

bash
curl http://demo-clusterip            # επιλύεται από το CoreDNS -> IP του Service -> ένα Pod

Service και Endpoints

  • Το Service ορίζει τι να εκτεθεί (μέσω του επιλογέα).
  • Τα Endpoints είναι η πραγματική λίστα των IP:port των αντίστοιχων Pods, ενημερωμένη αυτόματα από το Kubernetes.
bash
kubectl get endpoints demo-clusterip   # εμφανίζει τις IP των Pods πίσω από το Service
  • Αν κανένα Pod δεν αντιστοιχεί στον επιλογέα → κενά Endpoints → το Service απαντά «κανένα backend» (σύνδεση απορρίφθηκε).
  • Αυτό είναι το σφάλμα αρ. 1: μια ετικέτα του Pod που δεν αντιστοιχεί στον επιλογέα του Service.

Να θυμάστε

  • Ένα Service = σταθερή διεύθυνση + κατανομή φορτίου + επιλογέας ετικετών.
  • ClusterIP (εσωτερικό, DNS), NodePort (θύρα του κόμβου), LoadBalancer (εξωτερική IP).
  • Η ανακάλυψη υπηρεσιών γίνεται με όνομα DNS χάρη στο CoreDNS.
  • Τα Endpoints συνδέουν δυναμικά το Service με τα Pods του.

Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων