Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers

Κατόπιν αιτήματός μας, η Habr δημιούργησε έναν κόμβο Kubernetes και είμαστε στην ευχάριστη θέση να τοποθετήσουμε την πρώτη δημοσίευση σε αυτό. Εγγραφείτε!

Το Kubernetes είναι εύκολο. Γιατί οι τράπεζες με πληρώνουν πολλά χρήματα για να δουλέψω σε αυτόν τον τομέα, ενώ ο καθένας μπορεί να κατακτήσει αυτήν την τεχνολογία μέσα σε λίγες μόνο ώρες;

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers

Αν αμφιβάλλετε ότι το Kubernetes μπορεί να μάθει τόσο γρήγορα, σας προτείνω να προσπαθήσετε να το κάνετε μόνοι σας. Δηλαδή, έχοντας κατακτήσει αυτό το υλικό, θα μπορείτε να εκτελέσετε μια εφαρμογή που βασίζεται σε μικροϋπηρεσίες σε ένα σύμπλεγμα Kubernetes. Μπορώ να το εγγυηθώ, γιατί με την ίδια μεθοδολογία που χρησιμοποιώ εδώ διδάσκω στους πελάτες μας πώς να δουλεύουν με την Kubernetes. Τι κάνει αυτόν τον οδηγό διαφορετικό από άλλους; Στην πραγματικότητα, πολλά πράγματα. Έτσι, τα περισσότερα από αυτά τα υλικά ξεκινούν με μια εξήγηση απλών πραγμάτων - τις έννοιες του Kubernetes και τα χαρακτηριστικά της εντολής kubectl. Οι συντάκτες αυτών των άρθρων υποθέτουν ότι ο αναγνώστης τους είναι εξοικειωμένος με την ανάπτυξη εφαρμογών, τις μικροϋπηρεσίες και τα δοχεία Docker. Θα πάμε από την άλλη πλευρά. Αρχικά, ας μιλήσουμε για τον τρόπο εκτέλεσης μιας εφαρμογής που βασίζεται σε microservices σε έναν υπολογιστή. Στη συνέχεια, θα εξετάσουμε την κατασκευή εικόνων κοντέινερ για κάθε microservice. Και μετά από αυτό, θα εξοικειωθούμε με το Kubernetes και θα αναλύσουμε την ανάπτυξη μιας εφαρμογής που βασίζεται σε microservices σε ένα σύμπλεγμα που διαχειρίζεται η Kubernetes.

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

Τώρα, χωρίς άλλη καθυστέρηση, ας πιάσουμε τη δουλειά και ας μιλήσουμε για την εφαρμογή με την οποία θα εργαστούμε.

Πειραματική εφαρμογή

Η εφαρμογή μας θα εκτελεί μόνο μία λειτουργία. Λαμβάνει, ως εισαγωγή, μία πρόταση, μετά την οποία, χρησιμοποιώντας εργαλεία ανάλυσης κειμένου, εκτελεί μια ανάλυση συναισθήματος αυτής της πρότασης, λαμβάνοντας μια αξιολόγηση της συναισθηματικής στάσης του συγγραφέα της πρότασης σε ένα συγκεκριμένο αντικείμενο.

Αυτό είναι το κύριο παράθυρο αυτής της εφαρμογής.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Εφαρμογή Web Analysis Sentiment

Από τεχνική άποψη, η εφαρμογή αποτελείται από τρεις μικροϋπηρεσίες, καθεμία από τις οποίες επιλύει ένα συγκεκριμένο σύνολο εργασιών:

  • Το SA-Frontend είναι ένας διακομιστής ιστού Nginx που εξυπηρετεί στατικά αρχεία React.
  • Το SA-WebApp είναι μια εφαρμογή Ιστού γραμμένη σε Java που χειρίζεται αιτήματα από το frontend.
  • Το SA-Logic είναι μια εφαρμογή Python που εκτελεί ανάλυση συναισθήματος κειμένου.

Είναι σημαντικό να σημειωθεί ότι οι μικροϋπηρεσίες δεν υπάρχουν μεμονωμένα. Υλοποιούν την ιδέα του «διαχωρισμού των καθηκόντων», αλλά, ταυτόχρονα, πρέπει να αλληλεπιδρούν μεταξύ τους.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Ροές δεδομένων στην εφαρμογή

