Επιστροφή στο blog

Ανάπτυξη μιας εφαρμογής PHP σε ένα Kubernetes Cluster με Ubuntu 18.04

Ανάπτυξη μιας εφαρμογής PHP σε ένα Kubernetes Cluster με Ubuntu 18.04

Kubernetes (επίσης γνωστό και ως k8s) είναι ένα σύστημα ενορχήστρωσης ανοικτού κώδικα. Επιτρέπει στους χρήστες να αναπτύσσουν, να κλιμακώνουν και να διαχειρίζονται εφαρμογές σε κοντέινερ με ελάχιστο χρόνο διακοπής λειτουργίας. Σε αυτόν τον οδηγό, θα μάθετε πώς να αναπτύξετε μια PHP εφαρμογή σε μια συστάδα Kubernetes.

Το Nginx λειτουργεί ως proxy για το PHP-FPM κατά την εκτέλεση μιας εφαρμογής PHP. Η διαχείριση αυτών των δύο υπηρεσιών σε ένα μόνο κοντέινερ είναι μια δύσκολη διαδικασία. Το Kubernetes μάς βοηθά να τις διαχειριστούμε σε δύο διαφορετικά κοντέινερ και μειώνει την ταλαιπωρία. Επιτρέπει επίσης στους χρήστες να επαναχρησιμοποιούν τα κοντέινερ και να μην ανησυχούν για τη δημιουργία του container image τους για κάθε νέα έκδοση της PHP/Nginx.

Θα εκτελέσετε την εφαρμογή σας και την υπηρεσία proxy σε δύο ξεχωριστά κοντέινερ. Ο οδηγός θα παρέχει επίσης πληροφορίες σχετικά με τον τρόπο χρήσης τοπικού αποθηκευτικού χώρου για τη δημιουργία ενός Persistent Volume (PV) και Persistent Volume Claim (PVC). Στη συνέχεια, θα χρησιμοποιήσετε αυτό το PVC για να διατηρήσετε τα αρχεία ρυθμίσεων και τον κώδικά σας εκτός των container images. Μετά την ολοκλήρωση αυτού του οδηγού, θα μπορείτε να επαναχρησιμοποιήσετε το Nginx image σας για άλλες εφαρμογές που απαιτούν έναν διακομιστή proxy. Μπορείτε να το επιτύχετε αυτό περνώντας μια ρύθμιση παραμέτρων, αντί να ξαναδημιουργήσετε το image για αυτό.

Προαπαιτούμενα

  1. Μια βασική κατανόηση του Kubernetes (k8s) και των αντικειμένων του. Ανατρέξτε σε αυτόν τον οδηγό για μια λεπτομερή επισκόπηση του οικοσυστήματος του Kubernetes.
  2. Μια συστάδα Kubernetes που είναι σε λειτουργία σε Ubuntu 18.04. Ακολουθήστε αυτόν τον οδηγό για να δημιουργήσετε τη δική σας συστάδα Kubernetes χρησιμοποιώντας το kubeadm.
  3. Επιπλέον, πρέπει να φιλοξενήσετε τον κώδικα της εφαρμογής σας σε μια δημόσια διεύθυνση URL, για παράδειγμα, στο GitHub.

Βήμα 1: Δημιουργία Υπηρεσιών PHP-FPM και Nginx

Αυτό το βήμα θα σας βοηθήσει να δημιουργήσετε τις υπηρεσίες PHP-FPM και Nginx. Κάθε υπηρεσία παρέχει πρόσβαση σε ένα σύνολο από pods μέσα σε μια συστάδα. Όλες οι υπηρεσίες που υπάρχουν σε μια συστάδα μπορούν να επικοινωνούν μεταξύ τους με τα ονόματά τους, χωρίς διευθύνσεις IP. Η υπηρεσία PHP-FPM και η υπηρεσία Nginx θα παρέχουν πρόσβαση στα pods PHP-FPM και Nginx, αντίστοιχα.

Θα πρέπει να πείτε στην υπηρεσία PHP-FPM πώς να βρει τα pods του Nginx, καθώς θα λειτουργεί ως proxy για τα pods του PHP-FPM. Για αυτό, θα επωφεληθείτε από την αυτόματη ανακάλυψη υπηρεσιών του Kubernetes’ και θα χρησιμοποιήσετε αναγνώσιμα από τον άνθρωπο ονόματα για να δρομολογήσετε το αίτημα στην αντίστοιχη υπηρεσία.

Για να δημιουργήσετε οποιαδήποτε υπηρεσία, θα πρέπει να δημιουργήσετε ένα αρχείο YAML που περιέχει τον ορισμό του αντικειμένου. Αυτό το αρχείο YAML έχει τουλάχιστον τις ακόλουθες ετικέτες:

  1. apiVersion: Η έκδοση του Kubernetes API στην οποία ανήκει ο ορισμός.
  2. kind: Το είδος του αντικειμένου Kubernetes που δημιουργεί αυτό το αρχείο YAML. Για παράδειγμα: μια service, μια job, ή ένα pod.
  3. metadata: Το όνομα του αντικειμένου και οι διάφορες labels που μπορεί να θέλει να εφαρμόσει ο χρήστης σε αυτό το αντικείμενο ορίζονται κάτω από αυτήν την ετικέτα.
  4. spec: Αυτή η ετικέτα περιέχει τις προδιαγραφές του αντικειμένου σας, όπως ENVs, το container image που θα χρησιμοποιηθεί, τις θύρες στις οποίες θα είναι προσβάσιμη η υπηρεσία του κοντέινερ.
