Επιστροφή στο blog

Πώς να αντιμετωπίσετε προβλήματα και να επιθεωρήσετε τη δικτύωση του Kubernetes

Πώς να αντιμετωπίσετε προβλήματα και να επιθεωρήσετε τη δικτύωση του Kubernetes

Kubernetes είναι ένα εργαλείο ανοιχτού κώδικα που είναι κρίσιμο στην ενορχήστρωση κοντέινερ. Το Kubernetes βοηθά στην ενορχήστρωση και διαχείριση συμπλεγμάτων (clusters) σε κλίμακα σε διάφορα περιβάλλοντα cloud ή ακόμα και σε τοπικούς διακομιστές (on-premise). Ένα σύμπλεγμα είναι ένα σύνολο κεντρικών υπολογιστών (hosts) που προορίζονται για την εκτέλεση εφαρμογών και υπηρεσιών σε κοντέινερ. Ένα σύμπλεγμα χρειάζεται τουλάχιστον δύο κόμβους (nodes) για να λειτουργήσει – έναν κύριο κόμβο (master node) και έναν κόμβο εργασίας (worker node). Μπορείτε να κλιμακώσετε την υποδομή Kubernetes προσθέτοντας περισσότερους κόμβους εργασίας. Ένας κύριος κόμβος και οι κόμβοι εργασίας του πρέπει να μπορούν να επικοινωνούν μέσω δικτύου για να λειτουργήσει η υποδομή. Για μια επισκόπηση των πιο σημαντικών δυνατοτήτων του Kubernetes, ακολουθήστε τον οδηγό μας σχετικά με το Γνωριμία με το Kubernetes.

In this tutorial, we will be showing you διάφορα εργαλεία και τεχνικές που βοηθούν στην επιθεώρηση και την αντιμετώπιση προβλημάτων του δικτύου Kubernetes.

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

  • Θα πρέπει επίσης να έχετε kubectl εγκατεστημένο τοπικά. Ανάλογα με το τοπικό σας περιβάλλον, ακολουθήστε τα επίσημα έγγραφα σχετικά με την εγκατάσταση των εργαλείων Kubernetes. Το kubectl θα πρέπει να είναι ρυθμισμένο ώστε να συνδέεται στο σύμπλεγμά σας. Θα το εξηγήσουμε περαιτέρω στην παρακάτω ενότητα.

Θα εκτελέσουμε διάφορες εντολές τόσο τοπικά όσο και στον κόμβο Kubernetes. Ας ξεκινήσουμε!

Διαμόρφωση του τοπικού kubectl για σύνδεση σε ένα απομακρυσμένο σύμπλεγμα Kubernetes

Ας ξεκινήσουμε εγκαθιστώντας το kubectl. Το τοπικό μας περιβάλλον εκτελεί Ubuntu, ακολουθήστε αυτόν τον σύνδεσμο εάν εκτελείτε διαφορετικό τοπικό περιβάλλον. Για να εγκαταστήσετε τα εργαλεία kubectl σε ένα τοπικό περιβάλλον Ubuntu/Debian με τον διαχειριστή πακέτων apt, εκτελέστε τις ακόλουθες εντολές για να ενημερώσετε το αποθετήριο apt και να εγκαταστήσετε τα απαραίτητα πακέτα:

Στη συνέχεια, εκτελέστε την ακόλουθη εντολή για να κάνετε λήψη του δημόσιου κλειδιού υπογραφής του Google cloud:

Στη συνέχεια, προσθέστε το αποθετήριο apt του Kubernetes:

Μετά από αυτό, ενημερώστε το ευρετήριο apt και εγκαταστήστε το kubectl με την ακόλουθη εντολή:

Στη συνέχεια, επαληθεύστε ότι το kubectl είναι εγκατεστημένο ελέγχοντας την έκδοση με την ακόλουθη εντολή:

Ακολουθεί το αποτέλεσμα εάν μόλις εγκαταστήσατε το kubectl τοπικά:

kubectl version

Στο παραπάνω στιγμιότυπο οθόνης, το kubectl προσπαθεί να συνδεθεί στο τοπικό σύμπλεγμα Kubernetes. Ωστόσο, αποτυγχάνει επειδή δεν έχουμε ακόμη ένα σύμπλεγμα Kubernetes που να εκτελείται στον τοπικό μας υπολογιστή.

Για να συνδεθείτε στο απομακρυσμένο σύμπλεγμα Kubernetes, θα κάνετε πρώτα λήψη των διαπιστευτηρίων Kubernetes από το απομακρυσμένο σύμπλεγμα. Ακολουθεί μια εντολή για την αντιγραφή των διαπιστευτηρίων από τον κύριο κόμβο:

Αντικαταστήστε τα επισημασμένα μέρη με το όνομα χρήστη ssh σας και τη δημόσια IP του κύριου κόμβου. Μόλις ολοκληρωθεί η λήψη των διαπιστευτηρίων, αντιγράψτε τα στον αρχικό σας κατάλογο:

Αυτό είναι όλο. Το τοπικό σας kubectl θα πρέπει να μπορεί να συνδεθεί και να εκδώσει εντολές στο απομακρυσμένο σύμπλεγμα Kubernetes. Για να επιβεβαιώσετε ότι το τοπικό σας kubectl είναι συνδεδεμένο στο απομακρυσμένο σύμπλεγμα, ελέγξτε ξανά με την εντολή έκδοσης (version):

Εδώ είναι το αποτέλεσμα, που δείχνει μια επιτυχημένη σύνδεση:

kubectl version json

Προαιρετικά, μπορείτε να εκτελέσετε την get nodes εντολή ως εξής:

kubectl get nodes

Λήψη της Cluster IP ενός Pod

Μπορείτε να λάβετε την Cluster IP ενός Pod εκτελώντας την kubectl get pod εντολή στο τοπικό σας μηχάνημα. Για να εμφανίσετε περισσότερες πληροφορίες, όπως τον κόμβο που φιλοξενεί το pod και την cluster IP του pod, προσθέστε τη σημαία -o wide στην εντολή:

Εδώ είναι ένα αποτέλεσμα από το Kubernetes cluster μας. Στο προαπαιτούμενο σεμινάριο είχαμε δημιουργήσει ένα Nginx web server deployment, όπως μπορείτε να δείτε:

kubectl get pod -o wide

Η στήλη IP δείχνει την εσωτερική διεύθυνση IP των μεμονωμένων pods. Εάν το pod που αναζητάτε δεν εμφανίζεται στη λίστα, ενδέχεται να βρίσκεστε σε διαφορετικό namespace. Μπορείτε να εκδώσετε την ακόλουθη εντολή για να εμφανίσετε τα pods σε όλα τα namespaces:

Λήψη της διεύθυνσης IP μιας Υπηρεσίας (Service)

Μπορείτε επίσης να λάβετε τη διεύθυνση IP ενός Service στο cluster σας. Προσθέτοντας τη --all-namespaces σημαία, λαμβάνετε όλες τις υπηρεσίες που εκτελούνται στο cluster:

Το αποτέλεσμα από την παραπάνω εντολή είναι το εξής. Η IP του Service βρίσκεται στη στήλη cluster-ip :

kubectl get svc

Λήψη και Πρόσβαση στα Network Namespaces των Pod

Κάθε Kubernetes pod έχει ένα network namespace εκχωρημένο σε αυτό. Τα network namespaces, που αναφέρονται επίσης ως netns, είναι εγγενείς βιβλιοθήκες δικτύωσης στο Linux που παρέχουν απομόνωση μεταξύ των συσκευών δικτύου.