Στο παραπάνω διάγραμμα, μπορείτε να δείτε τα αριθμημένα στάδια του συστήματος, που απεικονίζουν τις ροές δεδομένων στην εφαρμογή. Ας τα αναλύσουμε:

  1. Το πρόγραμμα περιήγησης ζητά ένα αρχείο από τον διακομιστή index.html (το οποίο με τη σειρά του φορτώνει το πακέτο εφαρμογής React).
  2. Ο χρήστης αλληλεπιδρά με την εφαρμογή, αυτό προκαλεί μια κλήση σε μια εφαρμογή web που βασίζεται στο Spring.
  3. Η εφαρμογή Ιστού προωθεί το αίτημα για ανάλυση του κειμένου στην εφαρμογή Python.
  4. Η εφαρμογή Python αναλύει το συναίσθημα του κειμένου και επιστρέφει το αποτέλεσμα ως απάντηση στο αίτημα.
  5. Η εφαρμογή Spring στέλνει μια απάντηση στην εφαρμογή React (η οποία, με τη σειρά της, δείχνει το αποτέλεσμα του αναλυμένου κειμένου στον χρήστη).

Μπορείτε να βρείτε τον κωδικό για όλες αυτές τις εφαρμογές εδώ. Σας συνιστώ να αντιγράψετε αυτό το αποθετήριο στον εαυτό σας αυτή τη στιγμή, καθώς υπάρχουν πολλά ενδιαφέροντα πειράματα με αυτό μπροστά μας.

Εκτέλεση μιας εφαρμογής που βασίζεται σε microservices στο τοπικό μηχάνημα

Για να λειτουργήσει η εφαρμογή, πρέπει να ξεκινήσουμε και τις τρεις microservices. Ας ξεκινήσουμε με τα πιο όμορφα από αυτά - την εφαρμογή front-end.

▍Ρύθμιση του React για τοπική ανάπτυξη

Για να εκτελέσετε μια εφαρμογή React, πρέπει να εγκαταστήσετε το πλαίσιο Node.js και το NPM στον υπολογιστή σας. Αφού εγκαταστήσετε όλα αυτά, μεταβείτε χρησιμοποιώντας το τερματικό στο φάκελο του έργου sa-frontend και εκτελέστε την ακόλουθη εντολή:

npm install

Εκτελώντας αυτήν την εντολή στον φάκελο node_modules θα φορτωθούν οι εξαρτήσεις της εφαρμογής React, οι εγγραφές της οποίας βρίσκονται στο αρχείο package.json. Αφού κάνετε λήψη των εξαρτήσεων στον ίδιο φάκελο, εκτελέστε την ακόλουθη εντολή:

npm start

Αυτό είναι όλο. Η εφαρμογή React εκτελείται τώρα και είναι προσβάσιμη με πλοήγηση στη διεύθυνση του προγράμματος περιήγησης localhost:3000. Μπορείτε να αλλάξετε κάτι στον κωδικό του. Θα δείτε αμέσως το αποτέλεσμα αυτών των αλλαγών στο πρόγραμμα περιήγησης. Αυτό είναι δυνατό χάρη στη λεγόμενη "καυτή" αντικατάσταση μονάδων. Χάρη σε αυτό, η ανάπτυξη front-end μετατρέπεται σε μια απλή και ευχάριστη εμπειρία.

▍Προετοιμασία εφαρμογής React για παραγωγή

Για τους σκοπούς της πραγματικής χρήσης μιας εφαρμογής React, πρέπει να τη μετατρέψουμε σε ένα σύνολο στατικών αρχείων και να τα προβάλουμε σε πελάτες χρησιμοποιώντας έναν διακομιστή ιστού.

Για να δημιουργήσετε την εφαρμογή React, χρησιμοποιώντας ξανά το τερματικό, μεταβείτε στον φάκελο sa-frontend και εκτελέστε την ακόλουθη εντολή:

npm run build

Αυτό θα δημιουργήσει έναν κατάλογο στο φάκελο του έργου build. Θα περιέχει όλα τα στατικά αρχεία που απαιτούνται για να λειτουργήσει η εφαρμογή React.

▍ Εξυπηρέτηση στατικών αρχείων με το Nginx

Πρώτα πρέπει να εγκαταστήσετε και να εκτελέσετε τον διακομιστή ιστού Nginx. Εδώ μπορείτε να το κατεβάσετε και να βρείτε οδηγίες για την εγκατάσταση και την εκτέλεση του. Στη συνέχεια, πρέπει να αντιγράψετε τα περιεχόμενα του φακέλου sa-frontend/build σε ένα φάκελο [your_nginx_installation_dir]/html.

Με αυτήν την προσέγγιση, το αρχείο δημιουργήθηκε κατά τη συναρμολόγηση της εφαρμογής React index.html θα είναι διαθέσιμο στο [your_nginx_installation_dir]/html/index.html. Αυτό είναι το αρχείο που, από προεπιλογή, ο διακομιστής Nginx εκδίδει κατά την πρόσβαση σε αυτό. Ο διακομιστής έχει ρυθμιστεί για ακρόαση σε μια θύρα 80, αλλά μπορείτε να το προσαρμόσετε με τον τρόπο που θέλετε επεξεργάζοντας το αρχείο [your_nginx_installation_dir]/conf/nginx.conf.