Δημιουργία της υπηρεσίας PHP-FPM

Για να ξεκινήσετε, θα πρέπει να δημιουργήσετε έναν κατάλογο για να διατηρήσετε τον ορισμό του αντικειμένου Kubernetes. Συνδεθείτε στο master node σας και δημιουργήστε έναν κατάλογο με το όνομα “definitions:”

Αλλάξτε τον κατάλογο στον κατάλογο definitions:

Στη συνέχεια, δημιουργήστε το αρχείο υπηρεσίας PHP-FPM ως αρχείο php_service.yaml:

Μετά από αυτό, ορίστε τα apiVersion και kind στο αρχείο php_fpm_service.yaml:

Ονομάστε την υπηρεσία σας ως php ή php-fpm καθώς θα παρέχει πρόσβαση στην εφαρμογή σας PHP-FPM:

Βάλτε ετικέτα στην υπηρεσία php σας ως tier: backend καθώς η εφαρμογή PHP θα εκτελείται πίσω από αυτήν την υπηρεσία:

Μια υπηρεσία χρησιμοποιεί τις ετικέτες selector για να καθορίσει σε ποια pods θα έχει πρόσβαση. Οποιοδήποτε pod ταιριάζει με αυτές τις ετικέτες, ανεξάρτητα από το πότε δημιουργήθηκε το pod, εξυπηρετείται. Θα μάθετε πώς να προσθέτετε ετικέτες στα pods σας αργότερα σε αυτόν τον οδηγό.

Συμπεριλάβετε την tier: backend ετικέτα που εκχωρεί το pod σας στο backend tier, μαζί με την app: php-fpm ετικέτα για να υποδείξετε ότι το pod εκτελεί μια εφαρμογή PHP-FPM. Πρέπει να προσθέσετε αυτές τις ετικέτες μετά την ενότητα metadata:

Στη συνέχεια, πρέπει να δηλώσετε τη θύρα για πρόσβαση σε αυτήν την υπηρεσία php-fpm στο πλαίσιο του spec. Μπορείτε να προσθέσετε οποιαδήποτε θύρα της επιλογής σας, αλλά θα χρησιμοποιήσουμε τη θύρα 9000 σε αυτόν τον οδηγό:

Μόλις ολοκληρώσετε τα παραπάνω βήματα, το αρχείο σας php_fpm_service.yaml θα μοιάζει με αυτό:

Πατήστε Ctrl + O για να αποθηκεύσετε το αρχείο, και μετά πατήστε Ctrl + X για να βγείτε από το nano.

Εφαρμογή της εντολής kubectl για τη δημιουργία της υπηρεσίας PHP

Αφού δημιουργηθεί ο ορισμός αντικειμένου για την υπηρεσία σας, εκτελέστε την εντολή kubectl apply με το όρισμα -f προσδιορίζοντας το αρχείο σας php_fpm_service.yaml:

Το αποτέλεσμα της παραπάνω εντολής θα πρέπει να είναι:

Εκτελέστε την παρακάτω εντολή για να επαληθεύσετε ότι η υπηρεσία php-fpm εκτελείται:

Θα μπορείτε να δείτε την υπηρεσία php-fpm σε λειτουργία:

Σημείωση: Το Kubernetes υποστηρίζει διάφορους τύπους υπηρεσιών. Η υπηρεσία php-fpm χρησιμοποιεί τον προεπιλεγμένο τύπο υπηρεσίας ClusterIP. Αυτός ο τύπος υπηρεσίας εκχωρεί μια εσωτερική IP και καθιστά την υπηρεσία προσβάσιμη μόνο από το εσωτερικό του συμπλέγματος Kubernetes.
Δημιουργία της υπηρεσίας Nginx

Εφόσον η υπηρεσία PHP-FPM είναι έτοιμη τώρα, ήρθε η ώρα να δημιουργήσετε και την υπηρεσία Nginx. Δημιουργήστε και ανοίξτε ένα νέο αρχείο YAML για αυτήν την υπηρεσία, με το όνομα nginx_service.yaml στον επεξεργαστή κειμένου:

Ονομάστε αυτήν την υπηρεσία ως nginx καθώς θα στοχεύει τα Nginx pods. Αυτή η υπηρεσία ανήκει επίσης στο backend, επομένως θα πρέπει να προσθέσετε μια ετικέτα tier: backend σε αυτήν:

Όπως κάναμε στην υπηρεσία php-fpm, προσθέστε τις ετικέτες επιλογέα app: nginx και tier: backend για να στοχεύσετε τα pods. Προσθέστε την προεπιλεγμένη θύρα HTTP 80 για πρόσβαση σε αυτήν την υπηρεσία:

Η υπηρεσία Nginx μπορεί να είναι δημόσια προσβάσιμη στο διαδίκτυο από τη δημόσια διεύθυνση IP. Μπορείτε να προσθέσετε την IP του worker node σας ως your_public_ip. Προσθέστε τις παρακάτω γραμμές κάτω από το spec.externalIPs:

Το αρχείο σας nginx_service.yaml θα πρέπει να μοιάζει με το παρακάτω μόλις ολοκληρώσετε όλα τα παραπάνω βήματα:

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

Εφαρμογή της εντολής kubectl για τη δημιουργία της υπηρεσίας Nginx
Θα πρέπει να δείτε το παρακάτω αποτέλεσμα για την παραπάνω εντολή:
Τώρα, εκτελέστε την ακόλουθη εντολή για να δείτε όλες τις υπηρεσίες που εκτελούνται:
Εκτελώντας την παραπάνω εντολή, θα πρέπει να είστε σε θέση να δείτε τόσο τις υπηρεσίες PHP-FPM όσο και τις υπηρεσίες Nginx σε λειτουργία:
Σημειώστε ότι εάν επιθυμείτε να διαγράψετε οποιαδήποτε από τις υπηρεσίες που εκτελούνται, μπορείτε να εκτελέσετε την παρακάτω εντολή:

Βήμα 2: Δημιουργία Τοπικού Χώρου Αποθήκευσης και Persistent Volume

Το Kubernetes παρέχει διάφορα πρόσθετα αποθήκευσης (storage plug-ins) που σας βοηθούν να δημιουργήσετε χώρο αποθήκευσης για το περιβάλλον σας. Αυτό το βήμα θα σας καθοδηγήσει στο πώς να δημιουργήσετε ένα τοπικό StorageClass και πώς αυτή η Storage Class μπορεί να χρησιμοποιηθεί περαιτέρω για τη δημιουργία Persistent Volume.

Δημιουργία τοπικού χώρου αποθήκευσης

Δημιουργήστε ένα αρχείο, για παράδειγμα το storageClass.yaml, στον επεξεργαστή κειμένου σας:

Προσθέστε το kind ως "storageClass" και το apiVersion ως "storage.k8s.io/v1" ως εξής:

Ονομάστε αυτή τη StorageClass ως "my-local-storage" και προσθέστε τα provisioner και volumeBindingMode ως εξής:

Αποθηκεύστε και κλείστε το αρχείο και το τελικό σας αρχείο storageClass.yaml θα πρέπει να μοιάζει με αυτό:

Τώρα, δημιουργήστε τη StorageClass εκτελώντας την εντολή kubectl create, όπως παρακάτω:

Μετά την εκτέλεση της παραπάνω εντολής, θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:

Δημιουργία τοπικού Persistent Volume

Μετά τη δημιουργία του Τοπικού Χώρου Αποθήκευσης (Local Storage), μπορείτε να δημιουργήσετε το τοπικό σας Persistent Volume. Ένα Persistent Volume, γνωστό και ως PV, είναι ένας χώρος αποθήκευσης block συγκεκριμένου μεγέθους που είναι ανεξάρτητος από τον κύκλο ζωής ενός pod. Ένα τοπικό Persistent Volume δεν είναι τίποτα άλλο παρά ένας τοπικός δίσκος ή ένας κατάλογος που είναι διαθέσιμος σε έναν κόμβο του συμπλέγματος Kubernetes. Αυτό το τοπικό Persistent Volume επιτρέπει στους χρήστες του να έχουν πρόσβαση στον τοπικό χώρο αποθήκευσης χρησιμοποιώντας ένα τοπικό Persistent Volume Claim με έναν πολύ απλό αλλά φορητό τρόπο. Μπορείτε να δημιουργήσετε αυτό το τοπικό Persistent Volume χρησιμοποιώντας αυτήν την κλάση αποθήκευσης (storage class) που μόλις δημιουργήσαμε. Ανοίξτε ένα αρχείο, για παράδειγμα το persistentVolume.yaml, στον επεξεργαστή κειμένου σας:

Δώστε σε αυτό το persistent volume ένα όνομα, για παράδειγμα "my-local-pv":

Μπορείτε να προσθέσετε χωρητικότητα αποθήκευσης ανάλογα με τη χρήση σας κατά τη δημιουργία ενός τοπικού Persistent Volume. Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε 5 Gi για τον χώρο αποθήκευσης:

Προσθέστε τα accessModes, persistentVolumeReclaimPolicy, και παρέχετε το ίδιο storageClassName με αυτό που χρησιμοποιήθηκε στο storageClass.yaml:

Note: το persistentVolumeReclaimPolicy σάς ενημερώνει για το τι συμβαίνει στον Persistent Volume μόλις αποδεσμευτεί η αξίωσή του (Persistent Volume Claim). Υπάρχουν τρεις έγκυρες επιλογές για αυτήν την παράμετρο: Retain, Delete και Recycle. Στον κώδικά μας, θα χρησιμοποιήσουμε την επιλογή Retain. Για περισσότερες λεπτομέρειες, μπορείτε να ελέγξετε το πεδίο persistentVolumeReclaimPolicy εδώ: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#persistentvolumeclaim-v1-core

