Πώς να απλοποιήσετε την ανάλυση καταγραφής κοντέινερ Docker με Elastic Stack

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

Εάν έχετε εμπορευματοποιήσει την εφαρμογή σας με μια πλατφόρμα κοντέινερ όπως το Docker, ίσως να είστε εξοικειωμένοι με τα αρχεία καταγραφής του προγράμματος σύνδεσηςτο οποίο σας επιτρέπει να βλέπετε τα αρχεία καταγραφής που δημιουργήθηκαν εντός της εφαρμογής σας να εκτελούνται μέσα στο κοντέινερ του docker. Γιατί λοιπόν να σκεφτείτε το Elastic Stack για να αναλύσετε τα αρχεία καταγραφής σας; Λοιπόν, υπάρχουν κυρίως δύο προβλήματα καύσης εδώ:

  • Φανταστείτε ότι έχετε δεκάδες, εκατοντάδες ή ακόμα και χιλιάδες κοντέινερ που δημιουργούν αρχεία καταγραφής - SSH-είσοδος σε όλους αυτούς τους διακομιστές και η εξαγωγή αρχείων καταγραφής δεν θα λειτουργήσει καλά.
  • Επίσης, τα δοχεία είναι αμετάβλητα και εφήμερα, πράγμα που σημαίνει ότι έχουν μικρότερη διάρκεια ζωής. Έτσι, όταν τα κοντέινερ σας φύγουν και αντικατασταθούν με νέα κοντέινερ, όλα τα αρχεία καταγραφής εφαρμογών που σχετίζονται με παλιά κοντέινερ θα φύγουν.

Έτσι, η τελική λύση για αυτό είναι να δημιουργήσετε ένα κεντρικό στοιχείο καταγραφής για τη συλλογή όλων των αρχείων καταγραφής κοντέινερ σε ένα μόνο μέρος. Εδώ μπαίνει το Elastic Stacks.

Το Elastic Stack αποτελείται κυρίως από τέσσερα κύρια συστατικά:

  • Το Beats είναι το νέο μέλος που έκανε το ELK Stack γνωστό ως Elastic Stack. Οι Beats είναι ελαφροί αποστολείς δεδομένων καταγραφής που μπορούν να ωθήσουν τα αρχεία καταγραφής στο ELK Stack. Για αυτήν την ανάρτηση θα χρησιμοποιώ το Filebeats, μέλος της οικογένειας Beats, το οποίο προσφέρει έναν ελαφρύ τρόπο συλλογής και προώθησης και συγκέντρωσης αρχείων καταγραφής και αρχείων.
  • Το Logstash είναι ένα στοιχείο που συγκεντρώνει, τροποποιεί και μεταφέρει αρχεία καταγραφής από πολλές τοποθεσίες εισόδου στην Elasticsearch.
  • Η Elasticsearch είναιμια κατανεμημένη μηχανή αναζήτησης και ανάλυσης με βάση το JSON που αποθηκεύει και ευρετηριάζει δεδομένα (καταχωρίσεις καταγραφής σε αυτήν την περίπτωση) με δυνατότητα κλιμάκωσης και διαχείρισης.
  • Το Kibana είναι ένα εμπλουτισμένο περιβάλλον εργασίας χρήστη για ανάλυση και εύκολη πρόσβαση σε δεδομένα στο Elasticsearch.

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

Για τους σκοπούς αυτού του άρθρου, έχω χρησιμοποιήσει δύο t2.small AWS EC2 παρουσίες, εκτελώντας το Ubuntu 18.04 εγκατεστημένο με Docker και Docker compose. Το Instance 1 εκτελεί μια εφαρμογή web tomcat και η παρουσία 2 εκτελεί ELK stack (Elasticsearch, Logstash, Kibana).

Σε Linux από προεπιλογή, τα αρχεία καταγραφής του docker βρίσκονται σε αυτήν την τοποθεσία:

/ var / lib / docker / κοντέινερ // gt; -json.log

Όλα τα αρχεία καταγραφής του docker θα συλλέγονται μέσω του Filebeat που εκτελείται εντός του κεντρικού υπολογιστή ως κοντέινερ. Το Filebeat θα εγκατασταθεί σε κάθε μηχάνημα κεντρικού υπολογιστή docker (θα χρησιμοποιήσουμε ένα προσαρμοσμένο αρχείο docker Filebeat και μονάδα systemd για αυτό που θα εξηγηθεί στην ενότητα Configuring Filebeat)

Το tomcat webapp μας θα γράψει αρχεία καταγραφής στην παραπάνω τοποθεσία χρησιμοποιώντας το προεπιλεγμένο πρόγραμμα οδήγησης καταγραφής σύνδεσης. Στη συνέχεια, το Filebeat θα εξαγάγει αρχεία καταγραφής από αυτήν τη θέση και θα τα ωθήσει προς το Logstash.

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

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

Διαμόρφωση Filebeat

Για αυτήν την ενότητα, το filebeat.yml και το Dockerfile αποκτήθηκαν από το github repo του Bruno COSTE's sample-filebeat-docker-logging. Πολλές ευχαριστίες για την φοβερή δουλειά του. Αλλά αφού έχω κάνει πολλές αλλαγές στο filebeat.yml σύμφωνα με τις απαιτήσεις αυτού του άρθρου, έχω φιλοξενήσει αυτούς με το filebeat.service (systemd file) ξεχωριστά στο δικό μου repo. Μπορείτε να αποκτήσετε πρόσβαση στο repo εδώ.