Τώρα ανοίξτε το πρόγραμμα περιήγησής σας και μεταβείτε στο localhost:80. Θα δείτε τη σελίδα της εφαρμογής React.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Η εφαρμογή React που εξυπηρετείται από τον διακομιστή Nginx

Αν τώρα εισάγετε κάτι στο πεδίο Type your sentence και πατήστε το κουμπί Send - τίποτα δε θα συμβεί. Αλλά, αν κοιτάξετε την κονσόλα, μπορείτε να δείτε μηνύματα σφάλματος εκεί. Για να κατανοήσουμε ακριβώς πού συμβαίνουν αυτά τα σφάλματα, ας αναλύσουμε τον κώδικα της εφαρμογής.

▍Ανάλυση του κωδικού της εφαρμογής front-end

Κοιτάζοντας τον κωδικό του αρχείου App.js, μπορούμε να το δούμε κάνοντας κλικ στο κουμπί Send καλεί μια μέθοδο analyzeSentence(). Ο κώδικας αυτής της μεθόδου φαίνεται παρακάτω. Προσέξτε παράλληλα ότι για κάθε γραμμή στην οποία υπάρχει σχόλιο της φόρμας # Номер, υπάρχει μια εξήγηση που δίνεται κάτω από τον κώδικα. Με τον ίδιο τρόπο, θα αναλύσουμε άλλα τμήματα κώδικα.

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. Η διεύθυνση URL στην οποία υποβάλλεται το αίτημα POST. Αυτή η διεύθυνση θεωρείται ότι είναι μια εφαρμογή που περιμένει τέτοια αιτήματα.

2.Ο φορέας αιτήματος που αποστέλλεται στην αίτηση. Ακολουθεί ένα παράδειγμα σώματος αιτήματος:

{
    sentence: "I like yogobella!"
}

3.Όταν λαμβάνεται μια απάντηση σε ένα αίτημα, ενημερώνεται η κατάσταση του στοιχείου. Αυτό προκαλεί την εκ νέου απόδοση του στοιχείου. Εάν λάβουμε δεδομένα (δηλαδή, ένα αντικείμενο JSON που περιέχει τα δεδομένα που έχουν εισαχθεί και την υπολογισμένη βαθμολογία κειμένου), θα εξάγουμε το στοιχείο Polarityεφόσον πληρούνται οι προϋποθέσεις. Δείτε πώς περιγράφουμε το στοιχείο:

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

Ο κώδικας φαίνεται να λειτουργεί αρκετά καλά. Τι φταίει εδώ, τέλος πάντων; Εάν υποθέσετε ότι στη διεύθυνση στην οποία η εφαρμογή προσπαθεί να στείλει ένα αίτημα POST, δεν υπάρχει ακόμη τίποτα που να μπορεί να αποδεχτεί και να επεξεργαστεί αυτό το αίτημα, τότε θα έχετε απόλυτο δίκιο. Δηλαδή, για την επεξεργασία αιτημάτων που έρχονται στη διεύθυνση http://localhost:8080/sentiment, πρέπει να τρέξουμε μια web εφαρμογή βασισμένη στο Spring.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Χρειαζόμαστε μια εφαρμογή Spring που μπορεί να δεχτεί ένα αίτημα POST

▍Ρύθμιση μιας διαδικτυακής εφαρμογής βασισμένης στο Spring

Για να αναπτύξετε μια εφαρμογή Spring, χρειάζεστε JDK8 και Maven και σωστά διαμορφωμένες μεταβλητές περιβάλλοντος. Αφού εγκαταστήσετε όλα αυτά, μπορείτε να συνεχίσετε να εργάζεστε στο έργο μας.

▍Συσκευασία της εφαρμογής σε αρχείο jar

Πλοηγηθείτε, χρησιμοποιώντας το τερματικό, στον φάκελο sa-webapp και εισάγετε την ακόλουθη εντολή:

mvn install

Μετά την εκτέλεση αυτής της εντολής στο φάκελο sa-webapp θα δημιουργηθεί κατάλογος target. Εδώ θα βρίσκεται η εφαρμογή Java, συσκευασμένη σε ένα αρχείο jar, που αντιπροσωπεύεται από το αρχείο sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Εκκίνηση εφαρμογής Java

Μεταβείτε στο φάκελο target και εκτελέστε την εφαρμογή με την ακόλουθη εντολή:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

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

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

Για εμάς το πιο σημαντικό εδώ είναι η αναφορά της αδυναμίας διευκρίνισης του νοήματος sa.logic.api.url. Ας αναλύσουμε τον κώδικα όπου παρουσιάζεται το σφάλμα.

▍Ανάλυση κώδικα εφαρμογής Java

Εδώ είναι το απόσπασμα κώδικα όπου παρουσιάζεται το σφάλμα.

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. Στο ΣentimentController υπάρχει ένα χωράφι saLogicApiUrl. Η αξία του ορίζεται από το ακίνητο sa.logic.api.url.
  2. Σειρά saLogicApiUrl συνενώνεται με την αξία /analyse/sentiment. Μαζί σχηματίζουν μια διεύθυνση για την πραγματοποίηση κλήσης στη μικρουπηρεσία που εκτελεί την ανάλυση κειμένου.

