Ανασκόπηση του Skaffold for Kubernetes ανάπτυξης

Ανασκόπηση του Skaffold for Kubernetes ανάπτυξης

Πριν από ενάμιση χρόνο, στις 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 να το εκκινήσει (παράδειγμα από τεκμηρίωση). Αυτό σας επιτρέπει να χρησιμοποιήσετε οποιονδήποτε συλλέκτη που μπορεί να κληθεί χρησιμοποιώντας ένα σενάριο.
  • Στο στάδιο της δοκιμής, τα ήδη αναφερθέντα δοχείο-δομή-δοκιμή;
  • Για την ανάπτυξη παρέχονται τα ακόλουθα:
    • Kubectl;
    • Τιμόνι;
    • προσαρμόστε.

Χάρη σε αυτό, το Skaffold μπορεί να ονομαστεί μοναδικό πλαίσιο για την κατασκευή CI/CD. Ακολουθεί ένα παράδειγμα ροής εργασίας κατά τη χρήση του (από την τεκμηρίωση του έργου):

Ανασκόπηση του Skaffold for Kubernetes ανάπτυξης

Πώς μοιάζει το έργο του Skaffold σε γενικές γραμμές;

  1. Το βοηθητικό πρόγραμμα παρακολουθεί τις αλλαγές στον κατάλογο πηγαίου κώδικα. Εάν γίνουν τροποποιήσεις στα αρχεία, συγχρονίζονται με την ομάδα εφαρμογών στο σύμπλεγμα Kubernetes. Εάν είναι δυνατόν, χωρίς να επανασυναρμολογήσετε την εικόνα. Διαφορετικά, συναρμολογείται μια νέα εικόνα.
  2. Η συναρμολογημένη εικόνα ελέγχεται χρησιμοποιώντας τη δοκιμή κοντέινερ-δομής, επισημαίνεται και αποστέλλεται στο Μητρώο Docker.
  3. Μετά από αυτό, η εικόνα αναπτύσσεται - αναπτύσσεται στο σύμπλεγμα Kubernetes.
  4. Εάν η εκκίνηση αρχικοποιήθηκε χρησιμοποιώντας την εντολή skaffold dev, τότε αρχίζουμε να λαμβάνουμε αρχεία καταγραφής από την εφαρμογή και ο Skaffold περιμένει τις αλλαγές για να επαναλάβει ξανά όλες τις ενέργειες.

Ανασκόπηση του Skaffold for Kubernetes ανάπτυξης
Απεικόνιση των κύριων σταδίων λειτουργίας Skaffold

Πρακτική. Δοκιμάζοντας το Skaffold

Για να δείξω τη χρήση του Skaffold, θα πάρω ένα παράδειγμα από Αποθετήριο έργου GitHub... Παρεμπιπτόντως, εκεί Μπορείτε να βρείτε πολλά άλλα παραδείγματα που λαμβάνουν υπόψη διάφορες ιδιαιτερότητες. Θα εκτελέσω όλες τις ενέργειες τοπικά στο Minikube. Η εγκατάσταση είναι απλή και διαρκεί λίγα λεπτά και θα χρειαστείτε kubectl για να ξεκινήσετε.

Εγκαταστήστε το Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

Ας κλωνοποιήσουμε το αποθετήριο του Skaffold με τα απαραίτητα παραδείγματα:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Επέλεξα ένα παράδειγμα με δύο λοβούς, το καθένα από τα οποία περιέχει μια μικρή εφαρμογή Go. Μια εφαρμογή είναι το frontend (leeroy-web), το οποίο ανακατευθύνει το αίτημα στη δεύτερη εφαρμογή - το backend (leeroy-app). Ας δούμε πώς μοιάζει:

~/skaffold/examples/microservices # tree
.
├── leeroy-app
│   ├── app.go
│   ├── Dockerfile
│   └── kubernetes
│       └── deployment.yaml
├── leeroy-web
│   ├── Dockerfile
│   ├── kubernetes
│   │   └── deployment.yaml
│   └── web.go
├── README.adoc
└── skaffold.yaml
 
4 directories, 8 files

Το 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.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

Όλα τα στάδια που αναφέρονται παραπάνω περιγράφονται εδώ. Εκτός από αυτήν τη διαμόρφωση, υπάρχει επίσης ένα αρχείο με καθολικές ρυθμίσεις - ~/.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 κατά την επανασυναρμολόγηση:

Ανασκόπηση του Skaffold for Kubernetes ανάπτυξης

Αρχικά, μπορείτε να δείτε ότι χρησιμοποιείται η προσωρινή μνήμη. Στη συνέχεια, η εφαρμογή συναρμολογείται, αναπτύσσεται και προωθούνται οι θύρες. Δεδομένου ότι ορίζεται --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 — γενικά, αυτή τη στιγμή υπάρχει κάθε λόγος να πιστεύουμε ότι το έργο θα εξελιχθεί αισίως.

PS

Διαβάστε επίσης στο blog μας:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο