Ο φορητός σας κατεβάζει το image χωρίς πρόβλημα, αλλά το pod μένει σε ImagePullBackOff και κάποιος προτείνει να τρέξετε τον εταιρικό VPN client ως sidecar. Αυτό δεν θα βοηθήσει, γιατί η λήψη γίνεται πριν υπάρξει το container σας: το kubelet ζητά από το container runtime στο node να φέρει το image, και το runtime χρησιμοποιεί το network namespace του node. Ένα VPN μέσα στο workload δεν έχει διαδρομή να προσφέρει σε αυτή τη διαδρομή, και το δικό του βοηθητικό image πρέπει πρώτα να ληφθεί.

Η σειρά των ενεργειών καθορίζει το επίπεδο

Πρώτα έρχεται η επίλυση του ονόματος. Το kubelet, μέσω του runtime, επιλύει το όνομα του registry, συνδέεται, πιστοποιείται, κατεβάζει τα layers και μόνο τότε ξεκινά το container. Ό,τι κάνει το pod με ένα VPN συμβαίνει μετά από αυτή την ακολουθία, για αυτό ένα tunnel που δουλεύει στο cluster δεν είναι απόδειξη για τη λήψη.

Για αυτό ένα cached image είναι τόσο πειστικός ψεύτης. Ένα node που κατέβασε το image πριν εβδομάδες συνεχίζει να το σερβίρει, το deployment φαίνεται υγιές, και η αποτυχία εμφανίζεται μόνο όταν ο scheduler τοποθετήσει replica σε νεότερο node. Αν η χρονογραμμή γεγονότων περιέχει scale-up, αντικατάσταση node ή αναβάθμιση pool, θεωρήστε τα ως έναυσμα, όχι ως αιτία.

Τρεις συνθήκες καθορίζουν την επισκευή

Η προσβασιμότητα ιδιωτικού registry από managed node pool εξαρτάται από δρομολόγηση, επίλυση ονομάτων και το σύνολο των endpoint. Αν το subnet του node δεν δρομολογεί προς το δίκτυο του registry, κανένα credential δεν βοηθά. Αν δρομολογεί αλλά δεν επιλύει το όνομα μέσω της DNS διαδρομής του node, η σύνδεση δεν ξεκινά ποτέ. Αν και τα δύο δουλεύουν για το manifest endpoint αλλά όχι για το blob endpoint όπου ανακατευθύνει το registry, η λήψη αποτυγχάνει στη μέση.

ConditionTypical symptomWhere to look
Node subnet has no route to the registry networkTimeout, no connectionEffective routes on the node NIC, gateway transit, return path on-premises
Node resolver cannot see the private zoneName resolution failure in eventsVNet DNS settings and the resolver the node actually uses
Only the manifest endpoint is reachableAuth succeeds, layer download failsEvery hostname the registry hands out during the pull
TLS or identity is wrongCertificate error, 401 or 403Server certificate name and trust, scoped pull identity

Το VNet peering μόνο δεν δίνει αυτόματα κάθε διάταξη gateway transit, και μια διαδρομή προς μία κατεύθυνση δεν είναι διαδρομή που δουλεύει. Το node χρειάζεται υποστηριζόμενη διαδρομή μέσω του προβλεπόμενου VPN gateway ή εγκεκριμένης συσκευής, και η πλευρά του registry χρειάζεται διαδρομή επιστροφής προς το subnet του node.

Διαβάστε την αποτυχία πριν επιλέξετε διόρθωση

Ξεκινήστε από τα events του pod και το node όπου προσγειώθηκε, με τα πραγματικά σας ονόματα: kubectl describe pod app-example -n team-example και kubectl get pod app-example -n team-example -o wide. Το κείμενο του event ξεχωρίζει ένα hostname που δεν επιλύθηκε από timeout, μια απόρριψη πιστοποιητικού από ένα απόν image, και μια αποτυχία εξουσιοδότησης από όλα τα άλλα. Αυτά τα τέσσερα έχουν τέσσερις διαφορετικούς ιδιοκτήτες.