▍Ορισμός τιμής ιδιότητας

Την Άνοιξη, η προεπιλεγμένη πηγή τιμών ιδιοτήτων είναι ένα αρχείο application.properties, το οποίο μπορείτε να βρείτε στο sa-webapp/src/main/resources. Αλλά η χρήση του δεν είναι ο μόνος τρόπος για να ορίσετε τιμές ιδιοτήτων. Μπορείτε επίσης να το κάνετε αυτό με την ακόλουθη εντολή:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

Η τιμή αυτής της ιδιότητας θα πρέπει να δείχνει τη διεύθυνση της εφαρμογής Python μας.

Ρυθμίζοντάς το, λέμε στην εφαρμογή Ιστού Spring πού πρέπει να πάει για να κάνει αιτήματα ανάλυσης κειμένου.

Για να μην περιπλέκουμε τη ζωή μας, θα αποφασίσουμε ότι η εφαρμογή Python θα είναι διαθέσιμη στο localhost:5000 και προσπαθήστε να μην το ξεχάσετε. Ως αποτέλεσμα, η εντολή για την έναρξη της εφαρμογής Spring θα μοιάζει με αυτό:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Το σύστημά μας λείπει μια εφαρμογή Python

Τώρα πρέπει απλώς να τρέξουμε την εφαρμογή Python και το σύστημα θα λειτουργήσει όπως αναμένεται.

▍Ρύθμιση εφαρμογής Python

Για να εκτελέσετε μια εφαρμογή Python, πρέπει να έχετε εγκαταστήσει τα Python 3 και Pip και πρέπει να έχετε ρυθμίσει σωστά τις κατάλληλες μεταβλητές περιβάλλοντος.

▍Εγκαταστήστε εξαρτήσεις

Μεταβείτε στο φάκελο του έργου sa-logic/sa και εκτελέστε τις παρακάτω εντολές:

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍Εκκίνηση εφαρμογής

Με εγκατεστημένες τις εξαρτήσεις, είμαστε έτοιμοι να εκτελέσουμε την εφαρμογή:

python sentiment_analysis.py

Μετά την εκτέλεση αυτής της εντολής, θα μας πουν τα εξής:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Αυτό σημαίνει ότι η εφαρμογή εκτελείται και περιμένει αιτήματα στο localhost:5000/

▍Έρευνα κώδικα

Ας δούμε τον κώδικα της εφαρμογής Python για να κατανοήσουμε πώς ανταποκρίνεται σε αιτήματα:

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                                   #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                     #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. Αρχικοποίηση αντικειμένου Flask.
  2. Καθορισμός της διεύθυνσης για την υποβολή αιτημάτων POST σε αυτό.
  3. Ανάκτηση ακινήτου sentence από το όργανο αιτήματος.
  4. Ανώνυμη προετοιμασία αντικειμένου TextBlob και να πάρει την αξία polarity για την πρώτη πρόταση που ελήφθη στο σώμα του αιτήματος (στην περίπτωσή μας αυτή είναι η μόνη πρόταση που υποβάλλεται προς ανάλυση).
  5. Επιστρέφοντας μια απάντηση, το σώμα της οποίας περιέχει το κείμενο της προσφοράς και τον δείκτη που υπολογίστηκε για αυτήν polarity.
  6. Εκκίνηση της εφαρμογής Flask, η οποία θα είναι διαθέσιμη στη διεύθυνση 0.0.0.0:5000 (μπορείτε επίσης να έχετε πρόσβαση χρησιμοποιώντας μια κατασκευή της φόρμας localhost:5000).

Τώρα εκτελούνται οι μικροϋπηρεσίες που απαρτίζουν την εφαρμογή. Είναι έτοιμοι να αλληλεπιδρούν μεταξύ τους. Εδώ είναι πώς φαίνεται το διάγραμμα εφαρμογής σε αυτό το στάδιο της εργασίας.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Όλες οι μικροϋπηρεσίες που απαρτίζουν την εφαρμογή φέρονται σε υγιή κατάσταση

Τώρα, προτού συνεχίσουμε, ανοίξτε την εφαρμογή React σε ένα πρόγραμμα περιήγησης και προσπαθήστε να αναλύσετε κάποια πρόταση με αυτήν. Εάν όλα γίνονται σωστά - αφού πατήσετε το κουμπί Send θα δείτε τα αποτελέσματα της ανάλυσης κάτω από το πλαίσιο κειμένου.

Στην επόμενη ενότητα, θα μιλήσουμε για τον τρόπο λειτουργίας των μικροϋπηρεσιών μας σε δοχεία Docker. Αυτό είναι απαραίτητο για την προετοιμασία της εφαρμογής για εκτέλεση στο σύμπλεγμα Kubernetes.