Για να ελέγξετε την ανάλυση DNS ή τη γενική συνδεσιμότητα δικτύου, μπορείτε να εκτελέσετε εντολές μέσα στο network namespace ενός pod. Για να το επιτύχετε αυτό, ξεκινάτε αναζητώντας το αναγνωριστικό διεργασίας (process ID) ενός από τα containers σε ένα pod. Μπορείτε εύκολα να το κάνετε αυτό στο Docker χρησιμοποιώντας εντολές ειδικές για το Docker. Η πρώτη εντολή εμφανίζει τα containers που εκτελούνται σε έναν κόμβο. Συνδεθείτε σε έναν από τους worker κόμβους σας και εκτελέστε την ακόλουθη εντολή:

docker ps

Στο αποτέλεσμα, μας ενδιαφέρει η στήλη container ID ή Names. Παρατηρήστε το Nginx container που αναπτύξαμε στο προαπαιτούμενο σεμινάριο How to Install and Use Kubernetes on Ubuntu 20.04.

Στη συνέχεια, αντιγράψτε το container ID ή το Name καθώς θα το χρησιμοποιήσουμε στην επόμενη εντολή για να βρούμε το process ID:

Αντικαταστήστε το επισημασμένο μέρος με την τιμή σας όπως την αντιγράψατε από την προηγούμενη εντολή. Παρακάτω είναι το αποτέλεσμα που λάβαμε, το οποίο είναι το process ID:

docker inspect

Τώρα που έχουμε ένα process ID, μπορούμε να το χρησιμοποιήσουμε για να εκτελέσουμε την εντολή nsenter μέσα στο network namespace της διεργασίας:

Αντικαταστήστε το επισημασμένο μέρος με το process ID που λάβατε στην προηγούμενη εντολή. Στη συνέχεια, στη θέση του ip addr, μπορείτε να βάλετε οποιαδήποτε εντολή θέλετε να εκτελέσετε μέσα στο network namespace του pod. Μπορείτε επίσης να την εκτελέσετε με sudo σε περίπτωση που λάβετε σφάλμα άρνησης πρόσβασης (permission denied).

Η εντολή nsenter σάς επιτρέπει να εκτελείτε ένα ευρύτερο φάσμα εντολών που είναι διαθέσιμες σε έναν κόμβο, σε αντίθεση με τη χρήση του docker exec που σας περιορίζει μόνο στις εντολές που είναι εγκατεστημένες μέσα στο container.

Ανάκτηση της Εικονικής Διεπαφής Ethernet (Virtual Ethernet Interface) ενός Pod

Ένα network namespace σε ένα pod επικοινωνεί με το root netns του κόμβου μέσω ενός εικονικού αγωγού ethernet (virtual ethernet pipe). Από την πλευρά του κόμβου, αυτός ο αγωγός εμφανίζεται ως μια συσκευή της οποίας το όνομα ξεκινά με veth και τελειώνει σε ένα μοναδικό αναγνωριστικό, όπως veth742f721 ή veth90. Ενώ μέσα στο pod ο αγωγός αναγνωρίζεται ως eth0.

Ίσως θέλετε να μάθετε ποια συσκευή veth είναι συζευγμένη με ποιο pod. Μπορείτε να ξεκινήσετε εμφανίζοντας όλες τις συσκευές δικτύου στον κόμβο και, στη συνέχεια, όλες τις συσκευές στο δίκτυο του pod. Για να αναγνωρίσετε ποια συσκευή veth είναι συζευγμένη με ένα συγκεκριμένο pod, μπορείτε να συσχετίσετε τους αριθμούς συσκευών μεταξύ των δύο λιστών.

Χρησιμοποιήστε την εντολή nsenter για να εκτελέσετε την εντολή ip addr στο network namespace του pod. Θα πρέπει να γνωρίζετε ένα από τα process IDs του container. Για αυτό, ανατρέξτε στην προηγούμενη ενότητα σχετικά με τη Λήψη και Πρόσβαση στα Network Namespaces των Pod.