Προσθέστε το local.path για τον Persistent Volume σας όπως παρακάτω:

Note: Βεβαιωθείτε ότι αυτή η τοπική διαδρομή (/mnt/disk/vol) υπάρχει στον κόμβο του συμπλέγματος Kubernetes.

Αφού προσθέσετε όλα τα απαιτούμενα πεδία, το αρχείο σας persistentVolume.yaml θα πρέπει να μοιάζει με αυτό:

Note: Πρέπει να χρησιμοποιήσετε το σωστό όνομα κόμβου του μηχανήματός σας. Σε αυτήν την περίπτωση, είναι: “worker.”
Προετοιμασία τοπικού τόμου

Τώρα, πρέπει να προετοιμάσουμε έναν τοπικό τόμο στον κόμβο “worker” όπως έχουμε προσθέσει στο αρχείο persistentVolume.yaml . Εκτελέστε τις παρακάτω εντολές στον κόμβο που έχετε ρυθμίσει στο persistentVolume. Σε αυτήν την περίπτωση, είναι ο κόμβος “worker”:

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

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

Θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:

Εφόσον δημιουργήσατε με επιτυχία την τοπική σας αποθήκευση και τον Persistent Volume, μπορείτε τώρα να προχωρήσετε και να δημιουργήσετε ένα Persistent Volume Claim για να διατηρήσετε τον κώδικα της εφαρμογής σας και τα αρχεία ρυθμίσεων.

Step 3: Create the Persistent Volume

Ο κώδικας της εφαρμογής σας πρέπει να διατηρείται ασφαλής ενώ διαχειρίζεστε ή ενημερώνετε τα pods σας. Για αυτό, θα χρησιμοποιήσετε τον Persistent Volume, που δημιουργήθηκε στο προηγούμενο βήμα, στον οποίο αποκτάται πρόσβαση χρησιμοποιώντας ένα PersistentVolumeClaim ή PVC. Αυτό το PVC προσαρτά τον PV στην απαιτούμενη διαδρομή.

Ανοίξτε ένα αρχείο, ας πούμε το code_volume.yaml, στο πρόγραμμα επεξεργασίας σας:

Ονομάστε το PVC σας ως code προσθέτοντας τις παρακάτω παραμέτρους και τιμές στο αρχείο σας:

Η ενότητα spec ενός PVC περιλαμβάνει τα ακόλουθα στοιχεία:

  1. accessModes: Υπάρχουν διάφορες πιθανές τιμές για αυτό το πεδίο ως εξής:
    • ReadWriteOnce – Προσαρτά τον τόμο για έναν μόνο κόμβο με δικαιώματα ανάγνωσης και εγγραφής.
    • ReadOnlyMany – Προσαρτά τον τόμο για πολλούς κόμβους μόνο με δικαίωμα ανάγνωσης.
    • ReadWriteMany – Προσαρτά τον τόμο για πολλούς κόμβους με δικαιώματα ανάγνωσης και εγγραφής.
  2. resources: Ορίζει τον απαιτούμενο χώρο αποθήκευσης.

Εφόσον ο τοπικός χώρος αποθήκευσης είναι προσαρτημένος μόνο σε έναν κόμβο, θα πρέπει να ορίσετε το accessMode σε ReadWriteOnce. Σε αυτόν τον οδηγό θα προσθέσετε μόνο ένα μικρό κομμάτι κώδικα εφαρμογής, επομένως 1GB αποθηκευτικού χώρου θα είναι επαρκές εδώ. Ωστόσο, εάν επιθυμείτε να αποθηκεύσετε μεγαλύτερο όγκο δεδομένων ή κώδικα, μπορείτε να τροποποιήσετε την παράμετρο storage σύμφωνα με τις απαιτήσεις σας. Σημειώστε ότι μόλις δημιουργηθεί ο τόμος, θα μπορείτε να αυξήσετε το μέγεθος του αποθηκευτικού χώρου. Ωστόσο, η μείωσή του δεν υποστηρίζεται:

Τώρα, δηλώστε την κλάση αποθήκευσης που θα χρησιμοποιήσει το σύμπλεγμα Kubernetes για να εκχωρήσει στους τόμους. Χρησιμοποιήστε την κλάση αποθήκευσης my-local-storage, που δημιουργήθηκε στο προηγούμενο βήμα, εδώ για το storageClassName σας:

Μετά την ολοκλήρωση των παραπάνω βημάτων, το αρχείο σας code_volume.yaml θα πρέπει να μοιάζει με αυτό:

Τώρα αποθηκεύστε και κλείστε το αρχείο.

Δημιουργία PVC

Δημιουργήστε το PVC κώδικα εκτελώντας την εντολή kubectl apply:

Θα πρέπει να λάβετε το ακόλουθο αποτέλεσμα που υποδεικνύει ότι το αντικείμενο δημιουργήθηκε με επιτυχία και είναι έτοιμο για να μπορέσετε να προσαρτήσετε το PVC 1GB ως τόμο:

Μπορείτε να εκτελέσετε την ακόλουθη εντολή για να ελέγξετε τον διαθέσιμο Μόνιμο Τόμο (PV):

Το αποτέλεσμα της παραπάνω εντολής θα πρέπει να είναι το εξής:

Όλα τα παραπάνω πεδία, εκτός από τα Reclaim Policy και Status, αποτελούν μια επισκόπηση του αρχείου ρυθμίσεών σας. Το Reclaim Policy ορίζει τι συμβαίνει στο PV μόλις διαγραφεί το PVC που έχει πρόσβαση σε αυτό. Η τιμή Delete αφαιρεί το PV από το σύμπλεγμα Kubernetes καθώς και από την υποδομή αποθήκευσης. Μπορείτε να ανατρέξετε στην τεκμηρίωση του Kubernetes PV για να κατανοήσετε σαφώς τα Reclaim Policy και Status.

Μπορείτε τώρα να δημιουργήσετε τα pod σας χρησιμοποιώντας ένα Deployment, καθώς δημιουργήσατε με επιτυχία τον Μόνιμο Τόμο σας χρησιμοποιώντας τον τοπικό χώρο αποθήκευσης.

Βήμα 4: Δημιουργία Deployment για την εφαρμογή PHP-FPM

Αυτό το βήμα θα σας βοηθήσει να δημιουργήσετε το PHP-FPM pod σας χρησιμοποιώντας Deployment. Το Deployment χρησιμοποιεί ReplicaSets για να παρέχει έναν σταθερό τρόπο δημιουργίας, ενημέρωσης και διαχείρισης των pod σας. Ένα Deployment επαναφέρει αυτόματα τα pod του σε μια προηγούμενη εικόνα.

Το spec.selector κλειδί στο Deployment παραθέτει όλες τις ετικέτες των pod που διαχειρίζεται. Χρησιμοποιεί επίσης το κλειδί template για να δημιουργήσει τα pod που απαιτούνται.

