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 για αυτό.
Προαπαιτούμενα
- Μια βασική κατανόηση του Kubernetes (k8s) και των αντικειμένων του. Ανατρέξτε σε αυτόν τον οδηγό για μια λεπτομερή επισκόπηση του οικοσυστήματος του Kubernetes.
- Μια συστάδα Kubernetes που είναι σε λειτουργία σε Ubuntu 18.04. Ακολουθήστε αυτόν τον οδηγό για να δημιουργήσετε τη δική σας συστάδα Kubernetes χρησιμοποιώντας το kubeadm.
- Επιπλέον, πρέπει να φιλοξενήσετε τον κώδικα της εφαρμογής σας σε μια δημόσια διεύθυνση 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 έχει τουλάχιστον τις ακόλουθες ετικέτες:
apiVersion: Η έκδοση του Kubernetes API στην οποία ανήκει ο ορισμός.kind: Το είδος του αντικειμένου Kubernetes που δημιουργεί αυτό το αρχείο YAML. Για παράδειγμα: μιαservice, μιαjob, ή έναpod.metadata: Το όνομα του αντικειμένου και οι διάφορεςlabelsπου μπορεί να θέλει να εφαρμόσει ο χρήστης σε αυτό το αντικείμενο ορίζονται κάτω από αυτήν την ετικέτα.spec: Αυτή η ετικέτα περιέχει τις προδιαγραφές του αντικειμένου σας, όπως ENVs, το container image που θα χρησιμοποιηθεί, τις θύρες στις οποίες θα είναι προσβάσιμη η υπηρεσία του κοντέινερ.
Δημιουργία της υπηρεσίας PHP-FPM
Για να ξεκινήσετε, θα πρέπει να δημιουργήσετε έναν κατάλογο για να διατηρήσετε τον ορισμό του αντικειμένου Kubernetes. Συνδεθείτε στο master node σας και δημιουργήστε έναν κατάλογο με το όνομα “definitions:”
|
1 |
mkdir definitions |
Αλλάξτε τον κατάλογο στον κατάλογο definitions:
|
1 |
cd definitions |
Στη συνέχεια, δημιουργήστε το αρχείο υπηρεσίας PHP-FPM ως αρχείο php_service.yaml:
|
1 |
nano php_fpm_service.yaml |
Μετά από αυτό, ορίστε τα apiVersion και kind στο αρχείο php_fpm_service.yaml:
|
1 2 |
apiVersion: v1 kind: Service |
Ονομάστε την υπηρεσία σας ως php ή php-fpm καθώς θα παρέχει πρόσβαση στην εφαρμογή σας PHP-FPM:
|
1 2 3 |
… Metadata: name: php |
Βάλτε ετικέτα στην υπηρεσία php σας ως tier: backend καθώς η εφαρμογή PHP θα εκτελείται πίσω από αυτήν την υπηρεσία:
|
1 2 3 |
… labels: tier: backend |
Μια υπηρεσία χρησιμοποιεί τις ετικέτες selector για να καθορίσει σε ποια pods θα έχει πρόσβαση. Οποιοδήποτε pod ταιριάζει με αυτές τις ετικέτες, ανεξάρτητα από το πότε δημιουργήθηκε το pod, εξυπηρετείται. Θα μάθετε πώς να προσθέτετε ετικέτες στα pods σας αργότερα σε αυτόν τον οδηγό.
Συμπεριλάβετε την tier: backend ετικέτα που εκχωρεί το pod σας στο backend tier, μαζί με την app: php-fpm ετικέτα για να υποδείξετε ότι το pod εκτελεί μια εφαρμογή PHP-FPM. Πρέπει να προσθέσετε αυτές τις ετικέτες μετά την ενότητα metadata:
|
1 2 3 4 5 |
… spec: selector: app: php-fpm tier: backend |
Στη συνέχεια, πρέπει να δηλώσετε τη θύρα για πρόσβαση σε αυτήν την υπηρεσία php-fpm στο πλαίσιο του spec. Μπορείτε να προσθέσετε οποιαδήποτε θύρα της επιλογής σας, αλλά θα χρησιμοποιήσουμε τη θύρα 9000 σε αυτόν τον οδηγό:
|
1 2 3 4 |
... ports: - protocol: TCP port: 9000 |
Μόλις ολοκληρώσετε τα παραπάνω βήματα, το αρχείο σας php_fpm_service.yaml θα μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: php labels: tier: backend spec: selector: app: php tier: backend ports: - protocol: TCP port: 9000 |
Πατήστε Ctrl + O για να αποθηκεύσετε το αρχείο, και μετά πατήστε Ctrl + X για να βγείτε από το nano.
Εφαρμογή της εντολής kubectl για τη δημιουργία της υπηρεσίας PHP
Αφού δημιουργηθεί ο ορισμός αντικειμένου για την υπηρεσία σας, εκτελέστε την εντολή kubectl apply με το όρισμα -f προσδιορίζοντας το αρχείο σας php_fpm_service.yaml:
|
1 |
kubectl apply -f php_fpm_service.yaml |
Το αποτέλεσμα της παραπάνω εντολής θα πρέπει να είναι:
|
1 |
service/php δημιουργήθηκε |
Εκτελέστε την παρακάτω εντολή για να επαληθεύσετε ότι η υπηρεσία php-fpm εκτελείται:
|
1 |
$ kubectl get svc |
Θα μπορείτε να δείτε την υπηρεσία php-fpm σε λειτουργία:
|
1 2 3 |
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m php ClusterIP 10.100.59.238 <none> 9000/TCP 5m |
Δημιουργία της υπηρεσίας Nginx
Εφόσον η υπηρεσία PHP-FPM είναι έτοιμη τώρα, ήρθε η ώρα να δημιουργήσετε και την υπηρεσία Nginx. Δημιουργήστε και ανοίξτε ένα νέο αρχείο YAML για αυτήν την υπηρεσία, με το όνομα nginx_service.yaml στον επεξεργαστή κειμένου:
|
1 |
$ nano nginx_service.yaml |
Ονομάστε αυτήν την υπηρεσία ως nginx καθώς θα στοχεύει τα Nginx pods. Αυτή η υπηρεσία ανήκει επίσης στο backend, επομένως θα πρέπει να προσθέσετε μια ετικέτα tier: backend σε αυτήν:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: Service metadata: name: nginx labels: tier: backend |
Όπως κάναμε στην υπηρεσία php-fpm, προσθέστε τις ετικέτες επιλογέα app: nginx και tier: backend για να στοχεύσετε τα pods. Προσθέστε την προεπιλεγμένη θύρα HTTP 80 για πρόσβαση σε αυτήν την υπηρεσία:
|
1 2 3 4 5 6 7 8 |
... spec: selector: app: nginx tier: backend ports: - protocol: TCP port: 80 |
Η υπηρεσία Nginx μπορεί να είναι δημόσια προσβάσιμη στο διαδίκτυο από τη δημόσια διεύθυνση IP. Μπορείτε να προσθέσετε την IP του worker node σας ως your_public_ip. Προσθέστε τις παρακάτω γραμμές κάτω από το spec.externalIPs:
|
1 2 3 4 5 |
... spec: externalIPs: - your_public_ip |
Το αρχείο σας nginx_service.yaml θα πρέπει να μοιάζει με το παρακάτω μόλις ολοκληρώσετε όλα τα παραπάνω βήματα:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: v1 kind: Service metadata: name: nginx labels: tier: backend spec: selector: app: nginx tier: backend ports: - protocol: TCP port: 80 externalIPs: - your_public_ip |
Αποθηκεύστε και κλείστε το αρχείο αφού προσθέσετε όλες τις απαιτούμενες παραμέτρους παραπάνω.
Εφαρμογή της εντολής kubectl για τη δημιουργία της υπηρεσίας Nginx
|
1 |
kubectl apply -f nginx_service.yaml |
|
1 |
service/nginx δημιουργήθηκε |
|
1 |
$ kubectl get svc |
|
1 2 3 4 |
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 50s php ClusterIP 10.100.59.238 <none> 9000/TCP 8m |
|
1 |
$ kubectl delete svc/service_name |
Βήμα 2: Δημιουργία Τοπικού Χώρου Αποθήκευσης και Persistent Volume
Το Kubernetes παρέχει διάφορα πρόσθετα αποθήκευσης (storage plug-ins) που σας βοηθούν να δημιουργήσετε χώρο αποθήκευσης για το περιβάλλον σας. Αυτό το βήμα θα σας καθοδηγήσει στο πώς να δημιουργήσετε ένα τοπικό StorageClass και πώς αυτή η Storage Class μπορεί να χρησιμοποιηθεί περαιτέρω για τη δημιουργία Persistent Volume.
Δημιουργία τοπικού χώρου αποθήκευσης
Δημιουργήστε ένα αρχείο, για παράδειγμα το storageClass.yaml, στον επεξεργαστή κειμένου σας:
|
1 |
$nano storageClass.yaml |
Προσθέστε το kind ως "storageClass" και το apiVersion ως "storage.k8s.io/v1" ως εξής:
|
1 2 |
kind: StorageClass apiVersion: storage.k8s.io/v1 |
Ονομάστε αυτή τη StorageClass ως "my-local-storage" και προσθέστε τα provisioner και volumeBindingMode ως εξής:
|
1 2 3 4 5 |
… metadata: name: my-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate |
Αποθηκεύστε και κλείστε το αρχείο και το τελικό σας αρχείο storageClass.yaml θα πρέπει να μοιάζει με αυτό:
|
1 2 3 4 5 6 |
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: my-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer |
Τώρα, δημιουργήστε τη StorageClass εκτελώντας την εντολή kubectl create, όπως παρακάτω:
|
1 |
$ kubectl create -f storageClass.yaml |
Μετά την εκτέλεση της παραπάνω εντολής, θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:
|
1 |
storageclass.storage.k8s.io/my-local-storage δημιουργήθηκε |
Δημιουργία τοπικού 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, στον επεξεργαστή κειμένου σας:
|
1 |
$ nano persistentVolume.yaml |
Δώστε σε αυτό το persistent volume ένα όνομα, για παράδειγμα "my-local-pv":
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolume metadata: name: my-local-pv |
Μπορείτε να προσθέσετε χωρητικότητα αποθήκευσης ανάλογα με τη χρήση σας κατά τη δημιουργία ενός τοπικού Persistent Volume. Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε 5 Gi για τον χώρο αποθήκευσης:
|
1 2 3 4 |
… spec: capacity: storage: 5Gi |
Προσθέστε τα accessModes, persistentVolumeReclaimPolicy, και παρέχετε το ίδιο storageClassName με αυτό που χρησιμοποιήθηκε στο storageClass.yaml:
|
1 2 3 4 5 |
… accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: my-local-storage |
Προσθέστε το local.path για τον Persistent Volume σας όπως παρακάτω:
|
1 2 3 |
… local: path: /mnt/disk/vol |
Αφού προσθέσετε όλα τα απαιτούμενα πεδία, το αρχείο σας persistentVolume.yaml θα πρέπει να μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: v1 kind: PersistentVolume metadata: name: my-local-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: my-local-storage local: path: /mnt/disk/vol nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - worker |
Προετοιμασία τοπικού τόμου
Τώρα, πρέπει να προετοιμάσουμε έναν τοπικό τόμο στον κόμβο “worker” όπως έχουμε προσθέσει στο αρχείο persistentVolume.yaml . Εκτελέστε τις παρακάτω εντολές στον κόμβο που έχετε ρυθμίσει στο persistentVolume. Σε αυτήν την περίπτωση, είναι ο κόμβος “worker”:
|
1 2 3 |
$ DIRNAME="vol" $ mkdir -p /mnt/disk/$DIRNAME $ chmod 777 /mnt/disk/$DIRNAME |
Εκτελέστε την παρακάτω εντολή στον κύριο κόμβο όπου βρίσκεται το αρχείο σας persistentVolume.yaml :
|
1 |
kubectl create -f persistentVolume.yaml |
Θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:
|
1 |
persistentvolume/my-local-pv created |
Εφόσον δημιουργήσατε με επιτυχία την τοπική σας αποθήκευση και τον Persistent Volume, μπορείτε τώρα να προχωρήσετε και να δημιουργήσετε ένα Persistent Volume Claim για να διατηρήσετε τον κώδικα της εφαρμογής σας και τα αρχεία ρυθμίσεων.
Step 3: Create the Persistent Volume
Ο κώδικας της εφαρμογής σας πρέπει να διατηρείται ασφαλής ενώ διαχειρίζεστε ή ενημερώνετε τα pods σας. Για αυτό, θα χρησιμοποιήσετε τον Persistent Volume, που δημιουργήθηκε στο προηγούμενο βήμα, στον οποίο αποκτάται πρόσβαση χρησιμοποιώντας ένα PersistentVolumeClaim ή PVC. Αυτό το PVC προσαρτά τον PV στην απαιτούμενη διαδρομή.
Ανοίξτε ένα αρχείο, ας πούμε το code_volume.yaml, στο πρόγραμμα επεξεργασίας σας:
|
1 |
$ nano code_volume.yaml |
Ονομάστε το PVC σας ως code προσθέτοντας τις παρακάτω παραμέτρους και τιμές στο αρχείο σας:
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: code |
Η ενότητα spec ενός PVC περιλαμβάνει τα ακόλουθα στοιχεία:
- accessModes: Υπάρχουν διάφορες πιθανές τιμές για αυτό το πεδίο ως εξής:
- ReadWriteOnce – Προσαρτά τον τόμο για έναν μόνο κόμβο με δικαιώματα ανάγνωσης και εγγραφής.
- ReadOnlyMany – Προσαρτά τον τόμο για πολλούς κόμβους μόνο με δικαίωμα ανάγνωσης.
- ReadWriteMany – Προσαρτά τον τόμο για πολλούς κόμβους με δικαιώματα ανάγνωσης και εγγραφής.
- resources: Ορίζει τον απαιτούμενο χώρο αποθήκευσης.
Εφόσον ο τοπικός χώρος αποθήκευσης είναι προσαρτημένος μόνο σε έναν κόμβο, θα πρέπει να ορίσετε το accessMode σε ReadWriteOnce. Σε αυτόν τον οδηγό θα προσθέσετε μόνο ένα μικρό κομμάτι κώδικα εφαρμογής, επομένως 1GB αποθηκευτικού χώρου θα είναι επαρκές εδώ. Ωστόσο, εάν επιθυμείτε να αποθηκεύσετε μεγαλύτερο όγκο δεδομένων ή κώδικα, μπορείτε να τροποποιήσετε την παράμετρο storage σύμφωνα με τις απαιτήσεις σας. Σημειώστε ότι μόλις δημιουργηθεί ο τόμος, θα μπορείτε να αυξήσετε το μέγεθος του αποθηκευτικού χώρου. Ωστόσο, η μείωσή του δεν υποστηρίζεται:
|
1 2 3 4 5 6 7 |
... spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi |
Τώρα, δηλώστε την κλάση αποθήκευσης που θα χρησιμοποιήσει το σύμπλεγμα Kubernetes για να εκχωρήσει στους τόμους. Χρησιμοποιήστε την κλάση αποθήκευσης my-local-storage, που δημιουργήθηκε στο προηγούμενο βήμα, εδώ για το storageClassName σας:
|
1 2 |
... storageClassName: my-local-storage |
Μετά την ολοκλήρωση των παραπάνω βημάτων, το αρχείο σας code_volume.yaml θα πρέπει να μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: code spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: my-local-storage |
Τώρα αποθηκεύστε και κλείστε το αρχείο.
Δημιουργία PVC
Δημιουργήστε το PVC κώδικα εκτελώντας την εντολή kubectl apply:
|
1 |
$ kubectl apply -f code_volume.yaml |
Θα πρέπει να λάβετε το ακόλουθο αποτέλεσμα που υποδεικνύει ότι το αντικείμενο δημιουργήθηκε με επιτυχία και είναι έτοιμο για να μπορέσετε να προσαρτήσετε το PVC 1GB ως τόμο:
|
1 |
persistentvolumeclaim/code created |
Μπορείτε να εκτελέσετε την ακόλουθη εντολή για να ελέγξετε τον διαθέσιμο Μόνιμο Τόμο (PV):
|
1 |
$ kubectl get pv |
Το αποτέλεσμα της παραπάνω εντολής θα πρέπει να είναι το εξής:
|
1 2 |
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-ca4df10f-ab8c-11e8-b89d-12331aa95b13 1Gi RWO Delete Bound default/code do-block-storage 2m |
Όλα τα παραπάνω πεδία, εκτός από τα 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. Τα περιεχόμενα του δείγματος αρχείου είναι:
|
1 2 |
<?php echo phpinfo(); |
Δημιουργία PHP Deployment
Ανοίξτε ένα νέο αρχείο με όνομα php_deployment.yaml στον επεξεργαστή κειμένου σας για να δημιουργήσετε το Deployment σας:
|
1 |
$ nano php_deployment.yaml |
Τώρα, ονομάστε το αντικείμενο Deployment PHP καθώς αυτό το Deployment θα διαχειρίζεται τα PHP-FPM pods σας. Προσθέστε την ετικέτα tier: backend επειδή το pod θα ανήκει στο backend tier:
|
1 2 3 4 5 6 |
apiVersion: apps/v1 kind: Deployment metadata: name: php labels: tier: backend |
Χρησιμοποιώντας την παράμετρο replica, καθορίστε τον αριθμό των αντιγράφων αυτού του pod που πρέπει να δημιουργηθούν. Ο αριθμός των replicas μπορεί να διαφέρει ανάλογα με τις απαιτήσεις σας και τους διαθέσιμους πόρους. Σε αυτόν τον οδηγό, θα δημιουργήσετε μόνο ένα replica του pod σας:
|
1 2 3 4 |
... spec: replicas: 1 |
Προσθέστε app: php και tier:backend ετικέτες κάτω από το κλειδί selector που υποδηλώνει ότι αυτό το Deployment θα διαχειρίζεται pods που ταιριάζουν με αυτές τις δύο ετικέτες:
|
1 2 3 4 5 |
... selector: matchLabels: app: php tier: backend |
Τώρα, ο ορισμός αντικειμένου του pod σας χρειάζεται ένα template κάτω από το spec του Deployment σας. Αυτό το template ορίζει τις προδιαγραφές που απαιτούνται για τη δημιουργία του pod σας. Για αρχή, προσθέστε τις ετικέτες που καθορίστηκαν για τον επιλογέα υπηρεσίας php και τα matchLabels του Deployment. Στη συνέχεια, προσθέστε app:php και tier:backend κάτω από το template.metadata.labels:
|
1 2 3 4 5 6 7 |
... template: metadata: labels: app: php tier: backend |
Πρώτα, πρέπει να καθορίσετε όλα τα volumes στα οποία θα έχουν πρόσβαση τα containers σας. Ονομάστε αυτό το volume code καθώς είχατε δημιουργήσει ένα PVC με το όνομα code για να κρατάει τον κώδικα της εφαρμογής σας:
|
1 2 3 4 5 6 |
... spec: volumes: - name: code persistentVolumeClaim: claimName: code |
Στη συνέχεια, καθορίστε το όνομα του container μαζί με την εικόνα (image) που θέλετε να εκτελέσετε μέσα στο pod σας. Υπάρχουν διάφορες εικόνες διαθέσιμες στο Docker store (https://hub.docker.com/explore/), αλλά σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε την εικόνα php:7-fpm:
|
1 2 3 4 |
... containers: - name: php image: php:7-fpm |
Τώρα, προσαρτήστε τα volumes στα οποία απαιτεί πρόσβαση το container. Εφόσον αυτό το container θα εκτελεί τον php κώδικά σας, θα χρειαστεί πρόσβαση στο volume code που δημιουργήθηκε στο προηγούμενο βήμα. Σε αυτό το βήμα, θα μάθετε επίσης πώς να αντιγράφετε τον κώδικα της εφαρμογής σας χρησιμοποιώντας ένα Init Container.
Για να κατεβάσετε τον κώδικα, αυτός ο οδηγός θα σας καθοδηγήσει στο πώς να χρησιμοποιήσετε ένα μόνο Init Container με busybox. Το Busybox είναι ένα μικρό container με το εργαλείο wget που θα χρησιμοποιήσετε για να το πετύχετε αυτό.
Πρώτα, προσθέστε το initContainer σας κάτω από το spec.template.spec και καθορίστε την εικόνα busybox:
|
1 2 3 4 |
... initContainers: - name: install image: busybox |
Στη συνέχεια, για να κατεβάσετε τον κώδικα στο volume code, το Init Container σας θα χρειαστεί πρόσβαση σε αυτό. Προσαρτήστε το volume code στη διαδρομή /code κάτω από το spec.template.spec.initContainers:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Κάθε Init Container απαιτείται να εκτελεί μια εντολή. Αυτό το Init Container θα χρησιμοποιήσει το wget για να κατεβάσει τον code από το Github στον κατάλογο /code. Μπορείτε να περάσετε μια επιλογή -O για να δώσετε ένα όνομα σε αυτό το ληφθέν αρχείο, και μπορείτε να ονομάσετε αυτό το αρχείο index.php.
Επιπλέον, προσθέστε τις παρακάτω γραμμές κάτω από το install container στο spec.template.spec.initContainers:
|
1 2 3 4 5 6 |
... command: - wget - "-O" - "/code/index.php" - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php |
Αφού ολοκληρώσετε όλα αυτά τα βήματα, το php_deployment.yaml αρχείο σας θα πρέπει να μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
apiVersion: apps/v1 kind: Deployment metadata: name: php labels: tier: backend spec: replicas: 1 selector: matchLabels: app: php tier: backend template: metadata: labels: app: php tier: backend spec: volumes: - name: code persistentVolumeClaim: claimName: code containers: - name: php image: php:7-fpm volumeMounts: - name: code mountPath: /code initContainers: - name: install image: busybox volumeMounts: - name: code mountPath: /code command: - wget - "-O" - "/code/index.php" - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php |
Μπορείτε τώρα να αποθηκεύσετε το αρχείο και να εξέλθετε. Στη συνέχεια, δημιουργήστε το PHP-FPM Deployment σας χρησιμοποιώντας την kubectl apply εντολή:
|
1 |
$ kubectl apply -f php_deployment.yaml |
Η επιτυχής δημιουργία του Deployment θα πρέπει να σας δώσει το παρακάτω αποτέλεσμα:
|
1 |
deployment.apps/php created |
Αυτό το Deployment ξεκινά με τη λήψη των καθορισμένων εικόνων, στη συνέχεια θα ζητήσει το PersistentVolume από το PersistentVolumeClaim, και στη συνέχεια θα εκτελέσει τα initContainers. Μόλις ολοκληρωθεί αυτό το βήμα, τα containers θα εκτελεστούν και θα προσαρτήσουν τους τόμους στο καθορισμένο σημείο προσάρτησης. Αφού ολοκληρώσετε όλα αυτά τα βήματα, το pod σας θα είναι σε λειτουργία.
Μπορείτε να εκτελέσετε την παρακάτω εντολή για να δείτε το Deployment σας:
|
1 |
$ kubectl get deployments |
Μετά την εκτέλεση της παραπάνω εντολής, θα πρέπει να λάβετε το παρακάτω αποτέλεσμα:
|
1 2 |
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php 1 1 1 0 19s |
Μπορείτε να κατανοήσετε την τρέχουσα κατάσταση του Deployment με τη βοήθεια αυτού του αποτελέσματος. Ένα Deployment είναι ένας ελεγκτής που διατηρεί την επιθυμητή κατάσταση. Το πεδίο DESIRED καθορίζει ότι έχει 1 αντίγραφο του pod με το όνομα php. Το πεδίο CURRENT υποδεικνύει πόσα αντίγραφα της DESIRED κατάστασης εκτελούνται επί του παρόντος. Για ένα υγιές pod, αυτό θα πρέπει να ταιριάζει με την DESIRED κατάσταση. Μπορείτε να μάθετε περισσότερα για τα υπόλοιπα πεδία στην Τεκμηρίωση.
Μετά από αυτό, για να ελέγξετε την κατάσταση του pod που εκτελείται, μπορείτε να εκτελέσετε την παρακάτω εντολή:
|
1 |
$ kubectl get pods |
Το αποτέλεσμα αυτής της εντολής μπορεί να διαφέρει ανάλογα με τον χρόνο που έχει παρέλθει από τη δημιουργία του Deployment σας. Εάν εκτελεστεί λίγο μετά τη δημιουργία του Deployment, το αποτέλεσμα θα είναι παρόμοιο με:
|
1 2 |
NAME READY STATUS RESTARTS AGE php-5d8f6bbf7f-56df2 0/1 Init:0/1 0 9s |
Επεξήγηση:
Αυτές οι στήλες αντιπροσωπεύουν τις πληροφορίες ως εξής:
- Ready: Ο αριθμός των τρεχόντων/επιθυμητών αντιγράφων που εκτελούν αυτό το pod.
- Status: Η κατάσταση του pod σας. Το Init:0/1 υποδεικνύει ότι τα Init Containers εκτελούνται και 0 από τα 1 Init Containers έχουν ολοκληρώσει την εκτέλεσή τους.
- Restarts: Αυτό υποδεικνύει τον αριθμό των φορών που αυτή η διαδικασία έχει επανεκκινηθεί για να ξεκινήσει το pod.
Το pod σας μπορεί να χρειαστεί μερικά λεπτά για να αλλάξει η κατάσταση σε podInitializing ανάλογα με την πολυπλοκότητα των σεναρίων εκκίνησης:
|
1 2 |
NAME READY STATUS RESTARTS AGE php-5d8f6bbf7f-56df2 0/1 podInitializing 0 39s |
Αυτό υποδεικνύει ότι τα Init Containers έχουν εκτελεστεί με επιτυχία και τώρα, τα containers αρχικοποιούνται:
|
1 2 |
NAME READY STATUS RESTARTS AGE php-5d8f6bbf7f-56df2 1/1 Running 0 4m10s |
Όπως μπορείτε να δείτε τώρα, το pod σας είναι σε λειτουργία. Ωστόσο, σε περίπτωση που το pod σας δεν ξεκινήσει, μπορείτε να εκτελέσετε τις παρακάτω εντολές για σκοπούς αποσφαλμάτωσης:
1. Για να δείτε λεπτομερείς πληροφορίες του pod:
|
1 |
$ kubectl describe pods pod-name |
2. Για να δείτε τα αρχεία καταγραφής του pod:
|
1 |
$ kubectl logs pod-name |
3. Για να δείτε τα αρχεία καταγραφής ενός συγκεκριμένου container στο pod:
|
1 |
$ kubectl logs pod-name container-name |
Συγχαρητήρια! Συνδέσατε με επιτυχία τον κώδικα της εφαρμογής και η υπηρεσία PHP-FPM είναι έτοιμη να χειριστεί συνδέσεις. Παρομοίως, μπορείτε να δημιουργήσετε το δικό σας Nginx Deployment.
Βήμα 5: Δημιουργήστε το δικό σας Nginx Deployment
Αυτό το βήμα θα σας καθοδηγήσει στο πώς να ρυθμίσετε το Nginx χρησιμοποιώντας ένα ConfigMap. Ένα ConfigMap διατηρεί όλες τις απαιτούμενες ρυθμίσεις σας σε μορφή κλειδιού-τιμής που θα χρησιμοποιηθούν σε άλλους ορισμούς αντικειμένων Kubernetes. Με αυτήν την προσέγγιση, θα έχετε την ευελιξία να επαναχρησιμοποιήσετε ή να αντικαταστήσετε την εικόνα Nginx με μια διαφορετική έκδοση, όποτε απαιτείται. Μπορείτε να ενημερώσετε το ConfigMap και θα αναπαράγει αυτόματα αυτές τις αλλαγές σε οποιοδήποτε pod που προσαρτά αυτό το ConfigMap.
Για να ξεκινήσετε, ανοίξτε ένα αρχείο nginx_configmap.yaml στον επεξεργαστή κειμένου σας:
|
1 |
$ nano nginx_configMap.yaml |
Τώρα, ονομάστε αυτό το ConfigMap ως nginx-config και προσθέστε το στο microservice tier: backend:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config labels: tier: backend |
Επιπλέον, μπορείτε να προσθέσετε τα δεδομένα στο ConfigMap. Προσθέστε ένα κλειδί με το όνομα config και προσθέστε όλα τα περιεχομένα του αρχείου ρυθμίσεων Nginx ως τιμή.
Καθώς είναι δυνατό για το Kubernetes να δρομολογεί αιτήματα στους αντίστοιχους κεντρικούς υπολογιστές για μια υπηρεσία, μπορείτε να εισαγάγετε το όνομα της υπηρεσίας PHP-FPM στην παράμετρο fastcgi_pass αντί για τη διεύθυνση IP της. Προσθέστε τις ακόλουθες γραμμές κώδικα στο αρχείο σας nginx_configMap.yaml:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
... data: config : | server { index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /code; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } |
Μόλις ολοκληρωθεί, το nginx_configMap.yaml αρχείο σας θα μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config labels: tier: backend data: config : | server { index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /code; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } |
Μπορείτε τώρα να αποθηκεύσετε και να βγείτε από τον επεξεργαστή. Τώρα εκτελέστε την kubectl apply εντολή για να δημιουργήσετε το ConfigMap:
|
1 |
$ kubectl apply -f nginx_configMap.yaml |
Μετά από αυτό, θα πρέπει να δείτε το παρακάτω αποτέλεσμα στην οθόνη σας:
|
1 |
configmap/nginx-config created |
Δημιουργήσατε με επιτυχία το Nginx Configmap σας. Τώρα μπορείτε να δημιουργήσετε το Nginx Deployment σας.
Δημιουργία Nginx Deployment
Για να ξεκινήσετε, μπορείτε να δημιουργήσετε ένα νέο αρχείο με όνομα nginx_deployment.yaml στον επεξεργαστή:
|
1 |
$ nano nginx_deployment.yaml |
Ονομάστε αυτό το Deployment nginx και προσθέστε την ετικέτα tier: backend σε αυτό:
|
1 2 3 4 5 6 7 |
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: tier: backend |
Μετά από αυτό, καθορίστε τον αριθμό των αντιγράφων (replica count) προσθέτοντας το πεδίο replica στο spec του Deployment και προσθέστε τις ετικέτες app: nginx και tier: backend σε αυτό:
|
1 2 3 4 5 6 7 |
... spec: replicas: 1 selector: matchLabels: app: nginx tier: backend |
Παρομοίως, προσθέστε το πρότυπο pod. Βεβαιωθείτε ότι έχετε προσθέσει τις ίδιες ετικέτες που είχατε προσθέσει στο selector.matchLabels του Deployment. Μπορείτε να προσθέσετε τα εξής:
|
1 2 3 4 5 6 |
... template: metadata: labels: app: nginx tier: backend |
Δώστε στο Nginx πρόσβαση στο PVC κώδικα που δημιουργήθηκε νωρίτερα, προσθέτοντας τις ακόλουθες παραμέτρους κάτω από το spec.template.spec.volumes:
|
1 2 3 4 5 6 |
... spec: volumes: - name: code persistentVolumeClaim: claimName: code |
|
1 2 3 4 5 6 7 |
... - name: config configMap: name: nginx-config items: - key: config path: site.conf |
Προειδοποίηση: Τα περιεχόμενα του κλειδιού θα αντικαταστήσουν το mountPath του τόμου εάν δεν καθοριστεί αρχείο. Με άλλα λόγια, θα χάσετε όλα τα περιεχόμενα στον φάκελο προορισμού εάν δεν καθοριστεί ρητά μια διαδρομή.
Τώρα, καθορίστε το όνομα, την εικόνα και τη θύρα που θέλετε να χρησιμοποιήσετε στο pod σας. Εδώ, θα χρησιμοποιήσουμε την εικόνα nginx:1.7.9 και τη θύρα 80. Προσθέστε τα κάτω από το spec.template.spec ενότητα:
|
1 2 3 4 5 6 |
... containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 |
Επίσης, προσαρτήστε τον τόμο κώδικα στο /code καθώς τόσο το Nginx όσο και το PHP-FPM θα πρέπει να έχουν πρόσβαση στο αρχείο στην ίδια διαδρομή:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Η nginx-1.7.9 εικόνα φορτώνει αυτόματα οποιοδήποτε αρχείο ρυθμίσεων κάτω από τον φάκελο /etc/nginx/conf.d. Τώρα, αν προσαρτήσουμε τον τόμο config σε αυτόν τον κατάλογο, θα δημιουργήσει το /etc/nginx/conf.d/site.conf. Προσθέστε τα ακόλουθα κάτω από την ενότητα volumeMount ενότητα:
|
1 2 3 |
... - name: config mountPath: /etc/nginx/conf.d |
Μετά την ολοκλήρωση όλων των παραπάνω βημάτων, το αρχείο σας nginx_deployment.yaml θα πρέπει να μοιάζει με αυτό:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: tier: backend spec: replicas: 1 selector: matchLabels: app: nginx tier: backend template: metadata: labels: app: nginx tier: backend spec: volumes: - name: code persistentVolumeClaim: claimName: code - name: config configMap: name: nginx-config items: - key: config path: site.conf containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 volumeMounts: - name: code mountPath: /code - name: config mountPath: /etc/nginx/conf.d |
Μπορείτε τώρα να αποθηκεύσετε και να εξέλθετε από το αρχείο και να δημιουργήσετε το Nginx Deployment εκτελώντας την ακόλουθη εντολή:
|
1 |
$ kubectl apply -f nginx_deployment.yaml |
Μετά την επιτυχή εκτέλεση της εντολής, θα πρέπει να δείτε το ακόλουθο αποτέλεσμα:
|
1 |
deployment.apps/nginx created |
Μπορείτε να εμφανίσετε όλα τα Deployments σας εκτελώντας τις παρακάτω εντολές:
|
1 |
$ kubectl get deployments |
Θα πρέπει τώρα να δείτε τόσο το Nginx όσο και το PHP-FPM Deployments:
Επιπλέον, μπορείτε να εκτελέσετε την ακόλουθη εντολή για να εμφανίσετε τα pods που διαχειρίζονται και από τα δύο Deployments που αναφέρονται παραπάνω:
|
1 |
$ kubectl get pods |
Θα δείτε ότι και τα δύο pods σας είναι σε λειτουργία όπως παρακάτω:
Εφόσον όλα τα Kubernetes αντικείμενά σας είναι ενεργά σε αυτό το σημείο, μπορείτε τώρα να αποκτήσετε πρόσβαση στην υπηρεσία Nginx στο πρόγραμμα περιήγησής σας.
Εκτελέστε την ακόλουθη εντολή για να εμφανίσετε τις υπηρεσίες:
|
1 |
$ kubectl get services -o wide |
Σημειώστε την External IP της υπηρεσίας Nginx σας:
Τώρα, χρησιμοποιώντας αυτήν την External IP της υπηρεσίας Nginx, μπορείτε να επισκεφθείτε τον διακομιστή σας πληκτρολογώντας http://your_public_ip στο πρόγραμμα περιήγησής σας. Θα πρέπει να μπορείτε να δείτε το αποτέλεσμα του php_info() που επιβεβαιώνει ότι οι Kubernetes υπηρεσίες σας είναι σε λειτουργία.
Συμπέρασμα
Σε αυτόν τον οδηγό, για να διαχειριστείτε τις υπηρεσίες PHP-FPM και Nginx ανεξάρτητα, μετατρέψατε σε container τις δύο υπηρεσίες. Με αυτόν τον τρόπο, όχι μόνο θα βελτιώσετε την επεκτασιμότητα του έργου σας, αλλά θα χρησιμοποιήσετε επίσης τους πόρους σας αποτελεσματικά. Μάθατε επίσης πώς να δημιουργείτε τοπικό χώρο αποθήκευσης και ένα Persistent Volume για να αποθηκεύετε τον κώδικα της εφαρμογής σας σε έναν τόμο και να μπορείτε να ενημερώνετε εύκολα τις υπηρεσίες σας στο μέλλον. Με αυτόν τον τρόπο, βελτιώσατε τη χρηστικότητα και τη δυνατότητα συντήρησης του κώδικά σας.
Επιπλέον, ρίξτε μια ματιά στους άλλους οδηγούς μας που εστιάζουν στα Docker και Kubernetes και τους οποίους μπορείτε να βρείτε στο blog μας:
- Γνωρίζοντας το Kubernetes
- Πώς να δημιουργήσετε ένα Kubernetes Cluster χρησιμοποιώντας το Kubeadm στο Ubuntu 18.04
- Καθαρισμός πόρων Docker – Images, Containers και Volumes
- Ανάπτυξη των Laravel, Nginx και MySQL με το Docker Compose
- Πώς να εγκαταστήσετε & να λειτουργήσετε το Docker στο Ubuntu στο δημόσιο cloud
Καλή συνέχεια!


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