Εμπορευματοκιβώτια Docker

Kubernetes είναι ένα σύστημα για την αυτοματοποίηση της ανάπτυξης, της κλιμάκωσης και της διαχείρισης εφαρμογών με εμπορευματοκιβώτια. Ονομάζεται και «ενορχηστρωτής κοντέινερ». Εάν το Kubernetes λειτουργεί με κοντέινερ, τότε πριν χρησιμοποιήσουμε αυτό το σύστημα, πρέπει πρώτα να αποκτήσουμε αυτά τα δοχεία. Αλλά πρώτα, ας μιλήσουμε για το τι είναι τα δοχεία. Ίσως η καλύτερη απάντηση στο ερώτημα τι είναι μπορεί να βρεθεί τεκμηρίωση προς Docker:

Μια εικόνα κοντέινερ είναι ένα ελαφρύ, αυτόνομο, εκτελέσιμο πακέτο που περιέχει μια εφαρμογή, η οποία περιλαμβάνει όλα τα απαραίτητα για την εκτέλεσή της: κώδικα εφαρμογής, περιβάλλον χρόνου εκτέλεσης, εργαλεία και βιβλιοθήκες συστήματος, ρυθμίσεις. Τα προγράμματα κοντέινερ μπορούν να χρησιμοποιηθούν τόσο σε περιβάλλοντα Linux όσο και σε περιβάλλον Windows και θα λειτουργούν πάντα το ίδιο ανεξάρτητα από την υποδομή.

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

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

▍Εξυπηρέτηση στατικών αρχείων μιας εφαρμογής React με χρήση εικονικής μηχανής

Προσπαθώντας να οργανώσουμε τη συντήρηση στατικών αρχείων χρησιμοποιώντας εικονικές μηχανές, θα αντιμετωπίσουμε τα ακόλουθα μειονεκτήματα:

  1. Αναποτελεσματική χρήση πόρων, αφού κάθε εικονική μηχανή είναι ένα πλήρες λειτουργικό σύστημα.
  2. Εξάρτηση από την πλατφόρμα. Αυτό που λειτουργεί σε κάποιο τοπικό υπολογιστή μπορεί κάλλιστα να μην λειτουργεί σε διακομιστή παραγωγής.
  3. Αργή και εντατική κλίμακα πόρων μιας λύσης εικονικής μηχανής.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Διακομιστής Ιστού Nginx που εξυπηρετεί στατικά αρχεία που εκτελούνται σε εικονική μηχανή

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

  1. Αποτελεσματική χρήση πόρων: εργαστείτε με το λειτουργικό σύστημα χρησιμοποιώντας το Docker.
  2. Ανεξαρτησία πλατφόρμας. Ένα κοντέινερ που μπορεί να τρέξει ένας προγραμματιστής στον δικό του υπολογιστή θα τρέχει οπουδήποτε.
  3. Ελαφριά ανάπτυξη μέσω της χρήσης στρωμάτων εικόνας.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Διακομιστής Ιστού Nginx που εξυπηρετεί στατικά αρχεία που εκτελούνται σε ένα κοντέινερ

Συγκρίναμε εικονικές μηχανές και κοντέινερ μόνο σε μερικά σημεία, αλλά ακόμα και αυτό είναι αρκετό για να πάρετε μια αίσθηση για τα δυνατά σημεία των κοντέινερ. Εδώ Μπορείτε να βρείτε λεπτομέρειες σχετικά με τα κοντέινερ Docker.

▍Δημιουργία εικόνας κοντέινερ για μια εφαρμογή React

Το βασικό δομικό στοιχείο ενός κοντέινερ Docker είναι το αρχείο Dockerfile. Στην αρχή αυτού του αρχείου, καταγράφεται μια βασική εικόνα του κοντέινερ και, στη συνέχεια, περιλαμβάνεται μια ακολουθία οδηγιών που υποδεικνύουν πώς να δημιουργήσετε ένα κοντέινερ που θα καλύπτει τις ανάγκες μιας εφαρμογής.

Πριν ξεκινήσουμε να δουλεύουμε με το αρχείο Dockerfile, θυμηθείτε τι κάναμε για να προετοιμάσουμε τα αρχεία της εφαρμογής React για μεταφόρτωση στον διακομιστή Nginx:

  1. Δημιουργία πακέτου εφαρμογής React (npm run build).
  2. Εκκίνηση του διακομιστή Nginx.
  3. Αντιγραφή των περιεχομένων ενός καταλόγου build από το φάκελο του έργου sa-frontend στον φάκελο διακομιστή nginx/html.

Παρακάτω μπορείτε να δείτε τους παραλληλισμούς μεταξύ της δημιουργίας ενός κοντέινερ και των παραπάνω ενεργειών που εκτελούνται στον τοπικό υπολογιστή.

