Πριν από ενάμιση χρόνο, στις 5 Μαρτίου 2018, η Google κυκλοφόρησε την πρώτη άλφα έκδοση του έργου ανοιχτού κώδικα για CI/CD που ονομάζεται Σκαλωσιά, στόχος της οποίας ήταν να δημιουργήσει «απλή και επαναλαμβανόμενη ανάπτυξη Kubernetes», έτσι ώστε οι προγραμματιστές να μπορούν να επικεντρωθούν στην ανάπτυξη και όχι στη διαχείριση. Τι μπορεί να είναι ενδιαφέρον για το Skaffold; Όπως αποδεικνύεται, έχει μερικά κόλπα στο μανίκι του που μπορούν να το κάνουν ένα ισχυρό εργαλείο για τον προγραμματιστή, και ίσως ακόμη και τον μηχανικό επιχειρήσεων. Ας γνωρίσουμε το έργο και τις δυνατότητές του.
NB: Παρεμπιπτόντως, έχουμε ήδη μιλήσει εν συντομία για το Skaffold στο γενικό μας ανασκόπηση των εργαλείων προγραμματιστών, του οποίου οι ζωές συνδέονται με τον Kubernetes.
Θεωρία. Σκοπός και δυνατότητες
Έτσι, σε γενικές γραμμές, το Skaffold λύνει το πρόβλημα της αυτοματοποίησης του κύκλου CI/CD (στα στάδια δημιουργίας, ώθησης, ανάπτυξης), προσφέροντας στον προγραμματιστή άμεση ανατροφοδότηση, π.χ. τη δυνατότητα γρήγορης λήψης του αποτελέσματος των επακόλουθων αλλαγών κώδικα - με τη μορφή μιας ενημερωμένης εφαρμογής που εκτελείται στο σύμπλεγμα Kubernetes. Και μπορεί να λειτουργήσει σε διαφορετικά κυκλώματα (dev, στάδιο, παραγωγή...), για τα οποία το Skaffold βοηθά στην περιγραφή των αντίστοιχων αγωγών για ανάπτυξη.
Ο πηγαίος κώδικας του Skaffold είναι γραμμένος στο Go, διανέμονται από υπό την δωρεάν άδεια Apache 2.0 (GitHub).
Ας δούμε τις κύριες λειτουργίες και χαρακτηριστικά. Τα πρώτα περιλαμβάνουν τα ακόλουθα:
Το Skaffold προσφέρει εργαλεία για τη δημιουργία αγωγών CI/CD.
Σας επιτρέπει να παρακολουθείτε τις αλλαγές στον πηγαίο κώδικα στο παρασκήνιο και να εκτελείτε μια αυτοματοποιημένη διαδικασία συναρμολόγησης κώδικα σε εικόνες κοντέινερ, δημοσιεύοντας αυτές τις εικόνες στο Μητρώο Docker και αναπτύσσοντάς τις στο σύμπλεγμα Kubernetes.
Συγχρονίζει τα αρχεία στο αποθετήριο με τον κατάλογο εργασίας στο κοντέινερ.
Διαβάζει τα αρχεία καταγραφής μιας εφαρμογής που εκτελείται σε ένα κοντέινερ.
Βοηθά στον εντοπισμό σφαλμάτων εφαρμογών γραμμένων σε Java, Node.js, Python, Go.
Τώρα σχετικά με τα χαρακτηριστικά:
Το ίδιο το Skaffold δεν έχει εξαρτήματα από την πλευρά του συμπλέγματος. Δηλαδή, δεν χρειάζεται να ρυθμίσετε περαιτέρω το Kubernetes για να χρησιμοποιήσετε αυτό το βοηθητικό πρόγραμμα.
Διαφορετικοί αγωγοί για την εφαρμογή σας. Χρειάζεται να διαθέσετε τον κώδικα στο τοπικό Minikube ενώ αναπτύσσετε και στη συνέχεια στη σκηνή ή την παραγωγή; Για το σκοπό αυτό υπάρχουν προφίλ και διαμορφώσεις χρήστη, μεταβλητές περιβάλλοντος και σημαίες, που σας επιτρέπουν να περιγράφετε διαφορετικούς αγωγούς για μία εφαρμογή.
CLI. Μόνο βοηθητικό πρόγραμμα κονσόλας και διαμορφώσεις στο YAML. Στο Διαδίκτυο μπορείτε να βρείτε αναφορές σε προσπάθειες δημιουργίας πειραματικό GUI, ωστόσο, αυτή τη στιγμή αυτό πιθανότατα σημαίνει απλώς ότι κάποιος τον χρειάζεται, αλλά όχι πραγματικά.
Αρθρωτότητα. Το Skaffold δεν είναι μια αυτόνομη θεριστική μηχανή, αλλά προσπαθεί να χρησιμοποιεί μεμονωμένες μονάδες ή υπάρχουσες λύσεις για συγκεκριμένες εργασίες.
Απεικόνιση του τελευταίου:
Στο στάδιο της συναρμολόγησης μπορείτε να χρησιμοποιήσετε:
docker build τοπικά, σε ένα σύμπλεγμα χρησιμοποιώντας kaniko ή στο Google Cloud Build.
Bazel τοπικά?
Jib Maven και Jib Gradle τοπικά ή στο Google Cloud Build.
τα προσαρμοσμένα σενάρια κατασκευής εκτελούνται τοπικά. Εάν πρέπει να εκτελέσετε μια άλλη (πιο ευέλικτη/οικείο/...) λύση κατασκευής, περιγράφεται στο σενάριο έτσι ώστε το Skaffold να το εκκινήσει (παράδειγμα από τεκμηρίωση). Αυτό σας επιτρέπει να χρησιμοποιήσετε οποιονδήποτε συλλέκτη που μπορεί να κληθεί χρησιμοποιώντας ένα σενάριο.
Χάρη σε αυτό, το Skaffold μπορεί να ονομαστεί μοναδικό πλαίσιο για την κατασκευή CI/CD. Ακολουθεί ένα παράδειγμα ροής εργασίας κατά τη χρήση του (από την τεκμηρίωση του έργου):
Πώς μοιάζει το έργο του Skaffold σε γενικές γραμμές;
Το βοηθητικό πρόγραμμα παρακολουθεί τις αλλαγές στον κατάλογο πηγαίου κώδικα. Εάν γίνουν τροποποιήσεις στα αρχεία, συγχρονίζονται με την ομάδα εφαρμογών στο σύμπλεγμα Kubernetes. Εάν είναι δυνατόν, χωρίς να επανασυναρμολογήσετε την εικόνα. Διαφορετικά, συναρμολογείται μια νέα εικόνα.
Η συναρμολογημένη εικόνα ελέγχεται χρησιμοποιώντας τη δοκιμή κοντέινερ-δομής, επισημαίνεται και αποστέλλεται στο Μητρώο Docker.
Μετά από αυτό, η εικόνα αναπτύσσεται - αναπτύσσεται στο σύμπλεγμα Kubernetes.
Εάν η εκκίνηση αρχικοποιήθηκε χρησιμοποιώντας την εντολή skaffold dev, τότε αρχίζουμε να λαμβάνουμε αρχεία καταγραφής από την εφαρμογή και ο Skaffold περιμένει τις αλλαγές για να επαναλάβει ξανά όλες τις ενέργειες.
Απεικόνιση των κύριων σταδίων λειτουργίας Skaffold
Πρακτική. Δοκιμάζοντας το Skaffold
Για να δείξω τη χρήση του Skaffold, θα πάρω ένα παράδειγμα από Αποθετήριο έργου GitHub... Παρεμπιπτόντως, εκεί Μπορείτε να βρείτε πολλά άλλα παραδείγματα που λαμβάνουν υπόψη διάφορες ιδιαιτερότητες. Θα εκτελέσω όλες τις ενέργειες τοπικά στο Minikube. Η εγκατάσταση είναι απλή και διαρκεί λίγα λεπτά και θα χρειαστείτε kubectl για να ξεκινήσετε.
Ας κλωνοποιήσουμε το αποθετήριο του Skaffold με τα απαραίτητα παραδείγματα:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Επέλεξα ένα παράδειγμα με δύο λοβούς, το καθένα από τα οποία περιέχει μια μικρή εφαρμογή Go. Μια εφαρμογή είναι το frontend (leeroy-web), το οποίο ανακατευθύνει το αίτημα στη δεύτερη εφαρμογή - το backend (leeroy-app). Ας δούμε πώς μοιάζει:
Το leeroy-app και το leeroy-web περιέχουν κώδικα Go και απλά Dockerfiles για τη δημιουργία αυτού του κώδικα τοπικά:
~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .
Δεν θα δώσω τον κωδικό της εφαρμογής - αρκεί να το γνωρίζουμε leeroy-web δέχεται αιτήματα και τα διαβιβάζει με πληρεξούσιο leeroy-app. Επομένως στα αρχεία Deployment.yaml υπάρχει υπηρεσία μόνο για app (για εσωτερική δρομολόγηση). Pod port web θα το προωθήσουμε στους εαυτούς μας για γρήγορη πρόσβαση στην εφαρμογή.
Όλα τα στάδια που αναφέρονται παραπάνω περιγράφονται εδώ. Εκτός από αυτήν τη διαμόρφωση, υπάρχει επίσης ένα αρχείο με καθολικές ρυθμίσεις - ~/.skaffold/config. Μπορεί να επεξεργαστεί χειροκίνητα ή μέσω του CLI - για παράδειγμα, ως εξής:
skaffold config set --global local-cluster true
Αυτή η εντολή θα ορίσει την καθολική μεταβλητή local-cluster σε νόημα true, μετά το οποίο ο Skaffold δεν θα προσπαθήσει να προωθήσει εικόνες στο απομακρυσμένο μητρώο. Εάν αναπτύσσετε τοπικά, μπορείτε να χρησιμοποιήσετε αυτήν την εντολή για να δημιουργήσετε εικόνες τοπικά.
Πίσω στο skaffold.yaml:
Στη σκηνή build διευκρινίζουμε ότι πρέπει να συλλέξετε και να αποθηκεύσετε την εικόνα τοπικά. Αφού τρέξει το build για πρώτη φορά, θα δούμε τα εξής:
// т.к. Minikube создает кластер в отдельной виртуальной машине,
// придется проникнуть внутрь, чтобы найти образы
# minikube ssh
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB
leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB
leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB
leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB
Όπως μπορείτε να δείτε, ο Skaffold έβαλε ετικέτα ο ίδιος στις εικόνες. Παρεμπιπτόντως, υποστηρίζονται πολλές πολιτικές προσθήκης ετικετών.
Περαιτέρω στο config υποδεικνύεται context: ./leeroy-app/, δηλ. καθορίζεται το πλαίσιο στο οποίο συλλέγεται η εικόνα.
Στο στάδιο της ανάπτυξης, καθορίζεται ότι θα χρησιμοποιήσουμε kubectl και μάσκα για τις απαραίτητες εκδηλώσεις.
PortForward: παρόμοιο με το πώς συνήθως προωθούμε τις θύρες χρησιμοποιώντας kubectl port-forward, δίνουμε οδηγίες στον Skaffold να καλέσει αυτήν την εντολή. Σε αυτήν την περίπτωση, η τοπική θύρα 9000 προωθείται στο 8080 στο Deployment με το όνομα leeroy-web.
Ήρθε η ώρα να ξεκινήσει skaffold dev: Η ομάδα θα δημιουργήσει έναν συνεχή «βρόχο ανάδρασης», π.χ. όχι μόνο θα συλλέξει τα πάντα και θα τα αναπτύξει στο σύμπλεγμα, αλλά θα σας ενημερώσει επίσης για την κατάσταση των λοβών αυτή τη στιγμή, θα παρακολουθεί τις αλλαγές και θα ενημερώνει την κατάσταση των λοβών.
Εδώ είναι το αποτέλεσμα εκκίνησης skaffold dev --port-forward κατά την επανασυναρμολόγηση:
Αρχικά, μπορείτε να δείτε ότι χρησιμοποιείται η προσωρινή μνήμη. Στη συνέχεια, η εφαρμογή συναρμολογείται, αναπτύσσεται και προωθούνται οι θύρες. Δεδομένου ότι ορίζεται --port-forward, ο Skaffold προώθησε το λιμάνι στο web, όπως του ζητήθηκε, αλλά εδώ app έριξε κατά την κρίση του (διάλεξε το πλησιέστερο ελεύθερο). Μετά από αυτό, λαμβάνουμε τα πρώτα αρχεία καταγραφής από τις εφαρμογές.
Ας ελέγξουμε αν λειτουργεί;
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!
Τροποποίηση του αρχείου leeroy-app/app.go - περνούν λίγα δευτερόλεπτα... και:
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!
Ταυτόχρονα, το ίδιο το Skaffold εμφάνισε το ίδιο πράγμα στην κονσόλα με πριν, με εξαίρεση ένα σημείο: κυκλοφόρησε μόνο leeroy-app, και όχι όλα ταυτόχρονα.
Περισσότερη εξάσκηση
Αξίζει επίσης να αναφέρουμε ότι κατά τη δημιουργία ενός νέου έργου, οι ρυθμίσεις παραμέτρων για το Skaffold μπορούν να εκκινηθούν χρησιμοποιώντας την εντολή init, που είναι πολύ βολικό. Επιπλέον, μπορείτε να γράψετε πολλές ρυθμίσεις παραμέτρων: να πραγματοποιήσετε την ανάπτυξη στην προεπιλεγμένη ρύθμιση παραμέτρων και, στη συνέχεια, να την ανοίξετε στο στάδιο με την εντολή run (ίδια διαδικασία με dev, απλώς δεν παρακολουθεί τις αλλαγές), χρησιμοποιώντας διαφορετική διαμόρφωση.
Στο katacoda υπάρχει οδηγός Είναι ακόμα πιο εύκολο με ένα παράδειγμα. Προσφέρει όμως έτοιμο sandbox με Kubernetes, εφαρμογή και Skaffold. Μια εξαιρετική επιλογή αν σας ενδιαφέρει να δοκιμάσετε μόνοι σας τα πολύ βασικά.
Μια πιθανή περίπτωση χρήσης του Skaffold είναι η διεξαγωγή ανάπτυξης σε ένα απομακρυσμένο σύμπλεγμα. Δεν αισθάνονται όλοι άνετα να τρέχουν το Minikube με το δικό τους υλικό, στη συνέχεια να ανοίγουν την εφαρμογή και να περιμένουν να λειτουργεί επαρκώς... Σε αυτήν την περίπτωση, το Skaffold λύνει τέλεια το πρόβλημα, κάτι που μπορεί να επιβεβαιωθεί, για παράδειγμα, από μηχανικούς του Reddit, όπως έχουμε έχει ήδη συζητηθεί писали στο blog μας.
Και σε αυτήν την έκδοση από την Weaveworks μπορείτε να βρείτε ένα παράδειγμα δημιουργίας αγωγού για παραγωγή.
Συμπέρασμα
Το Skaffold είναι ένα βολικό εργαλείο για την κατασκευή αγωγών που περιλαμβάνουν την ανάπτυξη εφαρμογών στο Kubernetes και επικεντρώνονται κυρίως στις ανάγκες ανάπτυξης. Διευκολύνει αρκετά τη δημιουργία μιας «σύντομης» διοχέτευσης που λαμβάνει υπόψη τις βασικές ανάγκες του προγραμματιστή, αλλά εάν το επιθυμείτε, μπορείτε να οργανώσετε μεγαλύτερες διαδικασίες. Ως ένα από τα ξεκάθαρα παραδείγματα χρήσης του Skaffold σε διαδικασίες CI/CD δίνεται τέτοιος δοκιμαστικό έργο 10 μικροϋπηρεσιών που χρησιμοποιούν τις δυνατότητες των Kubernetes, gRPC, Istio και OpenCensus Tracing.
Το Skaffold έχει ήδη σχεδόν 8000+ αστέρια στο GitHub, έχει αναπτυχθεί από την Google και αποτελεί μέρος του GoogleContainerTools — γενικά, αυτή τη στιγμή υπάρχει κάθε λόγος να πιστεύουμε ότι το έργο θα εξελιχθεί αισίως.