Η πιστοποίηση είναι ο πιο υπερεκτιμημένος μοχλός. Το imagePullSecret δίνει στο runtime credentials για το registry· δεν εγκαθιστά διαδρομή, δεν αλλάζει τον resolver του node και δεν κάνει έγκυρο ένα μη αξιόπιστο πιστοποιητικό. Αν το event λέει ότι η λήψη δεν ήταν εξουσιοδοτημένη, δείτε το εύρος της ταυτότητας. Αν λέει ότι η σύνδεση έληξε, τα credentials είναι άσχετα.

Η τεκμηρίωση του Kubernetes για τα images είναι η αναφορά για τη συμπεριφορά λήψης και τα credentials ιδιωτικών registry, και αξίζει μια ανάγνωση πριν αλλάξετε δίκτυο, γιατί κάνει σαφές το όριο μεταξύ πιστοποίησης και μεταφοράς.

Χτίστε τη διαδρομή κάτω από το pod

Δουλέψτε με αυτή τη σειρά, γιατί κάθε βήμα είναι άσκοπο μέχρι να ισχύσει το προηγούμενο. Δρομολογήστε πρώτα το δίκτυο του node: επιβεβαιώστε ότι το subnet έχει υποστηριζόμενη διαδρομή προς το δίκτυο του registry, ελέγξτε τις ενεργές διαδρομές στο node, τους κανόνες ασφαλείας στα δύο άκρα και τη διαδρομή επιστροφής στην πλευρά του registry.

Έπειτα επιλύστε το όνομα από το πλαίσιο του node. Ο resolver του node δεν είναι η DNS ρύθμιση του pod, και η επιτυχία μέσα σε pod δεν είναι απόδειξη για το host runtime. Χρησιμοποιήστε managed ιδιωτικό DNS αντί για μόνιμη εγγραφή στο hosts· η εγγραφή ζει μέχρι την αντικατάσταση του node και μετά εξαφανίζεται σιωπηλά.

Έπειτα αποδείξτε κάθε endpoint. Ένα registry μπορεί να δώσει στον client ξεχωριστή υπηρεσία πιστοποίησης και ξεχωριστό χώρο αποθήκευσης blob. Το να φτάσετε στο manifest endpoint δεν αποδεικνύει σχεδόν τίποτα για τα layers. Τέλος ολοκληρώστε TLS και εξουσιοδότηση: πιστοποιητικό έγκυρο για το όνομα του registry και έμπιστο μέσω υποστηριζόμενης ρύθμισης node, μαζί με ταυτότητα λήψης περιορισμένη στην ανάγνωση αυτού του repository.

Επαληθεύστε το σε node που δεν επισκευάσατε με το χέρι

Το τεστ που μετρά είναι μια νέα λήψη και πλήρης κατέβασμα όλων των layers σε κατάλληλο node, ιδανικά ένα που δημιουργήθηκε από scale ή αντικατάσταση. Αυτό καλύπτει όλα τα pool που θα μπορούσαν να τοποθετήσουν το workload, μαζί με όσα ξεχάσατε. Μια χειροκίνητη διόρθωση σε ένα node δεν είναι μοντέλο ανάπτυξης, και το επόμενο autoscale γεγονός θα βρει το κενό.

Η αναδημιουργία του cluster σε άλλο VNet μπορεί να αλλάξει τη διαδρομή, αλλά είναι η τελευταία λύση και όχι το πρώτο διαγνωστικό βήμα. Συγκρίνετε το υπάρχον δίκτυο node με την απαιτούμενη ιδιωτική διαδρομή και τους υποστηριζόμενους ελέγχους δικτύου του AKS πριν προτείνετε μετάβαση, και κρατήστε τη συνδεσιμότητα της εφαρμογής μετά την εκκίνηση ως ξεχωριστή επαλήθευση: το pod που μιλά στο backend του είναι άλλος έλεγχος από το node που κατεβάζει το image.

Σχετικά άρθρα