Kubernetes (také známý jako k8s) je open-source orchestrační systém. Umožňuje uživatelům nasazovat, škálovat a spravovat kontejnerizované aplikace s minimálními prostoji. V tomto návodu se naučíte, jak nasadit PHP aplikaci na Kubernetes clusteru.
Nginx funguje jako proxy pro PHP-FPM při spuštění PHP aplikace. Správa těchto dvou služeb v jediném kontejneru je náročný proces. Kubernetes nám pomáhá spravovat je ve dvou různých kontejnerech a snižuje s tím spojené potíže. Umožňuje také uživatelům kontejnery znovu používat a nestarat se o sestavování jejich kontejnerového obrazu pro každou novou verzi PHP/Nginx.
Svou aplikaci a proxy službu spustíte ve dvou samostatných kontejnerech. Návod také poskytne pohled na to, jak použít lokální úložiště k vytvoření Persistent Volume (PV) a Persistent Volume Claim (PVC). Tento PVC pak použijete k uchování konfiguračních souborů a kódu mimo obrazy kontejnerů. Po dokončení tohoto návodu budete moci znovu použít svůj obraz Nginx pro jiné aplikace, které vyžadují proxy server. Toho můžete dosáhnout předáním konfigurace, namísto opětovného sestavování obrazu.
Požadavky
- Základní znalost Kubernetes (k8s) a jeho objektů. Podívejte se na tuto příručku pro podrobný přehled ekosystému Kubernetes.
- Kubernetes cluster, který je spuštěný a funkční na Ubuntu 18.04. Podle tohoto návodu vytvořte svůj Kubernetes cluster pomocí kubeadm.
- Kromě toho musíte hostovat kód své aplikace na veřejné URL, například na GitHub.
Krok 1: Vytvoření služeb PHP-FPM a Nginx
Tento krok vám pomůže vytvořit služby PHP-FPM a Nginx. Jakákoli služba poskytuje přístup k sadě podů v rámci clusteru. Všechny služby přítomné v clusteru spolu mohou komunikovat pomocí svých názvů, bez IP adres. Služba PHP-FPM a služba Nginx poskytnou přístup k podům PHP-FPM, respektive Nginx.
Budete muset službě PHP-FPM říct, jak najít pody Nginx, protože bude fungovat jako proxy pro pody PHP-FPM. K tomu využijete automatické zjišťování služeb v Kubernetes’ a použijete srozumitelné názvy pro směrování požadavků na příslušnou službu.
Chcete-li vytvořit jakoukoli službu, budete muset vytvořit YAML soubor, který obsahuje definici objektu. Tento YAML soubor má alespoň následující značky:
apiVersion: Verze API Kubernetes, do které definice patří.kind: Typ objektu Kubernetes, který tento YAML soubor vytváří. Například:service,jobnebopod.metadata: Pod touto značkou je definován název objektu a různélabels, které může uživatel chtít na tento objekt použít.spec: Tato značka obsahuje specifikaci vašeho objektu, jako jsou proměnné prostředí (ENV), kontejnerový obraz, který se má použít, a porty, na kterých bude služba kontejneru přístupná.
Vytvoření služby PHP-FPM
Pro začátek byste měli vytvořit adresář pro uložení definic objektů Kubernetes. Přihlaste se ke svému hlavnímu uzlu (master node) a vytvořte adresář s názvem “definitions:”
|
1 |
mkdir definitions |
Změňte adresář na adresář definitions:
|
1 |
cd definitions |
Dále vytvořte soubor služby PHP-FPM jako soubor php_service.yaml:
|
1 |
nano php_fpm_service.yaml |
Poté nastavte apiVersion a kind v souboru php_fpm_service.yaml:
|
1 2 |
apiVersion: v1 kind: Service |
Pojmenujte svou službu jako php nebo php-fpm, protože bude poskytovat přístup k vaší aplikaci PHP-FPM:
|
1 2 3 |
… Metadata: name: php |
Označte svou službu php štítkem tier: backend, protože aplikace PHP poběží za touto službou:
|
1 2 3 |
… labels: tier: backend |
Služba používá štítky selector k určení, ke kterým podům má přistupovat. Jakýkoli pod, který odpovídá těmto štítkům, bez ohledu na to, kdy byl vytvořen, je obsloužen. Jak přidat štítky k vašim podům se dozvíte později v tomto návodu.
Zahrňte tier: backend štítek, který přiřadí váš pod do backendové vrstvy, společně s app: php-fpm štítkem, který označuje, že v podu běží aplikace PHP-FPM. Tyto štítky musíte přidat za sekci metadata:
|
1 2 3 4 5 |
… spec: selector: app: php-fpm tier: backend |
Dále musíte deklarovat port pro přístup k této službě php-fpm pod spec. Můžete přidat libovolný port podle svého výběru, ale v tomto návodu použijeme port 9000 v tomto návodu:
|
1 2 3 4 |
... ports: - protocol: TCP port: 9000 |
Po dokončení výše uvedených kroků bude váš soubor php_fpm_service.yaml vypadat takto:
|
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 |
Stiskněte Ctrl + O pro uložení souboru, poté stiskněte Ctrl + X pro ukončení nano.
Použití příkazu kubectl k vytvoření služby PHP
Jakmile je definice objektu pro vaši službu vytvořena, spusťte příkaz kubectl apply s argumentem -f a specifikujte svůj soubor php_fpm_service.yaml:
|
1 |
kubectl apply -f php_fpm_service.yaml |
Výstup výše uvedeného příkazu by měl být:
|
1 |
service/php created |
Spuštěním níže uvedeného příkazu ověřte, že vaše služba php-fpm běží:
|
1 |
$ kubectl get svc |
Uvidíte, že služba php-fpm je spuštěná a funkční:
|
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 |
Vytvoření služby Nginx
Vzhledem k tomu, že vaše služba PHP-FPM je již připravena, je čas vytvořit také službu Nginx. Vytvořte a otevřete v editoru nový soubor YAML pro tuto službu s názvem nginx_service.yaml v editoru:
|
1 |
$ nano nginx_service.yaml |
Pojmenujte tuto službu jako nginx, protože bude cílit na pody Nginx. Tato služba také patří do backendu, takže byste k ní měli přidat štítek tier: backend:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: Service metadata: name: nginx labels: tier: backend |
Stejně jako u služby php-fpm přidejte štítky selektoru app: nginx a tier: backend pro zacílení na pody. Přidejte výchozí HTTP port 80 pro přístup k této službě:
|
1 2 3 4 5 6 7 8 |
... spec: selector: app: nginx tier: backend ports: - protocol: TCP port: 80 |
Služba Nginx může být veřejně přístupná na internetu z veřejné IP adresy. IP adresu vašeho worker uzlu můžete přidat jako your_public_ip. Přidejte níže uvedené řádky pod spec.externalIPs:
|
1 2 3 4 5 |
... spec: externalIPs: - your_public_ip |
Váš soubor nginx_service.yaml by měl po dokončení všech výše uvedených kroků vypadat jako ten níže:
|
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 |
Po přidání všech požadovaných parametrů výše soubor uložte a zavřete.
Použití příkazu kubectl k vytvoření služby Nginx
|
1 |
kubectl apply -f nginx_service.yaml |
|
1 |
služba/nginx vytvořeno |
|
1 |
$ kubectl get svc |
|
1 2 3 4 |
NÁZEV TYP CLUSTER-IP EXTERNÍ-IP PORT(S) STÁŘÍ 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 |
Krok 2: Vytvoření lokálního úložiště a Persistent Volume
Kubernetes poskytuje různé doplňky pro úložiště (storage plug-ins), které vám pomohou vytvořit úložný prostor pro vaše prostředí. Tento krok vás provede vytvořením lokální StorageClass a tím, jak lze tuto Storage Class dále použít k vytvoření Persistent Volume.
Vytvoření lokálního úložiště
Vytvořte soubor, například storageClass.yaml, ve vašem editoru:
|
1 |
$nano storageClass.yaml |
Přidejte kind jako "storageClass" a apiVersion jako "storage.k8s.io/v1" následovně:
|
1 2 |
kind: StorageClass apiVersion: storage.k8s.io/v1 |
Pojmenujte tuto StorageClass jako "my-local-storage" a přidejte provisioner a volumeBindingMode následovně:
|
1 2 3 4 5 |
… metadata: name: my-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate |
Uložte a zavřete soubor. Váš výsledný soubor storageClass.yaml by měl vypadat takto:
|
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 |
Nyní vytvořte StorageClass spuštěním příkazu kubectl create, jak je uvedeno níže:
|
1 |
$ kubectl create -f storageClass.yaml |
Po spuštění výše uvedeného příkazu byste měli obdržet následující výstup:
|
1 |
storageclass.storage.k8s.io/my-local-storage vytvořeno |
Vytvoření lokálního Persistent Volume
Po vytvoření lokálního úložiště můžete vytvořit svůj lokální Persistent Volume. Persistent Volume, známý také jako PV, je blokové úložiště o specifikované velikosti, které je nezávislé na životním cyklu podu. Lokální Persistent Volume není nic jiného než lokální disk nebo adresář, který je k dispozici na uzlu clusteru Kubernetes. Tento lokální Persistent Volume umožňuje uživatelům přistupovat k lokálnímu úložišti pomocí lokálního Persistent Volume Claim velmi jednoduchým, a přitom přenositelným způsobem. Tento lokální Persistent Volume můžete vytvořit pomocí této třídy úložiště, kterou jsme právě vytvořili. Otevřete soubor, například persistentVolume.yaml, ve vašem editoru:
|
1 |
$ nano persistentVolume.yaml |
Pojmenujte tento persistent volume, například "my-local-pv":
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolume metadata: name: my-local-pv |
Při vytváření lokálního Persistent Volume můžete přidat kapacitu úložiště podle vaší potřeby. V tomto návodu použijeme pro úložiště 5 Gi:
|
1 2 3 4 |
… spec: capacity: storage: 5Gi |
Přidejte accessModes, persistentVolumeReclaimPolicy a uveďte stejný storageClassName, jaký byl použit v storageClass.yaml:
|
1 2 3 4 5 |
… accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: my-local-storage |
Add the local.path for your Persistent Volume as below:
|
1 2 3 |
… local: path: /mnt/disk/vol |
After adding all the required fields, your persistentVolume.yaml file should look like this:
|
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 |
Příprava lokálního svazku
Nyní musíme připravit lokální svazek na uzlu “worker”, jak jsme přidali v souboru persistentVolume.yaml file. Spusťte níže uvedené příkazy na uzlu, který jste nakonfigurovali v persistentVolume. V tomto případě se jedná o uzel “worker”:
|
1 2 3 |
$ DIRNAME="vol" $ mkdir -p /mnt/disk/$DIRNAME $ chmod 777 /mnt/disk/$DIRNAME |
Spusťte níže uvedený příkaz na master uzlu, kde se nachází váš persistentVolume.yaml soubor:
|
1 |
kubectl create -f persistentVolume.yaml |
Měli byste získat následující výstup:
|
1 |
persistentvolume/my-local-pv created |
Protože jste úspěšně vytvořili lokální úložiště a Persistent Volume, můžete nyní pokračovat a vytvořit Persistent Volume Claim pro uložení kódu aplikace a konfiguračních souborů.
Krok 3: Vytvoření Persistent Volume
Kód vaší aplikace musí být v bezpečí, zatímco spravujete nebo aktualizujete své pody. K tomu použijete Persistent Volume vytvořený v předchozím kroku, ke kterému se přistupuje pomocí PersistentVolumeClaim neboli PVC. Tento PVC připojí PV do požadované cesty.
Otevřete soubor, například code_volume.yaml, ve vašem editoru:
|
1 |
$ nano code_volume.yaml |
Pojmenujte svůj PVC jako code přidáním níže uvedených parametrů a hodnot do souboru:
|
1 2 3 4 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: code |
Sekce spec v PVC obsahuje následující položky:
- accessModes: Pro toto pole existují různé možné hodnoty následovně:
- ReadWriteOnce – Připojí svazek pro jeden uzel s oprávněním pro čtení i zápis.
- ReadOnlyMany – Připojí svazek pro mnoho uzlů pouze s oprávněním pro čtení.
- ReadWriteMany – Připojí svazek pro mnoho uzlů s oprávněním pro čtení i zápis.
- resources: Definuje požadovaný úložný prostor.
Vzhledem k tomu, že lokální úložiště je připojeno pouze k jednomu uzlu, budete muset nastavit accessMode na ReadWriteOnce. V tomto návodu přidáte pouze malou část kódu aplikace, takže 1 GB úložiště zde bude stačit. Pokud však chcete uložit větší množství dat nebo kódu, můžete parametr úložiště upravit podle svých požadavků. Upozorňujeme, že po vytvoření svazku budete moci velikost úložiště zvětšit. Jeho zmenšení však podporováno není:
|
1 2 3 4 5 6 7 |
... spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi |
Nyní deklarujte třídu úložiště, kterou bude cluster Kubernetes používat k přidělování svazků. Pro storageClassName zde použijte třídu úložiště my-local-storage vytvořenou v předchozím kroku:
|
1 2 |
... storageClassName: my-local-storage |
Po dokončení výše uvedených kroků by měl váš soubor code_volume.yaml vypadat takto:
|
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 |
Nyní soubor uložte a zavřete.
Vytvoření PVC
Vytvořte PVC pro kód spuštěním příkazu kubectl apply:
|
1 |
$ kubectl apply -f code_volume.yaml |
Měli byste obdržet následující výstup, který indikuje, že objekt byl úspěšně vytvořen a je připraven k připojení vašeho 1GB PVC jako svazku:
|
1 |
persistentvolumeclaim/code created |
Pro kontrolu dostupného Persistent Volume (PV) můžete spustit následující příkaz:
|
1 |
$ kubectl get pv |
Výstup výše uvedeného příkazu by měl být následující:
|
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 |
Všechna výše uvedená pole, s výjimkou Reclaim Policy a Status, jsou přehledem vašeho konfiguračního souboru. Reclaim Policy definuje, co se stane s PV po smazání PVC, které k němu přistupuje. Hodnota Delete odstraní PV z clusteru Kubernetes i z infrastruktury úložiště. Můžete se podívat na dokumentaci k PV v Kubernetes, abyste jasně porozuměli Reclaim Policy a Status.
Nyní můžete vytvořit své pody pomocí Deploymentu, protože jste úspěšně vytvořili svůj Persistent Volume pomocí lokálního úložiště.
Step 4: Create Deployment for your PHP-FPM Application
Tento krok vám pomůže vytvořit pod PHP-FPM pomocí Deploymentu. Deployment používá ReplicaSety k zajištění stabilního způsobu vytváření, aktualizace a správy vašich podů. Deployment automaticky vrátí své pody zpět na předchozí obraz.
Klíč spec.selector v Deploymentu uvádí všechny štítky podů, které spravuje. K vytvoření požadovaných podů používá také klíč template.
V tomto kroku si také představíme použití Init Containerů. Init Containery spouštějí několik příkazů před běžnými kontejnery, které jsou specifikovány v šabloně podu. Zde bude Init Container používat GitHub Gist (https://gist.github.com/) k získání ukázkového souboru index.php. Obsah ukázkového souboru je:
|
1 2 |
<?php echo phpinfo(); |
Vytvoření PHP Deploymentu
Otevřete nový soubor s názvem php_deployment.yaml ve svém editoru a vytvořte Deployment:
|
1 |
$ nano php_deployment.yaml |
Nyní pojmenujte objekt Deployment jako PHP, protože tento Deployment bude spravovat vaše pody PHP-FPM. Přidejte štítek tier: backend protože pod bude patřit do vrstvy backend:
|
1 2 3 4 5 6 |
apiVersion: apps/v1 kind: Deployment metadata: name: php labels: tier: backend |
Pomocí parametru replica specifikujte počet kopií tohoto podu, které mají být vytvořeny. Počet replik se může lišit v závislosti na vašich požadavcích a dostupných zdrojích. V tomto návodu vytvoříte pouze jednu repliku vašeho podu:
|
1 2 3 4 |
... spec: replicas: 1 |
Přidejte app: php a tier:backend štítky pod klíčem selector, což značí, že tento Deployment bude spravovat pody, které odpovídají těmto dvěma štítkům:
|
1 2 3 4 5 |
... selector: matchLabels: app: php tier: backend |
Nyní definice objektu vašeho podu vyžaduje šablonu (template) pod specifikací vašeho Deploymentu. Tato šablona definuje specifikaci, která je potřebná k vytvoření vašeho podu. Pro začátek přidejte štítky, které byly specifikovány pro selektor služby php a matchLabels Deploymentu. Poté přidejte app:php a tier:backend pod template.metadata.labels:
|
1 2 3 4 5 6 7 |
... template: metadata: labels: app: php tier: backend |
Nejprve musíte specifikovat všechny svazky, ke kterým budou vaše kontejnery přistupovat. Pojmenujte tento svazek code, protože jste vytvořili PVC s názvem code pro uložení kódu vaší aplikace:
|
1 2 3 4 5 6 |
... spec: volumes: - name: code persistentVolumeClaim: claimName: code |
Dále specifikujte název kontejneru spolu s obrazem, který chcete v podu spustit. Na Docker Store je k dispozici celá řada obrazů (https://hub.docker.com/explore/), ale v tomto návodu použijeme php:7-fpm obraz:
|
1 2 3 4 |
... containers: - name: php image: php:7-fpm |
Nyní připojte svazky, ke kterým kontejner vyžaduje přístup. Vzhledem k tomu, že tento kontejner bude spouštět váš kód PHP, bude potřebovat přístup ke svazku code vytvořenému v předchozím kroku. V tomto kroku se také dozvíte, jak zkopírovat kód aplikace pomocí Init Containeru.
Pro stažení kódu vás tento návod provede tím, jak použít jeden Init Container s busyboxem. Busybox je malý kontejner s nástrojem wget, který k tomu použijete.
Nejprve přidejte svůj initContainer pod spec.template.spec a specifikujte obraz busybox:
|
1 2 3 4 |
... initContainers: - name: install image: busybox |
Poté, aby bylo možné stáhnout kód do svazku code, bude k němu váš Init Container potřebovat přístup. Připojte svazek code na cestu /code pod spec.template.spec.initContainers:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Každý Init Container vyžaduje spuštění příkazu. Tento Init Container použije wget ke stažení code z Github do adresáře /code. Můžete předat volbu -O pro pojmenování staženého souboru a tento soubor můžete pojmenovat index.php.
Kromě toho přidejte pod kontejner install následující řádky v 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 |
Po dokončení všech těchto kroků by měl váš soubor php_deployment.yaml vypadat takto:
|
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 |
Nyní můžete soubor uložit a zavřít. Dále vytvořte svůj PHP-FPM Deployment pomocí kubectl apply příkazu:
|
1 |
$ kubectl apply -f php_deployment.yaml |
Úspěšné vytvoření Deploymentu by mělo vést k následujícímu výstupu:
|
1 |
deployment.apps/php created |
Tento Deployment začne stažením specifikovaných obrazů, poté si vyžádá PersistentVolume z vašeho PersistentVolumeClaim, a poté spustí vaše initContainers. Jakmile je tento krok hotov, kontejnery se spustí a připojí svazky do určeného bodu připojení. Po dokončení všech těchto kroků bude váš pod spuštěn a v provozu.
Pro zobrazení vašeho Deploymentu můžete spustit následující příkaz:
|
1 |
$ kubectl get deployments |
Po spuštění výše uvedeného příkazu byste měli obdržet následující výstup:
|
1 2 |
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php 1 1 1 0 19s |
Pomocí tohoto výstupu můžete porozumět aktuálnímu stavu Deploymentu. Deployment je kontrolér, který udržuje požadovaný stav. Pole DESIRED určuje, že má 1 repliku podu s názvem php. Pole CURRENT udává, kolik replik DESIRED stavu v současnosti běží. U zdravého podu by to mělo odpovídat DESIRED stavu. Více informací o zbývajících polích naleznete v dokumentaci.
Poté můžete pro kontrolu stavu vašeho běžícího podu spustit následující příkaz:
|
1 |
$ kubectl get pods |
Výstup tohoto příkazu se může lišit v závislosti na čase, který uplynul od vytvoření vašeho Deploymentu. Pokud jej spustíte krátce po vytvoření Deploymentu, výstup bude podobný tomuto:
|
1 2 |
NAME READY STATUS RESTARTS AGE php-5d8f6bbf7f-56df2 0/1 Init:0/1 0 9s |
Vysvětlení:
Tyto sloupce představují informace následovně:
- Ready: Počet aktuálních/požadovaných replik spouštějících tento pod.
- Status: Stav vašeho podu. Init:0/1 indikuje, že Init kontejnery běží a 0 z 1 Init kontejnerů bylo dokončeno.
- Restarts: Udává počet restartů tohoto procesu za účelem spuštění podu.
Změna stavu vašeho podu na podInitializing může trvat několik minut v závislosti na složitosti vašich spouštěcích skriptů:
|
1 2 |
NÁZEV PŘIPRAVENO STAV RESTARTY STÁŘÍ php-5d8f6bbf7f-56df2 0/1 podInitializing 0 39s |
To znamená, že Init kontejnery úspěšně proběhly a nyní se inicializují samotné kontejnery:
|
1 2 |
NÁZEV PŘIPRAVENO STAV RESTARTY STÁŘÍ php-5d8f6bbf7f-56df2 1/1 Running 0 4m10s |
Jak nyní vidíte, váš pod je spuštěn a běží. Pokud se však váš pod nespustí, můžete pro účely ladění spustit níže uvedené příkazy:
1. Pro zobrazení podrobných informací o podu:
|
1 |
$ kubectl describe pods pod-name |
2. Pro zobrazení logů podu:
|
1 |
$ kubectl logs pod-name |
3. Pro zobrazení logů konkrétního kontejneru v podu:
|
1 |
$ kubectl logs pod-name container-name |
Gratulujeme! Úspěšně jste připojili kód aplikace a služba PHP-FPM je připravena zpracovávat připojení. Podobně můžete vytvořit svůj Nginx Deployment.
Krok 5: Vytvoření Nginx Deploymentu
Tento krok vás provede konfigurací Nginx pomocí ConfigMap. ConfigMap uchovává všechny požadované konfigurace ve formátu klíč-hodnota, které budou použity v definicích jiných objektů Kubernetes. S tímto přístupem budete mít flexibilitu znovu použít nebo vyměnit obraz Nginx za jinou verzi, kdykoli to bude potřeba. Můžete aktualizovat ConfigMap a tyto změny se automaticky replikují do jakéhokoli podu, který tento ConfigMap.
Chcete-li začít, otevřete soubor nginx_configmap.yaml ve svém editoru:
|
1 |
$ nano nginx_configMap.yaml |
Nyní pojmenujte tento ConfigMap jako nginx-config a přidejte jej do mikroslužby tier: backend:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config labels: tier: backend |
Kromě toho můžete do ConfigMap přidat data. Přidejte klíč s názvem config a jako hodnotu přidejte veškerý obsah konfiguračního souboru Nginx.
Vzhledem k tomu, že Kubernetes dokáže směrovat požadavky na příslušné hostitele pro danou službu, můžete pod parametrem fastcgi_pass zadat název vaší služby PHP-FPM namísto její IP adresy. Přidejte následující řádky kódu do svého souboru 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; } } |
Once completed, your nginx_configMap.yaml soubor vypadat takto:
|
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; } } |
Nyní můžete editor uložit a ukončit. Nyní spusťte kubectl apply příkaz pro vytvoření ConfigMap:
|
1 |
$ kubectl apply -f nginx_configMap.yaml |
Poté byste měli na obrazovce vidět následující výstup:
|
1 |
configmap/nginx-config vytvořeno |
Úspěšně jste vytvořili svůj Nginx Configmap. Nyní můžete vytvořit svůj Nginx Deployment.
Vytvoření Nginx Deploymentu
Pro začátek můžete vytvořit nový soubor s názvem nginx_deployment.yaml v editoru:
|
1 |
$ nano nginx_deployment.yaml |
Pojmenujte tento Deployment nginx a přidejte k němu štítek tier: backend štítek:
|
1 2 3 4 5 6 7 |
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: tier: backend |
Poté specifikujte počet replik přidáním pole replica do specifikace Deploymentu a přidejte k němu štítky app: nginx a tier: backend štítky:
|
1 2 3 4 5 6 7 |
... spec: replicas: 1 selector: matchLabels: app: nginx tier: backend |
Podobně přidejte šablonu podu. Ujistěte se, že jste přidali stejné štítky, které jste přidali v Deploymentu do selector.matchLabels. Můžete přidat následující:
|
1 2 3 4 5 6 |
... template: metadata: labels: app: nginx tier: backend |
Poskytněte Nginxu přístup k dříve vytvořenému PVC kódu přidáním následujících parametrů 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 |
Varování: Pokud není specifikován soubor, obsah klíče nahradí mountPath svazku. Jinými slovy, pokud není cesta explicitně specifikována, ztratíte veškerý obsah v cílové složce.
Nyní specifikujte název, image a port, které chcete ve svém podu použít. Zde použijeme nginx:1.7.9 image a port 80. Přidejte je pod spec.template.spec sekce:
|
1 2 3 4 5 6 |
... containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 |
Dále připojte svazek s kódem v /code, protože jak Nginx, tak PHP-FPM budou potřebovat přístup k souboru na stejné cestě:
|
1 2 3 4 |
... volumeMounts: - name: code mountPath: /code |
Obraz nginx-1.7.9 automaticky načítá jakýkoli konfigurační soubor v adresáři /etc/nginx/conf.d. Pokud nyní do tohoto adresáře připojíme konfigurační svazek, vytvoří se /etc/nginx/conf.d/site.conf. Pod sekci volumeMount přidejte následující:
|
1 2 3 |
... - name: config mountPath: /etc/nginx/conf.d |
Po dokončení všech výše uvedených kroků by měl váš soubor nginx_deployment.yaml vypadat takto:
|
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 |
Nyní můžete soubor uložit, zavřít a vytvořit Nginx Deployment spuštěním následujícího příkazu:
|
1 |
$ kubectl apply -f nginx_deployment.yaml |
Po úspěšném spuštění příkazu byste měli vidět následující výstup:
|
1 |
deployment.apps/nginx created |
Všechny své Deploymenty můžete vypsat spuštěním následujících příkazů:
|
1 |
$ kubectl get deployments |
Nyní byste měli vidět jak Nginx, tak PHP-FPM Deploymenty:
Dále můžete spustit následující příkaz pro výpis podů, které jsou spravovány oběma výše uvedenými Deploymenty:
|
1 |
$ kubectl get pods |
Uvidíte, že oba vaše pody jsou spuštěné a běží následovně:
Vzhledem k tomu, že všechny vaše objekty Kubernetes jsou v tomto okamžiku aktivní, můžete nyní přistupovat ke službě Nginx ve svém prohlížeči.
Spuštěním následujícího příkazu zobrazíte seznam služeb:
|
1 |
$ kubectl get services -o wide |
Poznamenejte si External IP vaší služby Nginx:
Nyní můžete pomocí této External IP adresy služby Nginx navštívit svůj server zadáním http://your_public_ip ve vašem prohlížeči. Měli byste vidět výstup z php_info(), který potvrzuje, že vaše služby Kubernetes jsou spuštěné a funkční.
Závěr
V tomto návodu jste pro nezávislou správu služeb PHP-FPM a Nginx tyto dvě služby kontejnerizovali. Tímto způsobem nejen zlepšíte škálovatelnost svého projektu, ale také efektivně využijete své prostředky. Naučili jste se také, jak vytvořit lokální úložiště a Persistent Volume pro uložení kódu aplikace na svazek a jak v budoucnu snadno aktualizovat své služby. Tímto způsobem jste zlepšili použitelnost a udržovatelnost svého kódu.
Kromě toho se podívejte na naše další návody zaměřené na Docker a Kubernetes, které najdete na našem blogu:
- Seznámení s Kubernetes
- Jak vytvořit Kubernetes cluster pomocí Kubeadm na Ubuntu 18.04
- Vyčištění prostředků Dockeru – obrazy, kontejnery a svazky
- Nasazení Laravelu, Nginx a MySQL pomocí Docker Compose
- Jak nainstalovat & provozovat Docker na Ubuntu ve veřejném cloudu
Příjemnou práci!


Komentáře
Zatím žádné komentáře. Buďte první.