Kubernetes (također poznat kao k8s) je sustav orkestracije otvorenog koda. Korisnicima omogućuje implementaciju, skaliranje i upravljanje kontejneriziranim aplikacijama uz minimalno vrijeme zastoja. U ovom vodiču naučit ćete kako implementirati PHP aplikaciju na Kubernetes klasteru.
Nginx se ponaša kao proxy za PHP-FPM dok pokreće PHP aplikaciju. Upravljanje ovim dvjema uslugama u jednom kontejneru težak je proces. Kubernetes nam pomaže upravljati njima u dva različita kontejnera i smanjuje gnjavažu. Također omogućuje korisnicima ponovnu upotrebu kontejnera bez brige o izgradnji slike kontejnera za svaku novu verziju PHP-a/Nginxa.
Pokrenut ćete svoju aplikaciju i proxy uslugu u dva odvojena kontejnera. Vodič će također pružiti uvid u to kako koristiti lokalnu pohranu za stvaranje Persistent Volume (PV) i Persistent Volume Claim (PVC). Zatim ćete koristiti ovaj PVC kako biste svoje konfiguracijske datoteke i kod držali izvan slika kontejnera. Nakon dovršetka ovog vodiča, moći ćete ponovno upotrijebiti svoju Nginx sliku za druge aplikacije koje zahtijevaju proxy poslužitelj. To možete postići prosljeđivanjem konfiguracije, umjesto ponovne izgradnje slike za nju.
Preduvjeti
- Osnovno razumijevanje Kubernetesa (k8s) i njegovih objekata. Pogledajte ovaj vodič za detaljan pregled Kubernetes ekosustava.
- Kubernetes klaster koji je pokrenut i radi na Ubuntu 18.04. Slijedite ovaj vodič za stvaranje vašeg Kubernetes klastera pomoću kubeadm-a.
- Osim toga, morate ugostiti kod svoje aplikacije na javnom URL-u, na primjer, GitHub.
Korak 1: Stvaranje PHP-FPM i Nginx usluga
Ovaj korak će vam pomoći stvoriti PHP-FPM i Nginx usluge. Svaka usluga pruža pristup skupu podova unutar klastera. Sve usluge prisutne u klasteru mogu međusobno komunicirati pomoću svojih naziva, bez IP adresa. PHP-FPM usluga i Nginx usluga omogućit će pristup PHP-FPM, odnosno Nginx podovima.
Morat ćete reći PHP-FPM usluzi kako da pronađe Nginx podove jer će djelovati kao proxy za PHP-FPM podove. Za to ćete iskoristiti prednost Kubernetes’ automatskog otkrivanja usluga i koristiti nazive čitljive ljudima za usmjeravanje zahtjeva na odgovarajuću uslugu.
Kako biste stvorili bilo koju uslugu, morat ćete stvoriti YAML datoteku koja sadrži definiciju objekta. Ova YAML datoteka ima barem sljedeće oznake:
apiVersion: Verzija Kubernetes API-ja kojoj definicija pripada.kind: Vrsta Kubernetes objekta koju ova YAML datoteka stvara. Na primjer:service,job, ilipod.metadata: Naziv objekta i različitelabelskoje bi korisnik mogao htjeti primijeniti na ovaj objekt definirane su pod ovom oznakom.spec: Ova oznaka sadrži specifikaciju vašeg objekta, kao što su varijable okruženja (ENV), slika kontejnera koja će se koristiti, priključci na kojima će usluga kontejnera biti dostupna.
Stvaranje PHP-FPM usluge
Za početak biste trebali stvoriti direktorij za pohranu definicije vašeg Kubernetes objekta. Prijavite se na svoj glavni čvor i stvorite direktorij pod nazivom “definitions:”
|
1 |
mkdir definitions |
Promijenite direktorij u direktorij definitions:
|
1 |
cd definitions |
Zatim stvorite svoju PHP-FPM servisnu datoteku kao php_service.yaml datoteku:
|
1 |
nano php_fpm_service.yaml |
Nakon toga postavite apiVersion i kind u php_fpm_service.yaml datoteci:
|
1 2 |
apiVersion: v1 kind: Service |
Nazovite svoju uslugu php ili php-fpm jer će ona omogućiti pristup vašoj PHP-FPM aplikaciji:
|
1 2 3 |
… Metadata: name: php |
Označite svoju php uslugu s tier: backend jer će PHP aplikacija raditi iza ove usluge:
|
1 2 3 |
… labels: tier: backend |
Usluga koristi selector oznake kako bi odredila kojim podovima pristupiti. Svaki pod koji odgovara ovim oznakama, bez obzira na to kada je stvoren, bit će uslužen. Naučit ćete kako dodati oznake svojim podovima kasnije u ovom vodiču.
Uključite tier: backend oznaku koja dodjeljuje vaš pod backend sloju, zajedno s app: php-fpm oznakom koja označava da pod pokreće PHP-FPM aplikaciju. Morate dodati ove oznake nakon metadata odjeljka:
|
1 2 3 4 5 |
… spec: selector: app: php-fpm tier: backend |
Zatim trebate deklarirati port za pristup ovoj php-fpm usluzi pod spec. Možete dodati bilo koji port po vašem izboru, ali mi ćemo koristiti port 9000 u ovom vodiču:
|
1 2 3 4 |
... ports: - protocol: TCP port: 9000 |
Nakon što završite s gornjim koracima, vaša php_fpm_service.yaml datoteka će izgledati ovako:
|
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 |
Pritisnite Ctrl + O kako biste spremili datoteku, a zatim pritisnite Ctrl + X za izlaz iz nano.
Primjena naredbe kubectl za stvaranje PHP usluge
Nakon što je stvorena definicija objekta za vašu uslugu, pokrenite kubectl apply naredbu s -f argumentom navodeći vašu php_fpm_service.yaml datoteku:
|
1 |
kubectl apply -f php_fpm_service.yaml |
Izlaz gornje naredbe trebao bi biti:
|
1 |
service/php created |
Pokrenite naredbu u nastavku kako biste provjerili radi li vaša php-fpm usluga:
|
1 |
$ kubectl get svc |
Moći ćete vidjeti da je php-fpm usluga pokrenuta i radi:
|
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 |
Stvaranje Nginx usluge
Budući da je vaša PHP-FPM usluga sada spremna, vrijeme je da stvorite i svoju Nginx uslugu. Stvorite i otvorite novu YAML datoteku za ovu uslugu, pod nazivom nginx_service.yaml u uređivaču:
|
1 |
$ nano nginx_service.yaml |
Nazovite ovu uslugu nginx jer će ciljati Nginx podove. Ova usluga također pripada backendu pa biste joj trebali dodati tier: backend oznaku:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: Service metadata: name: nginx labels: tier: backend |
Kao što smo učinili u php-fpm usluzi, dodajte selektorske oznake app: nginx i tier: backend kako biste ciljali podove. Dodajte zadani HTTP port 80 za pristup ovoj usluzi:
|
1 2 3 4 5 6 7 8 |
... spec: selector: app: nginx tier: backend ports: - protocol: TCP port: 80 |
Nginx usluga može biti javno dostupna na internetu s javne IP adrese. Možete dodati IP adresu svog radnog čvora kao your_public_ip. Dodajte retke u nastavku pod spec.externalIPs:
|
1 2 3 4 5 |
... spec: externalIPs: - your_public_ip |
Vaša nginx_service.yaml datoteka bi trebala izgledati kao ona u nastavku nakon što dovršite sve gore navedene korake:
|
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 |
Spremite i zatvorite datoteku nakon što dodate sve gore navedene potrebne parametre.
Primjena naredbe kubectl za stvaranje Nginx usluge
|
1 |
kubectl apply -f nginx_service.yaml |
|
1 |
servis/nginx kreiran |
|
1 |
$ kubectl get svc |
|
1 2 3 4 |
NAZIV TIP KLASTER-IP VANJSKI-IP PORT(S) STAROST 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/naziv_servisa |
Korak 2: Izrada lokalne pohrane i trajnog volumena
Kubernetes nudi razne priključke za pohranu koji vam pomažu stvoriti prostor za pohranu za vaše okruženje. Ovaj korak će vas voditi kroz stvaranje lokalne StorageClass i kako se ova klasa pohrane može dalje koristiti za stvaranje trajnog volumena.
Stvaranje lokalne pohrane
Stvorite datoteku, recimo storageClass.yaml, u svom uređivaču teksta:
|
1 |
$nano storageClass.yaml |
Dodajte kind kao "storageClass" i apiVersion kao "storage.k8s.io/v1" kako slijedi:
|
1 2 |
kind: StorageClass apiVersion: storage.k8s.io/v1 |
Nazovite ovu klasu StorageClass kao "my-local-storage" i dodajte provisioner i volumeBindingMode kako slijedi:
|
1 2 3 4 5 |
… metadata: name: my-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate |
Spremite i zatvorite datoteku i vaša konačna datoteka storageClass.yaml bi trebala izgledati ovako:
|
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 |
Sada stvorite StorageClass pokretanjem naredbe kubectl create, kao što je prikazano u nastavku:
|
1 |
$ kubectl create -f storageClass.yaml |
Nakon pokretanja gornje naredbe, trebali biste dobiti sljedeći izlaz:
|
1 |
storageclass.storage.k8s.io/my-local-storage kreiran |
Stvaranje lokalnog trajnog volumena
Nakon stvaranja lokalne pohrane, možete stvoriti svoj lokalni trajni volumen (Persistent Volume). Trajni volumen, poznat i kao PV, je blok pohrana određene veličine koja je neovisna o životnom ciklusu pod-a. Lokalni trajni volumen nije ništa drugo nego lokalni disk ili direktorij koji je dostupan na čvoru Kubernetes klastera. Ovaj lokalni trajni volumen omogućuje svojim korisnicima pristup lokalnoj pohrani korištenjem lokalnog zahtjeva za trajnim volumenom (Persistent Volume Claim) na vrlo jednostavan, ali prenosiv način. Ovaj lokalni trajni volumen možete stvoriti pomoću ove klase pohrane koju smo upravo stvorili. Otvorite datoteku, recimo persistentVolume.yaml, u svom uređivaču teksta:
|
1 |
$ nano persistentVolume.yaml |
Dodijelite ovom trajnom volumenu naziv, recimo "my-local-pv":
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolume metadata: name: my-local-pv |
Možete dodati kapacitet pohrane prema vašoj upotrebi prilikom stvaranja lokalnog trajnog volumena. U ovom vodiču koristit ćemo 5 Gi za pohranu:
|
1 2 3 4 |
… spec: capacity: storage: 5Gi |
Dodajte accessModes, persistentVolumeReclaimPolicy i navedite storageClassName isti kao što je korišten u storageClass.yaml:
|
1 2 3 4 5 |
… accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: my-local-storage |
Dodajte local.path za svoj trajni volumen (Persistent Volume) kako je prikazano u nastavku:
|
1 2 3 |
… local: path: /mnt/disk/vol |
Nakon dodavanja svih potrebnih polja, vaša datoteka persistentVolume.yaml trebala bi izgledati ovako:
|
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 |
Priprema lokalnog volumena
Sada moramo pripremiti lokalni volumen na čvoru “worker” kao što smo dodali u datoteci persistentVolume.yaml. Pokrenite naredbe u nastavku na čvoru koji ste konfigurirali u persistentVolume. U ovom slučaju, to je čvor “worker”:
|
1 2 3 |
$ DIRNAME="vol" $ mkdir -p /mnt/disk/$DIRNAME $ chmod 777 /mnt/disk/$DIRNAME |
Pokrenite naredbu u nastavku na glavnom čvoru gdje se nalazi vaša datoteka persistentVolume.yaml:
|
1 |
kubectl create -f persistentVolume.yaml |
Trebali biste dobiti sljedeći izlaz:
|
1 |
persistentvolume/my-local-pv created |
Budući da ste uspješno stvorili svoju lokalnu pohranu i trajni volumen (Persistent Volume), sada možete nastaviti i stvoriti zahtjev za trajnim volumenom (Persistent Volume Claim) koji će sadržavati kod vaše aplikacije i konfiguracijske datoteke.
Korak 3: Stvorite trajni volumen (Persistent Volume)
Kod vaše aplikacije mora biti siguran dok upravljate svojim podovima ili ih ažurirate. Za to ćete koristiti trajni volumen (Persistent Volume) stvoren u prethodnom koraku, kojem se pristupa pomoću zahtjeva za trajnim volumenom (Persistent Volume Claim) ili PVC-a. Ovaj PVC montira PV na traženu stazu.
Otvorite datoteku, recimo code_volume.yaml, u svom uređivaču teksta:
|
1 |
$ nano code_volume.yaml |
Imenujte svoj PVC kao code dodavanjem parametara i vrijednosti u nastavku u svoju datoteku:
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: code |
Odjeljak spec PVC-a sadrži sljedeće stavke:
- accessModes: Postoje različite moguće vrijednosti za ovo polje kako slijedi:
- ReadWriteOnce – Montira volumen za jedan čvor s dozvolama za čitanje i pisanje.
- ReadOnlyMany – Montira volumen za više čvorova samo s dozvolom za čitanje.
- ReadWriteMany – Montira volumen za više čvorova s dozvolama za čitanje i pisanje.
- resources: Definira potreban prostor za pohranu.
Budući da je lokalna pohrana montirana samo na jedan čvor, morat ćete postaviti accessMode na ReadWriteOnce. U ovom vodiču dodat ćete samo mali dio koda aplikacije, pa će 1 GB pohrane ovdje biti dovoljno. Međutim, ako želite pohraniti veću količinu podataka ili koda, možete izmijeniti parametar pohrane prema svojim zahtjevima. Imajte na umu da ćete nakon stvaranja volumena moći povećati veličinu pohrane. Međutim, smanjenje nije podržano:
|
1 2 3 4 5 6 7 |
... spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi |
Sada deklarirajte klasu pohrane koju će Kubernetes klaster koristiti za dodjelu volumenima. Ovdje upotrijebite klasu pohrane my-local-storage, stvorenu u prethodnom koraku, za svoj storageClassName:
|
1 2 |
... storageClassName: my-local-storage |
Nakon dovršetka gore navedenih koraka, vaša datoteka code_volume.yaml trebala bi izgledati ovako:
|
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 |
Sada spremite i zatvorite datoteku.
Stvaranje PVC-a
Stvorite PVC za kod pokretanjem naredbe kubectl apply:
|
1 |
$ kubectl apply -f code_volume.yaml |
Trebali biste dobiti sljedeći izlaz koji označava da je objekt uspješno stvoren i spreman za montiranje vašeg PVC-a od 1 GB kao volumena:
|
1 |
persistentvolumeclaim/code created |
Možete izvršiti sljedeću naredbu kako biste provjerili dostupni trajni volumen (Persistent Volume - PV):
|
1 |
$ kubectl get pv |
Izlaz gore navedene naredbe trebao bi biti sljedeći:
|
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 |
Sva gore navedena polja, osim Reclaim Policy i Status, predstavljaju pregled vaše konfiguracijske datoteke. Reclaim Policy definira što se događa s PV-om nakon što se PVC koji mu pristupa izbriše. Vrijednost Delete uklanja PV iz Kubernetes klastera kao i iz infrastrukture za pohranu. Možete pogledati Kubernetes PV dokumentaciju kako biste jasno razumjeli Reclaim Policy i Status.
Sada možete stvoriti svoje podove pomoću Deploymenta jer ste uspješno stvorili svoj trajni volumen (Persistent Volume) pomoću lokalne pohrane.
Korak 4: Stvaranje Deploymenta za vašu PHP-FPM aplikaciju
Ovaj korak pomoći će vam da stvorite svoj PHP-FPM pod pomoću Deploymenta. Deployment koristi ReplicaSets kako bi pružio stabilan način za stvaranje, ažuriranje i upravljanje vašim podovima. Deployment automatski vraća svoje podove na prethodnu sliku.
Ključ spec.selector u Deploymentu navodi sve oznake podova kojima upravlja. Također koristi ključ template za stvaranje potrebnih podova.
U ovom koraku također ćemo predstaviti primjenu Init kontejnera (Init Containers). Init kontejneri pokreću nekoliko naredbi prije uobičajenih kontejnera koji su navedeni pod predloškom (template) poda. Ovdje će Init kontejner koristiti GitHub Gist (https://gist.github.com/) za dohvaćanje primjera index.php datoteke. Sadržaj ogledne datoteke je:
|
1 2 |
<?php echo phpinfo(); |
Stvaranje PHP Deploymenta
Otvorite novu datoteku pod nazivom php_deployment.yaml u svom uređivaču teksta kako biste stvorili svoj Deployment:
|
1 |
$ nano php_deployment.yaml |
Sada nazovite Deployment objekt PHP jer će ovaj Deployment upravljati vašim PHP-FPM podovima. Dodajte oznaku tier: backend jer će pod pripadati backend sloju:
|
1 2 3 4 5 6 |
apiVersion: apps/v1 kind: Deployment metadata: name: php labels: tier: backend |
Pomoću parametra replica odredite broj kopija ovog poda koje treba stvoriti. Broj replika može varirati ovisno o vašim zahtjevima i dostupnim resursima. U ovom vodiču stvorit ćete samo jednu repliku svog poda:
|
1 2 3 4 |
... spec: replicas: 1 |
Dodajte app: php i tier:backend oznake pod ključem selector koji označava da će ovaj Deployment upravljati podovima koji odgovaraju ovim dvjema oznakama:
|
1 2 3 4 5 |
... selector: matchLabels: app: php tier: backend |
Sada, definiciji objekta vašeg pod’a treba predložak pod vašom specifikacijom Deploymenta. Ovaj predložak definira specifikaciju koja je potrebna za stvaranje vašeg poda. Za početak, dodajte oznake koje su navedene za selektor php usluge i matchLabels Deploymenta. Zatim dodajte app:php i tier:backend pod template.metadata.labels:
|
1 2 3 4 5 6 7 |
... template: metadata: labels: app: php tier: backend |
Prvo morate odrediti sve volumene kojima će vaši spremnici pristupati. Nazovite ovaj volumen code jer ste stvorili PVC pod nazivom code za pohranu koda vaše aplikacije:
|
1 2 3 4 5 6 |
... spec: volumes: - name: code persistentVolumeClaim: claimName: code |
Zatim odredite naziv spremnika zajedno sa slikom koju želite pokrenuti unutar svog poda. Postoje razne slike dostupne u Docker trgovini (https://hub.docker.com/explore/), ali u ovom vodiču koristit ćemo php:7-fpm sliku:
|
1 2 3 4 |
... containers: - name: php image: php:7-fpm |
Sada montirajte volumene kojima spremnik treba pristup. Budući da će ovaj spremnik pokretati vaš php kod, trebat će mu pristup volumenu code stvorenom u prethodnom koraku. U ovom koraku također ćete naučiti kako kopirati kod svoje aplikacije pomoću Init Container-a.
Za preuzimanje koda, ovaj vodič će vas uputiti kako koristiti jedan Init Container s busyboxom. Busybox je mali spremnik s uslužnim programom wget koji ćete koristiti za postizanje toga.
Prvo dodajte svoj initContainer pod spec.template.spec i odredite sliku busybox:
|
1 2 3 4 |
... initContainers: - name: install image: busybox |
Zatim, kako bi preuzeo kod u volumen code, vaš Init Container trebat će pristup njemu. Montirajte volumen code na putanju /code pod spec.template.spec.initContainers:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Svaki Init Container zahtijeva pokretanje naredbe. Ovaj Init Container koristit će wget za preuzimanje code s Github u direktorij /code directory. Možete proslijediti opciju -O kako biste ovoj preuzetoj datoteci dali ime, a tu datoteku možete nazvati index.php.
Osim toga, dodajte retke u nastavku pod install container u 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 |
Nakon što dovršite sve ove korake, vaša datoteka php_deployment.yaml trebala bi izgledati ovako:
|
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 |
Sada možete spremiti datoteku i izaći. Zatim izradite svoj PHP-FPM Deployment pomoću kubectl apply naredbe:
|
1 |
$ kubectl apply -f php_deployment.yaml |
Uspješno stvaranje Deploymenta trebalo bi vam dati sljedeći izlaz:
|
1 |
deployment.apps/php created |
Ovaj Deployment započinje preuzimanjem navedenih slika, zatim će zatražiti PersistentVolume od vašeg PersistentVolumeClaim, a zatim pokrenuti vaš initContainers. Kada se ovaj korak dovrši, spremnici će se pokrenuti i montirati volumene na navedenu točku montiranja. Nakon što dovršite sve ove korake, vaš će pod biti pokrenut i raditi.
Možete pokrenuti naredbu u nastavku da biste vidjeli svoj Deployment:
|
1 |
$ kubectl get deployments |
Nakon pokretanja gornje naredbe, trebali biste dobiti sljedeći izlaz:
|
1 2 |
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php 1 1 1 0 19s |
Pomoću ovog izlaza možete razumjeti trenutno stanje Deploymenta. Deployment je kontroler koji održava željeno stanje. Polje DESIRED određuje da ima 1 repliku poda pod nazivom php. Polje CURRENT označava koliko se replika DESIRED stanja trenutno izvodi. Za ispravan pod, ovo bi trebalo odgovarati DESIRED stanju. Više o preostalim poljima možete saznati u Kubernetes Deployments dokumentaciji.
Nakon toga, da biste provjerili status svog pokrenutog poda, možete pokrenuti naredbu u nastavku:
|
1 |
$ kubectl get pods |
Izlaz ove naredbe može varirati ovisno o vremenu koje je prošlo od stvaranja Deploymenta. Ako se pokrene ubrzo nakon stvaranja Deploymenta, izlaz će biti sličan ovome:
|
1 2 |
NAME READY STATUS RESTARTS AGE php-5d8f6bbf7f-56df2 0/1 Init:0/1 0 9s |
Objašnjenje:
Ovi stupci predstavljaju informacije na sljedeći način:
- Ready: Broj trenutnih/željenih replika koje pokreću ovaj pod.
- Status: Status vašeg poda. Init:0/1 označava da se Init kontejneri izvode i da je 0 od 1 Init kontejnera završilo s radom.
- Restarts: Ovo označava koliko se puta ovaj proces ponovno pokrenuo radi pokretanja poda.
Vašem podu može trebati nekoliko minuta da se status promijeni u podInitializing ovisno o složenosti vaših skripti za pokretanje:
|
1 2 |
NAZIV SPREMAN STATUS PONOVNA POKRETANJA STAROST php-5d8f6bbf7f-56df2 0/1 podInitializing 0 39s |
Ovo označava da su se Init kontejneri uspješno pokrenuli i da se sada kontejneri inicijaliziraju:
|
1 2 |
NAZIV SPREMAN STATUS PONOVNA POKRETANJA STAROST php-5d8f6bbf7f-56df2 1/1 Running 0 4m10s |
Kao što sada možete vidjeti, vaš pod je pokrenut i radi. Međutim, u slučaju da se vaš pod ne pokrene, možete pokrenuti naredbe u nastavku u svrhu otklanjanja pogrešaka:
1. Za prikaz detaljnih informacija o podu:
|
1 |
$ kubectl describe pods pod-name |
2. Za prikaz logova poda:
|
1 |
$ kubectl logs pod-name |
3. Za prikaz logova određenog kontejnera u podu:
|
1 |
$ kubectl logs pod-name container-name |
Čestitamo! Uspješno ste montirali kod aplikacije i PHP-FPM usluga je spremna za obradu veza. Slično tome, možete izraditi svoj Nginx Deployment.
Korak 5: Izradite svoj Nginx Deployment
Ovaj korak će vas voditi kroz konfiguraciju Nginxa pomoću ConfigMap. ConfigMap čuva sve vaše potrebne konfiguracije u formatu ključ-vrijednost koje će se koristiti u drugim definicijama Kubernetes objekata. S ovim pristupom imat ćete fleksibilnost ponovne upotrebe ili zamjene Nginx slike drugom verzijom, prema potrebi. Možete ažurirati ConfigMap i on će automatski replicirati te promjene na bilo koji pod koji montira ovaj ConfigMap.
Za početak, otvorite nginx_configmap.yaml datoteku u svom uređivaču:
|
1 |
$ nano nginx_configMap.yaml |
Sada nazovite ovaj ConfigMap kao nginx-config i dodajte ga u tier: backend mikrouslugu:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config labels: tier: backend |
Osim toga, možete dodati podatke u ConfigMap. Dodajte ključ pod nazivom config i dodajte sav sadržaj Nginx konfiguracijske datoteke kao vrijednost.
Budući da Kubernetes može usmjeravati zahtjeve odgovarajućim domaćinima za uslugu, možete unijeti naziv svoje PHP-FPM usluge pod parametar fastcgi_pass umjesto njezine IP adrese. Dodajte sljedeće retke koda u svoju nginx_configMap.yaml datoteku:
|
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; } } |
Nakon što završite, vaša nginx_configMap.yaml datoteka izgledat će ovako:
|
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; } } |
Sada možete spremiti i zatvoriti uređivač. Sada izvršite kubectl apply naredbu za stvaranje ConfigMap:
|
1 |
$ kubectl apply -f nginx_configMap.yaml |
Nakon toga, na zaslonu biste trebali vidjeti sljedeći izlaz:
|
1 |
configmap/nginx-config kreiran |
Uspješno ste stvorili svoj Nginx Configmap. Sada možete stvoriti svoj Nginx Deployment.
Stvaranje Nginx Deploymenta
Za početak, možete stvoriti novu datoteku pod nazivom nginx_deployment.yaml u uređivaču:
|
1 |
$ nano nginx_deployment.yaml |
Nazovite ovaj Deployment nginx i dodajte mu tier: backend oznaku:
|
1 2 3 4 5 6 7 |
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: tier: backend |
Nakon toga, odredite broj replika dodavanjem polja replica u specifikaciju Deploymenta i dodajte mu app: nginx i tier: backend oznake:
|
1 2 3 4 5 6 7 |
... spec: replicas: 1 selector: matchLabels: app: nginx tier: backend |
Slično tome, dodajte predložak poda. Pripazite da dodate iste oznake koje ste dodali u Deploymentov selector.matchLabels. Možete dodati sljedeće:
|
1 2 3 4 5 6 |
... template: metadata: labels: app: nginx tier: backend |
Omogućite Nginxu pristup PVC-u koda koji je ranije stvoren dodavanjem sljedećih parametara pod 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 |
Upozorenje: Sadržaj ključa zamijenit će mountPath volumena ako datoteka nije navedena. Drugim riječima, izgubit ćete sav sadržaj u odredišnoj mapi ako putanja nije izričito navedena.
Sada odredite naziv, sliku i priključak koje želite koristiti u svom podu. Ovdje ćemo koristiti nginx:1.7.9 sliku i priključak 80. Dodajte ih pod spec.template.spec sekcija:
|
1 2 3 4 5 6 |
... containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 |
Također, montirajte volumen koda na /code jer će i Nginx i PHP-FPM morati pristupiti datoteci na istoj putanji:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Slika nginx-1.7.9 automatski učitava bilo koju konfiguracijsku datoteku u mapi /etc/nginx/conf.d. Ako sada montiramo konfiguracijski volumen u ovaj direktorij, on će stvoriti /etc/nginx/conf.d/site.conf. Dodajte sljedeće pod volumeMount sekciju:
|
1 2 3 |
... - name: config mountPath: /etc/nginx/conf.d |
Nakon što dovršite sve gore navedene korake, vaša nginx_deployment.yaml datoteka bi trebala izgledati ovako:
|
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 |
Sada možete spremiti i zatvoriti datoteku te stvoriti Nginx Deployment pokretanjem sljedeće naredbe:
|
1 |
$ kubectl apply -f nginx_deployment.yaml |
Nakon uspješnog izvršavanja naredbe, trebali biste vidjeti sljedeći izlaz:
|
1 |
deployment.apps/nginx created |
Možete izlistati sve svoje Deploymente izvršavanjem sljedećih naredbi:
|
1 |
$ kubectl get deployments |
Sada biste trebali vidjeti i Nginx i PHP-FPM Deploymente:
Nadalje, možete izvršiti sljedeću naredbu kako biste izlistali podove kojima upravljaju oba gore navedena Deploymenta:
|
1 |
$ kubectl get pods |
Vidjet ćete da su oba vaša poda aktivna i rade na sljedeći način:
Budući da su svi vaši Kubernetes objekti aktivni u ovom trenutku, sada možete pristupiti Nginx usluzi u svom pregledniku.
Pokrenite sljedeću naredbu za popis usluga:
|
1 |
$ kubectl get services -o wide |
Zabilježite External IP svoje Nginx usluge:
Sada, koristeći ovaj External IP Nginx usluge, možete posjetiti svoj poslužitelj upisivanjem http://your_public_ip u svom pregledniku. Trebali biste moći vidjeti izlaz php_info() koji potvrđuje da su vaše Kubernetes usluge aktivne i rade.
Zaključak
U ovom vodiču, kako biste neovisno upravljali svojim PHP-FPM i Nginx uslugama, kontejnerizirali ste ove dvije usluge. Time ne samo da ćete poboljšati skalabilnost svog projekta, već ćete i učinkovito koristiti svoje resurse. Također ste naučili kako stvoriti lokalnu pohranu i Persistent Volume za pohranu koda vaše aplikacije na volumen te kako biste u budućnosti mogli jednostavno ažurirati svoje usluge. Time ste poboljšali upotrebljivost i mogućnost održavanja svog koda.
Nadalje, pogledajte naše ostale vodiče usmjerene na Docker i Kubernetes koje možete pronaći na našem blogu:
- Upoznavanje s Kubernetesom
- Kako stvoriti Kubernetes klaster pomoću Kubeadm na Ubuntu 18.04
- Čišćenje Docker resursa – slike, kontejneri i volumeni
- Implementacija Laravela, Nginxa i MySQL-a s Docker Compose
- Kako instalirati & upravljati Dockerom na Ubuntuu u javnom oblaku
Sretno računanje!


Komentari
Još nema komentara. Budite prvi.