Exposing Services in Kubernetes
Υπάρχουν διάφοροι τρόποι για να εκθέσετε υπηρεσίες στο Kubernetes, έτσι ώστε τόσο οι εσωτερικές όσο και οι εξωτερικές καταλήξεις να μπορούν να τις προσεγγίσουν. Αυτή η διαμόρφωση του Kubernetes είναι αρκετά κρίσιμη, καθώς ο διαχειριστής μπορεί να δώσει πρόσβαση σε επιτιθέμενους για υπηρεσίες στις οποίες δεν θα έπρεπε να έχουν πρόσβαση.
Αυτόματη Απαρίθμηση
Πριν ξεκινήσετε να απαριθμείτε τους τρόπους που προσφέρει το K8s για να εκθέσει υπηρεσίες στο κοινό, γνωρίστε ότι αν μπορείτε να καταλογίσετε τα namespaces, τις υπηρεσίες και τις εισαγωγές, μπορείτε να βρείτε όλα όσα είναι εκτεθειμένα στο κοινό με:
ClusterIP
Ένα ClusterIP service είναι το προεπιλεγμένο Kubernetes service. Σας παρέχει ένα service μέσα στο cluster σας που άλλες εφαρμογές μέσα στο cluster σας μπορούν να έχουν πρόσβαση. Δεν υπάρχει εξωτερική πρόσβαση.
Ωστόσο, αυτό μπορεί να προσπελαστεί χρησιμοποιώντας το Kubernetes Proxy:
Τώρα, μπορείτε να πλοηγηθείτε μέσω του Kubernetes API για να αποκτήσετε πρόσβαση σε υπηρεσίες χρησιμοποιώντας τον παρακάτω τρόπο:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τον παρακάτω σύνδεσμο:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
για να αποκτήσετε πρόσβαση σε αυτήν την υπηρεσία:
Αυτή η μέθοδος απαιτεί να εκτελέσετε το kubectl
ως έναν εξουσιοδοτημένο χρήστη.
NodePort
Όταν χρησιμοποιείται η επιλογή NodePort, δημιουργείται ένας καθορισμένος θύρα σε όλους τους κόμβους (που αντιπροσωπεύουν τις εικονικές μηχανές). Ο κίνητος ρυθμιστής που κατευθύνεται σε αυτήν τη συγκεκριμένη θύρα δρομολογείται συστηματικά στην υπηρεσία. Συνήθως, αυτή η μέθοδος δεν συνιστάται λόγω των ανεπιθύμητων επιπτώσεών της.
Ένα παράδειγμα προδιαγραφής NodePort:
Εάν δεν καθορίσετε το nodePort στο yaml (είναι η θύρα που θα ανοίξει), θα χρησιμοποιηθεί μια θύρα στο εύρος 30000-32767.
LoadBalancer
Εκθέτει την υπηρεσία εξωτερικά χρησιμοποιώντας έναν ισορροπητή φορτίου του παρόχου cloud. Στο GKE, αυτό θα δημιουργήσει έναν Ισορροπητή Φορτίου Δικτύου που θα σας δώσει μια μοναδική διεύθυνση IP που θα προωθεί όλη την κίνηση στην υπηρεσία σας.
Πρέπει να πληρώσετε για έναν ισορροπητή φορτίου για κάθε εκτεθειμένη υπηρεσία, που μπορεί να γίνει ακριβό.
ExternalName
Από τα έγγραφα: Οι υπηρεσίες τύπου ExternalName αντιστοιχίζουν μια υπηρεσία σε ένα όνομα DNS, όχι σε έναν τυπικό επιλογέα όπως my-service
ή cassandra
. Καθορίζετε αυτές τις υπηρεσίες με την παράμετρο spec.externalName
.
Για παράδειγμα, ο ακόλουθος ορισμός υπηρεσίας αντιστοιχίζει την υπηρεσία my-service
στο περιβάλλον prod
στο my.database.example.com
:
Όταν αναζητείτε τον κεντρικό υπολογιστή my-service.prod.svc.cluster.local
, ο υπηρεσία DNS του συστήματος επιστρέφει ένα εγγραφή CNAME
με την τιμή my.database.example.com
. Η πρόσβαση στο my-service
λειτουργεί με τον ίδιο τρόπο με άλλες υπηρεσίες, με την κρίσιμη διαφορά ότι η ανακατεύθυνση συμβαίνει στο επίπεδο DNS αντί να γίνεται μέσω προϊστάμενης ή προώθησης.
Εξωτερικές Διευθύνσεις IP
Ο κίνηση που εισέρχεται στο σύμπλεγμα με την εξωτερική διεύθυνση IP (ως διεύθυνση προορισμού), στη θύρα της υπηρεσίας, θα δρομολογηθεί σε ένα από τα άκρα της υπηρεσίας. Οι externalIPs
δεν διαχειρίζονται από το Kubernetes και είναι ευθύνη του διαχειριστή του συμπλέγματος.
Στην προδιαγραφή της υπηρεσίας, μπορούν να καθοριστούν οι externalIPs
μαζί με οποιοδήποτε από τα ServiceTypes
. Στο παρακάτω παράδειγμα, η "my-service
" μπορεί να προσεγγιστεί από πελάτες στη διεύθυνση "80.11.12.10:80
" (externalIP:port
)
Ingress
Αντίθετα από όλα τα παραπάνω παραδείγματα, το Ingress ΔΕΝ είναι ένας τύπος υπηρεσίας. Αντ' αυτού, βρίσκεται μπροστά από πολλές υπηρεσίες και λειτουργεί ως ένας "έξυπνος δρομολογητής" ή είσοδος στο cluster σας.
Μπορείτε να κάνετε πολλά διαφορετικά πράγματα με ένα Ingress, και υπάρχουν πολλοί τύποι ελεγκτών Ingress που έχουν διαφορετικές δυνατότητες.
Ο προεπιλεγμένος ελεγκτής Ingress του GKE θα δημιουργήσει έναν HTTP(S) Load Balancer για εσάς. Αυτό θα σας επιτρέψει να κάνετε δρομολόγηση βάσει διαδρομής ή υποτομέα προς υπηρεσίες πίσω από τον φορέα. Για παράδειγμα, μπορείτε να στείλετε όλα τα foo.yourdomain.com στην υπηρεσία foo, και όλα τα yourdomain.com/bar/ κάτω από τη διαδρομή bar στην υπηρεσία bar.
Το YAML για ένα αντικείμενο Ingress στο GKE με έναν L7 HTTP Load Balancer μπορεί να μοιάζει με αυτό:
Αναφορές
Last updated