▍Προετοιμασία ενός αρχείου Docker για την εφαρμογή SA-Frontend

Οδηγίες που πρέπει να περιλαμβάνονται Dockerfile για εφαρμογή SA-Frontend, αποτελούνται μόνο από δύο ομάδες. Το γεγονός είναι ότι η ομάδα ανάπτυξης Nginx έχει προετοιμάσει ένα βασικό εικόνα για το Nginx, το οποίο θα χρησιμοποιήσουμε για να δημιουργήσουμε την εικόνα μας. Εδώ είναι τα δύο βήματα που πρέπει να περιγράψουμε:

  1. Πρέπει να κάνετε την εικόνα Nginx τη βάση της εικόνας.
  2. Περιεχόμενο φακέλου sa-frontend/build πρέπει να αντιγράψετε στο φάκελο εικόνας nginx/html.

Αν πάμε από αυτή την περιγραφή στο αρχείο Dockerfile, τότε θα μοιάζει με αυτό:

FROM nginx
COPY build /usr/share/nginx/html

Όπως μπορείτε να δείτε, όλα εδώ είναι πολύ απλά, ενώ τα περιεχόμενα του αρχείου αποδεικνύονται ακόμη και αρκετά ευανάγνωστα και κατανοητά. Αυτό το αρχείο λέει στο σύστημα να τραβήξει την εικόνα nginx με όλα όσα έχει ήδη και αντιγράψτε τα περιεχόμενα του καταλόγου build στον κατάλογο nginx/html.

Εδώ μπορεί να έχετε μια ερώτηση σχετικά με το πώς ξέρω πού ακριβώς να αντιγράψω τα αρχεία από το φάκελο build, δηλ. από πού ήρθε το μονοπάτι /usr/share/nginx/html. Στην πραγματικότητα, δεν υπάρχει τίποτα περίπλοκο και εδώ. Γεγονός είναι ότι οι σχετικές πληροφορίες βρίσκονται στο περιγραφή εικόνα.

▍Συναρμολόγηση της εικόνας και αποστολή της στο αποθετήριο

Για να μπορέσουμε να εργαστούμε με μια ολοκληρωμένη εικόνα, πρέπει να την υποβάλουμε στο αποθετήριο εικόνων. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τη δωρεάν πλατφόρμα φιλοξενίας εικόνας Docker Hub που βασίζεται σε σύννεφο. Σε αυτό το στάδιο της εργασίας, πρέπει να κάνετε τα εξής:

  1. Εγκαθιστώ Λιμενεργάτης.
  2. Εγγραφείτε στον ιστότοπο του Docker Hub.
  3. Συνδεθείτε στον λογαριασμό σας εκτελώντας την ακόλουθη εντολή στο τερματικό:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Τώρα πρέπει, χρησιμοποιώντας το τερματικό, να μεταβείτε στον κατάλογο sa-frontend και εκτελέστε την ακόλουθη εντολή εκεί:

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

Εδώ και παρακάτω σε παρόμοιες εντολές $DOCKER_USER_ID θα πρέπει να αντικατασταθεί με το όνομα χρήστη σας στο Docker Hub. Για παράδειγμα, αυτό το μέρος της εντολής μπορεί να μοιάζει με αυτό: rinormaloku/sentiment-analysis-frontend.

Σε αυτήν την περίπτωση, αυτή η εντολή μπορεί να συντομευτεί αφαιρώντας από αυτήν -f Dockerfile, αφού ο φάκελος στον οποίο εκτελούμε αυτήν την εντολή έχει ήδη αυτό το αρχείο.

Για να στείλουμε την ολοκληρωμένη εικόνα στο αποθετήριο, χρειαζόμαστε την ακόλουθη εντολή:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Αφού το ολοκληρώσετε, ελέγξτε τη λίστα των αποθετηρίων στο Docker Hub για να δείτε εάν η εικόνα μεταφέρθηκε με επιτυχία στο χώρο αποθήκευσης cloud.

▍Εκκίνηση ενός δοχείου

Τώρα οποιοσδήποτε μπορεί να κατεβάσει και να εκτελέσει την εικόνα που είναι γνωστή ως $DOCKER_USER_ID/sentiment-analysis-frontend. Για να το κάνετε αυτό, πρέπει να εκτελέσετε την ακόλουθη σειρά εντολών:

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Τώρα το κοντέινερ εκτελείται και μπορούμε να συνεχίσουμε να εργαζόμαστε δημιουργώντας άλλες εικόνες που χρειαζόμαστε. Αλλά πριν συνεχίσουμε, ας καταλάβουμε το σχέδιο 80:80, το οποίο βρίσκεται στην εντολή εκτέλεσης της εικόνας και μπορεί να φαίνεται μπερδεμένο.

  • Πρώτος αριθμός 80 είναι ο αριθμός θύρας του κεντρικού υπολογιστή (δηλαδή του τοπικού υπολογιστή).
  • Δεύτερος αριθμός 80 είναι η θύρα του κοντέινερ στην οποία θα πρέπει να ανακατευθυνθεί το αίτημα.