Σε αυτό το βήμα, θα παρουσιάσουμε επίσης την εφαρμογή των Init Containers. Τα Init Containers εκτελούν μερικές εντολές πριν από τα κανονικά containers που καθορίζονται στο template του pod. Εδώ, το Init Container θα χρησιμοποιήσει το GitHub Gist (https://gist.github.com/) για να λάβει ένα δείγμα αρχείου index.php. Τα περιεχόμενα του δείγματος αρχείου είναι:

Δημιουργία PHP Deployment

Ανοίξτε ένα νέο αρχείο με όνομα php_deployment.yaml στον επεξεργαστή κειμένου σας για να δημιουργήσετε το Deployment σας:

Τώρα, ονομάστε το αντικείμενο Deployment PHP καθώς αυτό το Deployment θα διαχειρίζεται τα PHP-FPM pods σας. Προσθέστε την ετικέτα tier: backend επειδή το pod θα ανήκει στο backend tier:

Χρησιμοποιώντας την παράμετρο replica, καθορίστε τον αριθμό των αντιγράφων αυτού του pod που πρέπει να δημιουργηθούν. Ο αριθμός των replicas μπορεί να διαφέρει ανάλογα με τις απαιτήσεις σας και τους διαθέσιμους πόρους. Σε αυτόν τον οδηγό, θα δημιουργήσετε μόνο ένα replica του pod σας:

Προσθέστε app: php και tier:backend ετικέτες κάτω από το κλειδί selector που υποδηλώνει ότι αυτό το Deployment θα διαχειρίζεται pods που ταιριάζουν με αυτές τις δύο ετικέτες:

Τώρα, ο ορισμός αντικειμένου του pod σας χρειάζεται ένα template κάτω από το spec του Deployment σας. Αυτό το template ορίζει τις προδιαγραφές που απαιτούνται για τη δημιουργία του pod σας. Για αρχή, προσθέστε τις ετικέτες που καθορίστηκαν για τον επιλογέα υπηρεσίας php και τα matchLabels του Deployment. Στη συνέχεια, προσθέστε app:php και tier:backend κάτω από το template.metadata.labels:

Σημείωση: Ένα pod μπορεί να έχει πολλαπλά containers ή volumes και καθένα από αυτά θα χρειαστεί ένα διαφορετικό όνομα για να μπορεί να διακρίνεται. Μπορείτε να καθορίσετε μια διαδρομή προσάρτησης (mount path) για κάθε volume ώστε να προσαρτήσετε επιλεκτικά αυτό το volume σε ένα container.

Πρώτα, πρέπει να καθορίσετε όλα τα volumes στα οποία θα έχουν πρόσβαση τα containers σας. Ονομάστε αυτό το volume code καθώς είχατε δημιουργήσει ένα PVC με το όνομα code για να κρατάει τον κώδικα της εφαρμογής σας:

Στη συνέχεια, καθορίστε το όνομα του container μαζί με την εικόνα (image) που θέλετε να εκτελέσετε μέσα στο pod σας. Υπάρχουν διάφορες εικόνες διαθέσιμες στο Docker store (https://hub.docker.com/explore/), αλλά σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε την εικόνα php:7-fpm:

Τώρα, προσαρτήστε τα volumes στα οποία απαιτεί πρόσβαση το container. Εφόσον αυτό το container θα εκτελεί τον php κώδικά σας, θα χρειαστεί πρόσβαση στο volume code που δημιουργήθηκε στο προηγούμενο βήμα. Σε αυτό το βήμα, θα μάθετε επίσης πώς να αντιγράφετε τον κώδικα της εφαρμογής σας χρησιμοποιώντας ένα Init Container.

Σημείωση: Μπορείτε είτε να χρησιμοποιήσετε ένα μόνο initContainer για να εκτελέσετε ένα σενάριο (script) που χτίζει την εφαρμογή σας, είτε να χρησιμοποιήσετε ένα initContainer ανά εντολή, ανάλογα με την πολυπλοκότητα της διαδικασίας εγκατάστασής σας. Πρέπει να βεβαιωθείτε ότι τα volumes είναι προσαρτημένα στο initContainer.

Για να κατεβάσετε τον κώδικα, αυτός ο οδηγός θα σας καθοδηγήσει στο πώς να χρησιμοποιήσετε ένα μόνο Init Container με busybox. Το Busybox είναι ένα μικρό container με το εργαλείο wget που θα χρησιμοποιήσετε για να το πετύχετε αυτό.

Πρώτα, προσθέστε το initContainer σας κάτω από το spec.template.spec και καθορίστε την εικόνα busybox:

Στη συνέχεια, για να κατεβάσετε τον κώδικα στο volume code, το Init Container σας θα χρειαστεί πρόσβαση σε αυτό. Προσαρτήστε το volume code στη διαδρομή /code κάτω από το spec.template.spec.initContainers:

Κάθε Init Container απαιτείται να εκτελεί μια εντολή. Αυτό το Init Container θα χρησιμοποιήσει το wget για να κατεβάσει τον code από το Github στον κατάλογο /code. Μπορείτε να περάσετε μια επιλογή -O για να δώσετε ένα όνομα σε αυτό το ληφθέν αρχείο, και μπορείτε να ονομάσετε αυτό το αρχείο index.php.

Σημείωση: Βεβαιωθείτε ότι εμπιστεύεστε τον κώδικα που αντλείτε χρησιμοποιώντας το Init Container στον διακομιστή σας. Μπορείτε να επιθεωρήσετε τον πηγαίο κώδικα και να βεβαιωθείτε ότι είστε σύμφωνοι με αυτό που κάνει.

Επιπλέον, προσθέστε τις παρακάτω γραμμές κάτω από το install container στο spec.template.spec.initContainers:

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

Μπορείτε τώρα να αποθηκεύσετε το αρχείο και να εξέλθετε. Στη συνέχεια, δημιουργήστε το PHP-FPM Deployment σας χρησιμοποιώντας την kubectl apply εντολή:

Η επιτυχής δημιουργία του Deployment θα πρέπει να σας δώσει το παρακάτω αποτέλεσμα:

Αυτό το Deployment ξεκινά με τη λήψη των καθορισμένων εικόνων, στη συνέχεια θα ζητήσει το PersistentVolume από το PersistentVolumeClaim, και στη συνέχεια θα εκτελέσει τα initContainers. Μόλις ολοκληρωθεί αυτό το βήμα, τα containers θα εκτελεστούν και θα προσαρτήσουν τους τόμους στο καθορισμένο σημείο προσάρτησης. Αφού ολοκληρώσετε όλα αυτά τα βήματα, το pod σας θα είναι σε λειτουργία.

Μπορείτε να εκτελέσετε την παρακάτω εντολή για να δείτε το Deployment σας:

Μετά την εκτέλεση της παραπάνω εντολής, θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:

Μπορείτε να κατανοήσετε την τρέχουσα κατάσταση του Deployment με τη βοήθεια αυτού του αποτελέσματος. Ένα Deployment είναι ένας ελεγκτής που διατηρεί την επιθυμητή κατάσταση. Το πεδίο DESIRED καθορίζει ότι έχει 1 αντίγραφο του pod με το όνομα php. Το πεδίο CURRENT υποδεικνύει πόσα αντίγραφα της DESIRED κατάστασης εκτελούνται επί του παρόντος. Για ένα υγιές pod, αυτό θα πρέπει να ταιριάζει με την DESIRED κατάσταση. Μπορείτε να μάθετε περισσότερα για τα υπόλοιπα πεδία στην Τεκμηρίωση.

Μετά από αυτό, για να ελέγξετε την κατάσταση του pod που εκτελείται, μπορείτε να εκτελέσετε την παρακάτω εντολή:

Το αποτέλεσμα αυτής της εντολής μπορεί να διαφέρει ανάλογα με τον χρόνο που έχει παρέλθει από τη δημιουργία του Deployment σας. Εάν εκτελεστεί λίγο μετά τη δημιουργία του Deployment, το αποτέλεσμα θα είναι παρόμοιο με:

Επεξήγηση:

Αυτές οι στήλες αντιπροσωπεύουν τις πληροφορίες ως εξής:

  • Ready: Ο αριθμός των τρεχόντων/επιθυμητών αντιγράφων που εκτελούν αυτό το pod.
  • Status: Η κατάσταση του pod σας. Το Init:0/1 υποδεικνύει ότι τα Init Containers εκτελούνται και 0 από τα 1 Init Containers έχουν ολοκληρώσει την εκτέλεσή τους.
  • Restarts: Αυτό υποδεικνύει τον αριθμό των φορών που αυτή η διαδικασία έχει επανεκκινηθεί για να ξεκινήσει το pod.

Το pod σας μπορεί να χρειαστεί μερικά λεπτά για να αλλάξει η κατάσταση σε podInitializing ανάλογα με την πολυπλοκότητα των σεναρίων εκκίνησης:

Αυτό υποδεικνύει ότι τα Init Containers έχουν εκτελεστεί με επιτυχία και τώρα, τα containers αρχικοποιούνται:

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

1. Για να δείτε λεπτομερείς πληροφορίες του pod:

2.  Για να δείτε τα αρχεία καταγραφής του pod:

Σημείωση: Υπάρχουν πολλές διαθέσιμες επιλογές για την εντολή “kubectl logs”, μπορείτε να εκτελέσετε την εντολή “kubectl logs –help” για να εξερευνήσετε περισσότερα σχετικά με αυτό.

3. Για να δείτε τα αρχεία καταγραφής ενός συγκεκριμένου container στο pod:

Συγχαρητήρια! Συνδέσατε με επιτυχία τον κώδικα της εφαρμογής και η υπηρεσία PHP-FPM είναι έτοιμη να χειριστεί συνδέσεις. Παρομοίως, μπορείτε να δημιουργήσετε το δικό σας Nginx Deployment.

Βήμα 5: Δημιουργήστε το δικό σας Nginx Deployment

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

Για να ξεκινήσετε, ανοίξτε ένα αρχείο nginx_configmap.yaml στον επεξεργαστή κειμένου σας:

Τώρα, ονομάστε αυτό το ConfigMap ως nginx-config και προσθέστε το στο microservice tier: backend:

Επιπλέον, μπορείτε να προσθέσετε τα δεδομένα στο ConfigMap. Προσθέστε ένα κλειδί με το όνομα config και προσθέστε όλα τα περιεχομένα του αρχείου ρυθμίσεων Nginx ως τιμή.

Καθώς είναι δυνατό για το Kubernetes να δρομολογεί αιτήματα στους αντίστοιχους κεντρικούς υπολογιστές για μια υπηρεσία, μπορείτε να εισαγάγετε το όνομα της υπηρεσίας PHP-FPM στην παράμετρο fastcgi_pass αντί για τη διεύθυνση IP της. Προσθέστε τις ακόλουθες γραμμές κώδικα στο αρχείο σας nginx_configMap.yaml:

Μόλις ολοκληρωθεί, το nginx_configMap.yaml αρχείο σας θα μοιάζει με αυτό:

Μπορείτε τώρα να αποθηκεύσετε και να βγείτε από τον επεξεργαστή. Τώρα εκτελέστε την kubectl apply εντολή για να δημιουργήσετε το ConfigMap:

Μετά από αυτό, θα πρέπει να δείτε το παρακάτω αποτέλεσμα στην οθόνη σας:

Δημιουργήσατε με επιτυχία το Nginx Configmap σας. Τώρα μπορείτε να δημιουργήσετε το Nginx Deployment σας.

Δημιουργία Nginx Deployment

Για να ξεκινήσετε, μπορείτε να δημιουργήσετε ένα νέο αρχείο με όνομα nginx_deployment.yaml στον επεξεργαστή:

Ονομάστε αυτό το Deployment nginx και προσθέστε την ετικέτα tier: backend σε αυτό:

Μετά από αυτό, καθορίστε τον αριθμό των αντιγράφων (replica count) προσθέτοντας το πεδίο replica στο spec του Deployment και προσθέστε τις ετικέτες app: nginx και tier: backend σε αυτό:

Παρομοίως, προσθέστε το πρότυπο pod. Βεβαιωθείτε ότι έχετε προσθέσει τις ίδιες ετικέτες που είχατε προσθέσει στο selector.matchLabels του Deployment. Μπορείτε να προσθέσετε τα εξής:

Δώστε στο Nginx πρόσβαση στο PVC κώδικα που δημιουργήθηκε νωρίτερα, προσθέτοντας τις ακόλουθες παραμέτρους κάτω από το spec.template.spec.volumes:

Σημείωση: Ένα pod μπορεί να προσαρτήσει το ConfigMap ως τόμο. Καθορίζοντας το όνομα του αρχείου και το κλειδί, θα δημιουργήσουμε ένα αρχείο με την τιμή του ως περιεχόμενο. Για να χρησιμοποιήσετε αυτό το ConfigMap, ορίστε τη διαδρομή στο όνομα του αρχείου που περιέχει τα περιεχόμενα του κλειδιού. Μπορείτε να δημιουργήσετε ένα αρχείο site.conf από το κλειδί config. Προσθέστε τα ακόλουθα κάτω από το spec.template.spec.volumes:

Προειδοποίηση: Τα περιεχόμενα του κλειδιού θα αντικαταστήσουν το mountPath του τόμου εάν δεν καθοριστεί αρχείο. Με άλλα λόγια, θα χάσετε όλα τα περιεχόμενα στον φάκελο προορισμού εάν δεν καθοριστεί ρητά μια διαδρομή.

Τώρα, καθορίστε το όνομα, την εικόνα και τη θύρα που θέλετε να χρησιμοποιήσετε στο pod σας. Εδώ, θα χρησιμοποιήσουμε την εικόνα nginx:1.7.9 και τη θύρα 80. Προσθέστε τα κάτω από το spec.template.spec ενότητα:

Επίσης, προσαρτήστε τον τόμο κώδικα στο /code καθώς τόσο το Nginx όσο και το PHP-FPM θα πρέπει να έχουν πρόσβαση στο αρχείο στην ίδια διαδρομή:

Η nginx-1.7.9 εικόνα φορτώνει αυτόματα οποιοδήποτε αρχείο ρυθμίσεων κάτω από τον φάκελο /etc/nginx/conf.d. Τώρα, αν προσαρτήσουμε τον τόμο config σε αυτόν τον κατάλογο, θα δημιουργήσει το /etc/nginx/conf.d/site.conf. Προσθέστε τα ακόλουθα κάτω από την ενότητα volumeMount ενότητα:

Μετά την ολοκλήρωση όλων των παραπάνω βημάτων, το αρχείο σας nginx_deployment.yaml θα πρέπει να μοιάζει με αυτό:

Μπορείτε τώρα να αποθηκεύσετε και να εξέλθετε από το αρχείο και να δημιουργήσετε το Nginx Deployment εκτελώντας την ακόλουθη εντολή:

Μετά την επιτυχή εκτέλεση της εντολής, θα πρέπει να δείτε το ακόλουθο αποτέλεσμα:

Μπορείτε να εμφανίσετε όλα τα Deployments σας εκτελώντας τις παρακάτω εντολές:

Θα πρέπει τώρα να δείτε τόσο το Nginx όσο και το PHP-FPM Deployments:

kubernetes deployment status

Επιπλέον, μπορείτε να εκτελέσετε την ακόλουθη εντολή για να εμφανίσετε τα pods που διαχειρίζονται και από τα δύο Deployments που αναφέρονται παραπάνω:

Θα δείτε ότι και τα δύο pods σας είναι σε λειτουργία όπως παρακάτω:

kubernetes pod status

Εφόσον όλα τα Kubernetes αντικείμενά σας είναι ενεργά σε αυτό το σημείο, μπορείτε τώρα να αποκτήσετε πρόσβαση στην υπηρεσία Nginx στο πρόγραμμα περιήγησής σας.

Εκτελέστε την ακόλουθη εντολή για να εμφανίσετε τις υπηρεσίες:

Σημειώστε την External IP της υπηρεσίας Nginx σας:external ip of nginx Deploy a PHP Application on Kubernetes Cluster with Ubuntu 18.04

Τώρα, χρησιμοποιώντας αυτήν την External IP της υπηρεσίας Nginx, μπορείτε να επισκεφθείτε τον διακομιστή σας πληκτρολογώντας http://your_public_ip στο πρόγραμμα περιήγησής σας. Θα πρέπει να μπορείτε να δείτε το αποτέλεσμα του php_info() που επιβεβαιώνει ότι οι Kubernetes υπηρεσίες σας είναι σε λειτουργία.

Συμπέρασμα

Σε αυτόν τον οδηγό, για να διαχειριστείτε τις υπηρεσίες PHP-FPM και Nginx ανεξάρτητα, μετατρέψατε σε container τις δύο υπηρεσίες. Με αυτόν τον τρόπο, όχι μόνο θα βελτιώσετε την επεκτασιμότητα του έργου σας, αλλά θα χρησιμοποιήσετε επίσης τους πόρους σας αποτελεσματικά. Μάθατε επίσης πώς να δημιουργείτε τοπικό χώρο αποθήκευσης και ένα Persistent Volume για να αποθηκεύετε τον κώδικα της εφαρμογής σας σε έναν τόμο και να μπορείτε να ενημερώνετε εύκολα τις υπηρεσίες σας στο μέλλον. Με αυτόν τον τρόπο, βελτιώσατε τη χρηστικότητα και τη δυνατότητα συντήρησης του κώδικά σας.

Επιπλέον, ρίξτε μια ματιά στους άλλους οδηγούς μας που εστιάζουν στα Docker και Kubernetes και τους οποίους μπορείτε να βρείτε στο blog μας:

Καλή συνέχεια!

author

Hark Labs

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.