Το AKS δεν μπορεί να κατεβάσει image από ιδιωτικό registry πίσω από το VPN
Το kubelet κατεβάζει μέσω του δικτύου του node, όχι μέσω του VPN του pod. Αποφασίστε από τις διαδρομές του node, το DNS του node, κάθε endpoint που αγγίζει η λήψη, και μετά TLS και ταυτότητα.
Ο φορητός σας κατεβάζει το 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, η λήψη αποτυγχάνει στη μέση.
| Condition | Typical symptom | Where to look |
|---|---|---|
| Node subnet has no route to the registry network | Timeout, no connection | Effective routes on the node NIC, gateway transit, return path on-premises |
| Node resolver cannot see the private zone | Name resolution failure in events | VNet DNS settings and the resolver the node actually uses |
| Only the manifest endpoint is reachable | Auth succeeds, layer download fails | Every hostname the registry hands out during the pull |
| TLS or identity is wrong | Certificate error, 401 or 403 | Server 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.