Στη συνέχεια, εκτελέστε την ακόλουθη εντολή στο τερματικό του worker node σας, αντικαθιστώντας κατάλληλα το επισημασμένο μέρος:

Η εντολή εμφανίζει μια λίστα με τις διεπαφές του pod:

nsenter ip addr

Παρατηρήστε τους χαρακτήρες if7 μετά το eth0@ στο παραπάνω αποτέλεσμα. Αυτό σημαίνει ότι το eth0 του pod είναι συζευγμένο με την 7η διεπαφή του κόμβου. Στη συνέχεια, εμφανίστε τις διεπαφές μέσα στο default namespace του κόμβου εκτελώντας την ip addr εντολή:

Η εντολή εμφανίζει τις διεπαφές όπως φαίνεται παρακάτω:

Kubernetes Networking ip addr

Στο αποτέλεσμα, η 7η διεπαφή είναι η veth254b50e6@if3  – ο εικονικός αγωγός ethernet που είναι συζευγμένος με το pod με το οποίο κάνουμε τη δοκιμή.

Reviewing Iptables Rules

Μπορείτε να εκτελέσετε την εντολή iptables-save για να εμφανίσετε όλα τα iptables σε έναν κόμβο:

Το αποτέλεσμα της εντολής μπορεί να είναι μεγάλο, επομένως μπορείτε να το αποθηκεύσετε σε ένα αρχείο για μεταγενέστερη εξέταση:

Μπορείτε επίσης να χρησιμοποιήσετε το less για να σελιδοποιήσετε το αποτέλεσμα:

Εφόσον μας ενδιαφέρουν μόνο οι κανόνες NAT του Kubernetes, προσθέστε τη σημαία -L για να καθορίσετε τον σωστό στόχο:

Εδώ είναι το αποτέλεσμα:

Kubernetes Networking iptables

Inspecting IPVS Details

Το Kube-proxy είναι ένας διαμεσολαβητής δικτύου (network proxy) που εκτελείται σε κάθε κόμβο στο Kubernetes cluster σας. Μπορεί να χρησιμοποιηθεί για τη διαμόρφωση του IPVS ώστε να χειρίζεται τη μετάφραση των εικονικών IP των Υπηρεσιών (Service IPs) σε IP των pod. Για να εμφανίσετε τον πίνακα μετάφρασης των IP, μπορείτε να χρησιμοποιήσετε την εντολή ipvsadm . Αρχικά, πρέπει να την εγκαταστήσετε στον κόμβο σας:

Τώρα μπορείτε να εκτελέσετε την ακόλουθη εντολή:

Για να εμφανίσετε μια μεμονωμένη IP Υπηρεσίας, προσθέστε τη σημαία -t , καθορίζοντας την επιθυμητή διεύθυνση IP:

Querying Cluster DNS

Υπάρχουν μερικοί τρόποι που μπορείτε να ακολουθήσετε για να εντοπίσετε σφάλματα (debug) στην ανάλυση DNS του cluster σας. Η επίσημη τεκμηρίωση περιγράφει έναν τρόπο, ο οποίος είναι η ανάπτυξη ενός debug container με όλα τα απαραίτητα εργαλεία, και στη συνέχεια η χρήση του kubectl για την εκτέλεση (exec) του nslookup.

Προαιρετικά, μπορείτε να υποβάλετε ερώτημα στο DNS χρησιμοποιώντας τις εντολές dig και nsenter από τον ίδιο τον κόμβο. Αρχικά, θα πρέπει να εγκαταστήσετε το dig στο master node σας. Για το Ubuntu, εγκαταστήστε το με την εντολή apt :

Kubernetes Networking install dnsutils

Επιστρέψτε στο τερματικό του τοπικού σας μηχανήματος και εκτελέστε την παρακάτω εντολή για να βρείτε την cluster IP της υπηρεσίας kube-dns :

Η εντολή εμφανίζει:

get kube dns service