Εξετάστε την παρακάτω εικόνα.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Port Forwarding

Το σύστημα προωθεί αιτήματα από τη θύρα <hostPort> ανά λιμάνι <containerPort>. Δηλαδή πρόσβαση στο λιμάνι 80 ο υπολογιστής ανακατευθύνεται σε μια θύρα 80 δοχείο.

Από το λιμάνι 80 που ανοίγει στον τοπικό υπολογιστή, μπορείτε να έχετε πρόσβαση στην εφαρμογή από αυτόν τον υπολογιστή στο localhost:80. Εάν το σύστημά σας δεν υποστηρίζει Docker, μπορείτε να εκτελέσετε την εφαρμογή σε μια εικονική μηχανή Docker, η διεύθυνση της οποίας θα μοιάζει με <docker-machine ip>:80. Για να μάθετε τη διεύθυνση IP της εικονικής μηχανής Docker, μπορείτε να χρησιμοποιήσετε την εντολή docker-machine ip.

Σε αυτό το σημείο, μόλις ξεκινήσει με επιτυχία το κοντέινερ της διεπαφής εφαρμογής, θα πρέπει να μπορείτε να ανοίξετε τη σελίδα του σε ένα πρόγραμμα περιήγησης.

▍.dockerignore αρχείο

Δημιουργία της εικόνας της εφαρμογής SA-Frontend, θα μπορούσαμε να παρατηρήσουμε ότι αυτή η διαδικασία είναι εξαιρετικά αργή. Αυτό συμβαίνει επειδή το πλαίσιο δημιουργίας εικόνας πρέπει να αποσταλεί στον δαίμονα Docker. Ο κατάλογος που αντιπροσωπεύει το περιβάλλον κατασκευής δίνεται ως το τελευταίο όρισμα της εντολής docker build. Στην περίπτωσή μας, υπάρχει μια τελεία στο τέλος αυτής της εντολής. Αυτό έχει ως αποτέλεσμα η ακόλουθη δομή να περιλαμβάνεται στο πλαίσιο της συναρμολόγησης:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

Αλλά από όλους τους φακέλους που υπάρχουν εδώ, χρειαζόμαστε μόνο έναν φάκελο build. Το να κατεβάζεις οτιδήποτε άλλο είναι χάσιμο χρόνου. Μπορείτε να επιταχύνετε την κατασκευή λέγοντας στον Docker ποιους καταλόγους να αγνοήσει. Για να το κάνουμε αυτό χρειαζόμαστε ένα αρχείο .dockerignore. Εσείς, εάν είστε εξοικειωμένοι με το αρχείο .gitignore, η δομή αυτού του αρχείου θα φαίνεται πιθανώς γνωστή. Παραθέτει καταλόγους που το σύστημα δημιουργίας εικόνων μπορεί να αγνοήσει. Στην περίπτωσή μας, τα περιεχόμενα αυτού του αρχείου μοιάζουν με αυτό:

node_modules
src
public

αρχείο .dockerignore πρέπει να βρίσκεται στον ίδιο φάκελο με το αρχείο Dockerfile. Τώρα η συναρμολόγηση της εικόνας θα διαρκέσει μερικά δευτερόλεπτα.

Ας ασχοληθούμε τώρα με την εικόνα για μια εφαρμογή Java.

▍Δημιουργία εικόνας κοντέινερ για εφαρμογή Java

Ξέρετε τι και έχετε ήδη μάθει όλα όσα χρειάζεστε για να δημιουργήσετε εικόνες κοντέινερ. Γι' αυτό η ενότητα αυτή θα είναι πολύ σύντομη.

Ανοίξτε το αρχείο Dockerfile, το οποίο βρίσκεται στο φάκελο του έργου sa-webapp. Εάν διαβάσετε το κείμενο αυτού του αρχείου, τότε σε αυτό θα συναντήσετε μόνο δύο νέες κατασκευές που ξεκινούν με λέξεις-κλειδιά ENV и EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

Λέξη κλειδί ENV σας επιτρέπει να δηλώνετε μεταβλητές περιβάλλοντος μέσα σε κοντέινερ Docker. Συγκεκριμένα, στην περίπτωσή μας, σας επιτρέπει να ορίσετε μια διεύθυνση URL για πρόσβαση στο API της εφαρμογής που εκτελεί ανάλυση κειμένου.

Λέξη κλειδί EXPOSE σας επιτρέπει να πείτε στο Docker να ανοίξει μια θύρα. Θα χρησιμοποιήσουμε αυτήν τη θύρα ενώ εργαζόμαστε με την εφαρμογή. Εδώ μπορείτε να το δείτε Dockerfile για εφαρμογή SA-Frontend δεν υπάρχει τέτοια εντολή. Αυτό είναι μόνο για σκοπούς τεκμηρίωσης, με άλλα λόγια, αυτή η κατασκευή είναι για τον αναγνώστη Dockerfile.