Ως αρχικό βήμα, πρέπει να ενημερώσετε το αρχείο filebeat.yml που περιέχει τις διαμορφώσεις Filebeat. Δίνεται παρακάτω ένα δείγμα αρχείου filebeat.yml που μπορείτε να χρησιμοποιήσετε. Σημειώστε τη γραμμή 21, το πεδίο output.logstash και το πεδίο κεντρικών υπολογιστών. Το έχω διαμορφώσει στη διεύθυνση IP του διακομιστή που εκτελώ τη στοίβα ELK, αλλά μπορείτε να το τροποποιήσετε εάν εκτελείτε το Logstash σε ξεχωριστό διακομιστή. Από προεπιλογή, το Logstash ακούει Filebeat στη θύρα 5044.

Για να μάθετε περισσότερα σχετικά με τις παραμέτρους διαμόρφωσης Filebeat Docker, δείτε εδώ.

Μετά από αυτό μπορείτε να δημιουργήσετε τη δική σας εικόνα Filebeat Docker χρησιμοποιώντας το ακόλουθο Dockerfile.

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

docker run -v '/var/lib/docker/containers:/usr/share/dockerlogs/data:ro' -v '/var/run/docker.sock:/var/run/docker.sock' --name filebeat ${YOUR_FILEBEAT_DOCKER_IMAGE}:latest

Στην παραπάνω εντολή Docker, σημειώστε τις δύο παραμέτρους σύνδεσης σύνδεσης: / var / lib / docker / container είναι η διαδρομή όπου υπάρχουν αρχεία καταγραφής σύνδεσης στο μηχάνημα κεντρικού υπολογιστή και έχει δεσμευτεί στο / usr / share / dockerlogs / διαδρομή δεδομένων στο Filebeat κοντέινερ με πρόσβαση μόνο για ανάγνωση. Στο δεύτερο όρισμα bind mount, το /var/run/docker.sock είναι συνδεδεμένο στον δαίμονα Docker του κοντέινερ Filebeat. Είναι η υποδοχή unix που ακούει από προεπιλογή ο δαίμονας Docker και μπορεί να χρησιμοποιηθεί για την επικοινωνία με τον δαίμονα μέσα από ένα κοντέινερ. Αυτό επιτρέπει στο κοντέινερ Filebeat μας να λαμβάνει μεταδεδομένα Docker και να εμπλουτίζει τις καταχωρήσεις καταγραφής κοντέινερ μαζί με τα μεταδεδομένα και να το ωθεί στη στοίβα ELK

Αν θέλετε να αυτοματοποιήσετε αυτήν τη διαδικασία, έχω γράψει ένα αρχείο Systemd Unit για τη διαχείριση του Filebeat ως υπηρεσία.

Διαμόρφωση της στοίβας ELK

Γι 'αυτό θα χρησιμοποιήσω τη δεύτερη παρουσία EC2, όπου τρέχω τη στοίβα ELK. Μπορείτε να το κάνετε αυτό απλώς εγκαθιστώντας το Docker compose και ρίξτε μια ματιά σε αυτό το φοβερό deviantony / docker-elk repo και απλά εκτελώντας το docker-compose up -d

Λάβετε υπόψη ότι όλοι οι κανόνες τείχους προστασίας επιτρέπουν την εισερχόμενη κυκλοφορία στο Logstash, το Elasticsearch και το Kibana.

Πριν εκτελέσετε τη στοίβα ELK, πρέπει να βεβαιωθείτε ότι το αρχείο logstash.conf έχει ρυθμιστεί σωστά για να ακούει τα εισερχόμενα αρχεία καταγραφής στη θύρα 5044 και τα αρχεία καταγραφής προστίθενται σωστά στον κεντρικό υπολογιστή elasticsearch. Επίσης, πρέπει να βεβαιωθείτε ότι έχετε προσθέσει μια παράμετρο ευρετηρίου στο Elasticsearch για να προσδιορίσετε τα αρχεία καταγραφής που δημιουργούνται από το Filbeat με μοναδικό τρόπο.

In your docker-elk repo you can find your logstash.conf file by following docker-elk/logstash/pipeline pathname. This is the configuration file for setting up Logstash configurations. You need to update it as follows:

Once you do it, you can access your Kibana dashboard on port 5601 by default as defined on the docker-compose.yml file on deviantony/docker-elk repo.

Under the management tab, you can create an index pattern for Filebeat logs. This has to be done before you can view the logs on Kibana dashboard.

If your containers are pushing logs properly into Elasticsearch via Logstash, and you have successfully created the index pattern, you can go to the Discover tab on the Kibana dashboard and view your Docker container application logs along with Docker metadata under the filebeat* index pattern.

References

  1. //www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html
  2. //medium.com/@bcoste/powerful-logging-with-docker-filebeat-and-elasticsearch-8ad021aecd87
  3. //www.elastic.co/guide/en/logstash/current/configuration.html
  4. //medium.com/lucjuggery/about-var-run-docker-sock-3bfd276e12fd