Η στήλη cluster-ip περιέχει την τιμή που χρειαζόμαστε. Τώρα μπορούμε να χρησιμοποιήσουμε το nsenter για να εκτελέσουμε το dig στο namespace του container. Ωστόσο, θα χρειαστείτε ένα process ID του container για να αποκτήσετε πρόσβαση στο namespace του. Δείτε την ενότητα Getting and Accessing Pod Network Namespaces παραπάνω για καθοδήγηση.

Μόλις έχετε το container-id, εκτελέστε την ακόλουθη εντολή στο master node σας:

Η εντολή dig λαμβάνει την IP της υπηρεσίας DNS του cluster ( @10.96.0.10) και αναζητά το πλήρες domain name της Υπηρεσίας service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

Για πληροφορίες σχετικά με την εύρεση ονομάτων υπηρεσιών και namespaces, ρίξτε μια ματιά στην ενότητα Getting the IP address of a Service.

Reviewing Conntrack Connection Tracking

Μπορείτε να χρησιμοποιήσετε την εντολή conntrack για να δείτε όλες τις συνδέσεις που παρακολουθούνται αυτήν τη στιγμή:

Εμφανίζει κάτι παρόμοιο με το στιγμιότυπο οθόνης:

Kubernetes Networking conntrac -l

Προσθέστε τη σημαία -E για συνεχή παρακολούθηση των εισερχόμενων συνδέσεων:

Για να δείτε τις συνδέσεις που παρακολουθούνται προς μια συγκεκριμένη διεύθυνση προορισμού, προσθέστε τη σημαία -d και καθορίστε τη διεύθυνση προορισμού:

Μερικές φορές ο πίνακας παρακολούθησης συνδέσεων γεμίζει, με αποτέλεσμα να απορρίπτονται οι νέες συνδέσεις. Αυτό προκαλεί προβλήματα που εμποδίζουν τους κόμβους σας να δημιουργήσουν αξιόπιστες συνδέσεις. Εάν συμβεί αυτό, θα δείτε μηνύματα όπως το ακόλουθο στα αρχεία καταγραφής του συστήματός σας, στη διαδρομή /var/log/syslog:

Υπάρχει μια ρύθμιση συστήματος για τον μέγιστο αριθμό συνδέσεων προς παρακολούθηση. Χρησιμοποιήστε την ακόλουθη εντολή για να δείτε την τρέχουσα τιμή σας:

Παράγει το εξής αποτέλεσμα:

conntrack max

Μπορείτε να τροποποιήσετε την τιμή χρησιμοποιώντας τη -w σημαία:

Ίσως θέλετε να τροποποιήσετε το /etc/sysctl.conf αρχείο για να κάνετε την τιμή μόνιμη και να διασφαλίσετε ότι θα παραμείνει και μετά από επανεκκινήσεις. Ανοίξτε το αρχείο με το nano:

Στη συνέχεια, τροποποιήστε την τιμή εάν η γραμμή υπάρχει ή προσθέστε τη γραμμή στο τέλος του αρχείου, καθορίζοντας τη νέα τιμή:

Συμπέρασμα

Κατά την ανάπτυξη πολλαπλών υπηρεσιών σε κοντέινερ, θα επωφεληθείτε σημαντικά από το Kubernetes καθώς σας παρέχει ένα κεντρικό σημείο διαχείρισης. Για να διασφαλιστεί η συνδεσιμότητα μεταξύ των διαφόρων Kubernetes pods, σας δείξαμε μερικές εντολές επιθεώρησης δικτύου που μπορείτε να χρησιμοποιήσετε για την αντιμετώπιση τυχόν προβλημάτων στην υποδομή Kubernetes σας.

Για να μάθετε περισσότερα σχετικά με το Kubernetes, τα πλεονεκτήματά του, τη ρύθμιση και την ανάπτυξη εφαρμογών σε αυτό, ρίξτε μια ματιά στους διάφορους οδηγούς Kubernetes.

Καλή συνέχεια!

author

Pranay Kapgate

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.