Η δημιουργία της εικόνας και η ώθησή της στο αποθετήριο μοιάζει ακριβώς με το προηγούμενο παράδειγμα. Εάν δεν είστε ακόμη πολύ σίγουροι για τις ικανότητές σας, μπορείτε να βρείτε τις αντίστοιχες εντολές στο αρχείο README.md στο φάκελο sa-webapp.

▍Δημιουργία εικόνας κοντέινερ για εφαρμογή Python

Αν ρίξετε μια ματιά στα περιεχόμενα του αρχείου Dockerfile στο φάκελο sa-logicδεν θα βρεις τίποτα καινούργιο εκεί. Οι εντολές για τη δημιουργία της εικόνας και την ώθησή της στο αποθετήριο θα πρέπει να σας είναι ήδη γνωστές, αλλά, όπως και στην περίπτωση των άλλων εφαρμογών μας, μπορείτε να τις βρείτε στο αρχείο README.md στο φάκελο sa-logic.

▍Δοκιμή εφαρμογών σε εμπορευματοκιβώτια

Μπορείτε να εμπιστευτείτε κάτι που δεν έχετε δοκιμάσει; Δεν μπορώ και εγώ. Ας δοκιμάσουμε τα δοχεία μας.

  1. Ας ξεκινήσουμε το κοντέινερ εφαρμογής sa-logic και ρυθμίστε το να ακούει σε μια θύρα 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. Ας ξεκινήσουμε το κοντέινερ εφαρμογής sa-webapp και ρυθμίστε το να ακούει σε μια θύρα 8080. Επιπλέον, πρέπει να ορίσουμε τη θύρα στην οποία η εφαρμογή Python θα ακούει αιτήματα από την εφαρμογή Java, αναθέτοντας εκ νέου τη μεταβλητή περιβάλλοντος SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

Για να μάθετε πώς μπορείτε να μάθετε τη διεύθυνση IP ενός κοντέινερ ή Docker VM, ανατρέξτε στο αρχείο README.

Ας ξεκινήσουμε το κοντέινερ εφαρμογής sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Τώρα όλα είναι έτοιμα για πλοήγηση στο πρόγραμμα περιήγησης στη διεύθυνση localhost:80 και δοκιμάστε την εφαρμογή.

Λάβετε υπόψη ότι εάν αλλάξετε τη θύρα για sa-webapp, ή εάν εκτελείτε ένα Docker VM, θα χρειαστεί να επεξεργαστείτε το αρχείο App.js από ένα φάκελο sa-frontendαλλάζοντας τη διεύθυνση IP ή τον αριθμό θύρας στη μέθοδο analyzeSentence()αντικαθιστώντας τις τρέχουσες πληροφορίες αντί των παρωχημένων δεδομένων. Μετά από αυτό, πρέπει να συναρμολογήσετε ξανά την εικόνα και να τη χρησιμοποιήσετε.

Αυτό είναι το διάγραμμα εφαρμογής μας τώρα.

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers
Οι μικροϋπηρεσίες λειτουργούν σε κοντέινερ

Περίληψη: γιατί χρειαζόμαστε ένα σύμπλεγμα Kubernetes;

Μόλις εξετάσαμε τα αρχεία Dockerfile, μίλησε για το πώς να δημιουργήσετε εικόνες και να τις προωθήσετε σε ένα αποθετήριο Docker. Επιπλέον, μάθαμε πώς να επιταχύνουμε τη συναρμολόγηση εικόνων χρησιμοποιώντας το αρχείο .dockerignore. Ως αποτέλεσμα, οι μικροϋπηρεσίες μας λειτουργούν πλέον σε κοντέινερ Docker. Εδώ μπορεί να έχετε μια απολύτως δικαιολογημένη ερώτηση σχετικά με το γιατί χρειαζόμαστε το Kubernetes. Η απάντηση σε αυτή την ερώτηση θα αφιερωθεί στο δεύτερο μέρος αυτού του υλικού. Στο μεταξύ, σκεφτείτε το εξής ερώτημα:
Ας υποθέσουμε ότι η εφαρμογή web ανάλυσης κειμένου έχει γίνει δημοφιλής παγκοσμίως. Εκατομμύρια αιτήματα έρχονται σε αυτόν κάθε λεπτό. Αυτό σημαίνει ότι οι μικροϋπηρεσίες sa-webapp и sa-logic θα είναι κάτω από τεράστιο άγχος. Πώς να κλιμακώσετε τα δοχεία που λειτουργούν μικροϋπηρεσίες;

Οδηγός Kubernetes Μέρος 1: Εφαρμογές, Microservices και Containers

Πηγή: www.habr.com

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