Εκφώνηση — Έργο 11: Υπηρεσίες Kubernetes (ClusterIP, NodePort, LoadBalancer)

4 λεπτά

Πρακτική · Ενότητα 07 — Kubernetes : concepts de base · Επίπεδο ενδιάμεσο

Δοκιμάστε πρώτα μόνοι! Πραγματοποιήστε το έργο με αυτή μόνο την εκφώνηση. Η διόρθωση (σχολιασμένα μανιφέστα + εντολές) βρίσκεται στο README.md, διπλωμένη. Μην την ανοίξετε παρά αφού έχετε προσπαθήσει.


Προαπαιτούμενα

  • Το σύμπλεγμα Kubernetes του Docker Desktop ενεργοποιημένο (τύπος Kubeadm) — βλ. έργο 10.
  • Η εικόνα demo-k8s:1.0 ήδη κατασκευασμένη (αλλιώς: docker build -t demo-k8s:1.0 ./app).

Στόχος

Να κατανοήσετε σε τι χρησιμεύει ένα Service και να κατέχετε τους τρεις κύριους τύπους:

  • ClusterIP — πρόσβαση εσωτερική στο σύμπλεγμα + ανακάλυψη υπηρεσιών με όνομα DNS·
  • NodePort — πρόσβαση εξωτερική μέσω μιας θύρας του μηχανήματος·
  • LoadBalancer — πρόσβαση εξωτερική μέσω μιας «δημόσιας» IP (localhost με Docker Desktop).

Όλα πάνω από το ίδιο Deployment: μία μόνο ομάδα Pods, τρεις τρόποι να τα εκθέσετε.


Το πρόβλημα προς επίλυση

Τα Pods είναι εφήμερα: γεννιούνται, πεθαίνουν, αλλάζουν IP. Δεν μπορούμε λοιπόν να βασιζόμαστε στην IP ενός Pod. Χρειάζεται μια σταθερή διεύθυνση που κατανέμει την κίνηση προς τα σωστά Pods: αυτός είναι ο ρόλος του Service, που βρίσκει τα Pods του χάρη στις ετικέτες.


Εργασία προς πραγματοποίηση

Μέρος 1 — Το Deployment (τα Pods προς έκθεση)

  1. Αναπτύξτε μια εφαρμογή σε 3 αντίγραφα που εμφανίζει το όνομα του Pod (επαναχρησιμοποιήστε το demo-k8s:1.0).
  2. Δώστε στα Pods μια σαφή ετικέτα (π.χ. app: demo-back).

Μέρος 2 — ClusterIP + ανακάλυψη υπηρεσιών

  1. Δημιουργήστε ένα Service ClusterIP με όνομα demo-clusterip (θύρα 80 → 5000).
  2. Επιδείξτε την ανακάλυψη μέσω DNS: εκκινήστε ένα προσωρινό Pod πελάτη και καλέστε την υπηρεσία με το όνομά της:
    curl http://demo-clusterip
  3. Ανανεώστε πολλές φορές και διαπιστώστε ότι το όνομα του Pod αλλάζει (εσωτερική κατανομή φορτίου).

Μέρος 3 — NodePort (εξωτερική πρόσβαση)

  1. Δημιουργήστε ένα Service NodePort με όνομα demo-nodeport (nodePort 30082).
  2. Ανοίξτε το http://localhost:30082 από τον περιηγητή σας.

Μέρος 4 — LoadBalancer (εξωτερική πρόσβαση «cloud»)

  1. Δημιουργήστε ένα Service LoadBalancer με όνομα demo-lb (θύρα 8090).
  2. Επαληθεύστε το EXTERNAL-IP (kubectl get svc) και ανοίξτε το http://localhost:8090.

Μέρος 5 — Παρατήρηση και κατανόηση

  1. Λιστάρετε τα Services (kubectl get svc) και εντοπίστε: TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S).
  2. Κοιτάξτε τα Endpoints (kubectl get endpoints demo-clusterip): είναι οι IP των Pods πίσω από το Service.
  3. Αλλάξτε μια ετικέτα ενός Pod (ή του επιλογέα) και παρατηρήστε ότι βγαίνει από τα Endpoints.

Ερωτήσεις προβληματισμού

  • Γιατί δεν μπορούμε απλώς να χρησιμοποιήσουμε την IP ενός Pod;
  • Ποιος τύπος Service για: (a) μια εσωτερική βάση δεδομένων, (b) έναν δημόσιο ιστότοπο σε τοπικό dev, (c) μια δημόσια API σε παραγωγή cloud;
  • Πώς ένα Pod βρίσκει μια άλλη υπηρεσία με το όνομά της; (ρόλος του CoreDNS)
  • Τι περιέχει η λίστα των Endpoints ενός Service, και ποιος την ενημερώνει;
  • Τι συμβαίνει αν κανένα Pod δεν αντιστοιχεί στον επιλογέα του Service;

Παραδοτέα

  • k8s/deployment.yaml και τα τρία Services (service-clusterip.yaml, service-nodeport.yaml, service-loadbalancer.yaml).
  • Ένα στιγμιότυπο του kubectl get svc που δείχνει τους 3 τύπους.
  • Ένα στιγμιότυπο της ανακάλυψης μέσω DNS (curl http://demo-clusterip από ένα Pod πελάτη) με 2 διαφορετικά ονόματα Pods.
  • Ένα στιγμιότυπο του kubectl get endpoints demo-clusterip.

Κριτήρια επιτυχίας

ΚριτήριοΑναμενόμενο
ClusterIPΠροσβάσιμο με όνομα DNS από άλλο Pod
NodePortΠροσβάσιμο στο http://localhost:30082
LoadBalancerEXTERNAL-IP = localhost, προσβάσιμο στο http://localhost:8090
ΚατανομήΤο όνομα του Pod αλλάζει μεταξύ δύο αιτημάτων
EndpointsΟι IP των 3 Pods εμφανίζονται πίσω από το Service

Κολλήσατε; Το README.md περιέχει την πλήρη διόρθωση, οι έννοιες αναλύονται στο 01-CONCEPTS-SERVICES.md και το 02-COMMANDES.md λιστάρει όλο το χρήσιμο kubectl — να τα συμβουλευτείτε αφού έχετε προσπαθήσει.