Powrót do bloga

Wdróż aplikację PHP w klastrze Kubernetes z Ubuntu 18.04

Wdróż aplikację PHP w klastrze Kubernetes z Ubuntu 18.04

Kubernetes (znany również jako k8s) to otwartoźródłowy system orkiestracji. Umożliwia użytkownikom wdrażanie, skalowanie i zarządzanie skonteneryzowanymi aplikacjami przy minimalnym czasie przestoju. W tym samouczku dowiesz się, jak wdrożyć aplikację PHP w klastrze Kubernetes.

Nginx działa jako proxy dla PHP-FPM podczas uruchamiania aplikacji PHP. Zarządzanie tymi dwiema usługami w jednym kontenerze to trudny proces. Kubernetes pomaga nam zarządzać nimi w dwóch różnych kontenerach i zmniejsza kłopoty. Pozwala również użytkownikom na ponowne wykorzystanie kontenerów i brak konieczności martwienia się o budowanie obrazu kontenera dla każdej nowej wersji PHP/Nginx.

Uruchomisz swoją aplikację i usługę proxy w dwóch oddzielnych kontenerach. Samouczek dostarczy również informacji na temat tego, jak użyć lokalnej pamięci masowej do utworzenia Persistent Volume (PV) i Persistent Volume Claim (PVC). Następnie użyjesz tego PVC, aby zachować pliki konfiguracyjne i kod poza obrazami kontenerów. Po ukończeniu tego samouczka będziesz mógł ponownie wykorzystać swój obraz Nginx dla innych aplikacji wymagających serwera proxy. Możesz to osiągnąć poprzez przekazanie konfiguracji, zamiast ponownego budowania dla niej obrazu.

Wymagania wstępne

  1. Podstawowe zrozumienie platformy Kubernetes (k8s) i jej obiektów. Zapoznaj się z tym przewodnikiem, aby uzyskać szczegółowy przegląd ekosystemu Kubernetes.
  2. Działający klaster Kubernetes na systemie Ubuntu 18.04. Postępuj zgodnie z tym samouczkiem, aby utworzyć klaster Kubernetes za pomocą kubeadm.
  3. Dodatkowo musisz udostępnić kod swojej aplikacji pod publicznym adresem URL, na przykład na GitHub.

Krok 1: Tworzenie usług PHP-FPM i Nginx

Ten krok pomoże Ci utworzyć usługi PHP-FPM i Nginx. Każda usługa zapewnia dostęp do zestawu podów w klastrze. Wszystkie usługi obecne w klastrze mogą komunikować się ze sobą za pomocą swoich nazw, bez adresów IP. Usługa PHP-FPM i usługa Nginx zapewnią dostęp odpowiednio do podów PHP-FPM i Nginx.

Będziesz musiał wskazać usłudze PHP-FPM, jak znaleźć pody Nginx, ponieważ będzie ona działać jako proxy dla podów PHP-FPM. W tym celu skorzystasz z automatycznego wykrywania usług Kubernetes’ i użyjesz czytelnych dla człowieka nazw do kierowania żądań do odpowiedniej usługi.

Aby utworzyć dowolną usługę, musisz utworzyć plik YAML zawierający definicję obiektu. Ten plik YAML zawiera co najmniej następujące znaczniki:

  1. apiVersion: Wersja API Kubernetes, do której należy definicja.
  2. kind: Rodzaj obiektu Kubernetes, który tworzy ten plik YAML. Na przykład: service, job lub pod.
  3. metadata: Nazwa obiektu oraz różne labels (etykiety), które użytkownik może chcieć zastosować do tego obiektu, są zdefiniowane pod tym znacznikiem.
  4. spec: Ten znacznik zawiera specyfikację Twojego obiektu, taką jak zmienne środowiskowe (ENV), obraz kontenera, który ma zostać użyty, oraz porty, na których usługa kontenera będzie dostępna.
Tworzenie usługi PHP-FPM

Na początek należy utworzyć katalog do przechowywania definicji obiektów Kubernetes. Zaloguj się do swojego węzła nadrzędnego (master node) i utwórz katalog o nazwie “definitions:”

Przejdź do katalogu definitions:

Następnie utwórz plik usługi PHP-FPM jako plik php_service.yaml:

Następnie ustaw apiVersion oraz kind w pliku php_fpm_service.yaml:

Nazwij swoją usługę jako php lub php-fpm ponieważ zapewni ona dostęp do Twojej aplikacji PHP-FPM:

Oznacz swoją usługę php etykietą tier: backend ponieważ aplikacja PHP będzie działać za tą usługą:

Usługa używa etykiet selector (selektora), aby określić, do których podów ma uzyskać dostęp. Każdy pod pasujący do tych etykiet, niezależnie od tego, kiedy został utworzony, jest obsługiwany. W dalszej części tego samouczka dowiesz się, jak dodawać etykiety do podów.

Dołącz tier: backend etykietę, która przypisuje Twój pod do warstwy backend, wraz z app: php-fpm etykietą wskazującą, że pod uruchamia aplikację PHP-FPM. Musisz dodać te etykiety po sekcji metadata :

Następnie musisz zadeklarować port dostępu do tej usługi php-fpm w sekcji spec. Możesz dodać dowolny wybrany port, ale w tym samouczku użyjemy portu 9000 :

Po wykonaniu powyższych kroków Twój plik php_fpm_service.yaml będzie wyglądał następująco:

Wprowadź Ctrl + O aby zapisać plik, a następnie wprowadź Ctrl + X aby wyjść z nano.

Stosowanie polecenia kubectl w celu utworzenia usługi PHP

Po utworzeniu definicji obiektu dla usługi uruchom polecenie kubectl apply z argumentem -f określając plik php_fpm_service.yaml :

Wynik powyższego polecenia powinien być następujący:

Uruchom poniższe polecenie, aby zweryfikować, czy usługa php-fpm działa:

Zobaczysz, że usługa php-fpm jest uruchomiona i działa:

Uwaga: Kubernetes obsługuje różne typy usług. Twoja usługa php-fpm korzysta z domyślnego typu usługi ClusterIP. Ten typ usługi przypisuje wewnętrzny adres IP i sprawia, że usługa jest dostępna tylko z wnętrza klastra Kubernetes.
Tworzenie usługi Nginx

Ponieważ usługa PHP-FPM jest już gotowa, nadszedł czas na utworzenie również usługi Nginx. Utwórz i otwórz w edytorze nowy plik YAML dla tej usługi o nazwie nginx_service.yaml :

Nazwij tę usługę nginx, ponieważ będzie ona kierowana do podów Nginx. Ta usługa również należy do backendu, więc należy dodać do niej etykietę tier: backend :

Podobnie jak w przypadku usługi php-fpm, dodaj etykiety selektora app: nginx oraz tier: backend, aby wskazać pody. Dodaj domyślny port HTTP 80, aby uzyskać dostęp do tej usługi:

Usługa Nginx może być publicznie dostępna w Internecie pod publicznym adresem IP. Możesz dodać IP swojego węzła roboczego (worker node) jako your_public_ip. Dodaj poniższe linie pod sekcją spec.externalIPs:

Twój plik nginx_service.yaml powinien wyglądać jak ten poniżej po wykonaniu wszystkich powyższych kroków:

Zapisz i zamknij plik po dodaniu wszystkich wymaganych parametrów powyżej.

Stosowanie polecenia kubectl w celu utworzenia usługi Nginx
Dla powyższego polecenia powinieneś zobaczyć następujące dane wyjściowe:
Teraz wykonaj następujące polecenie, aby wyświetlić wszystkie uruchomione usługi:
Po uruchomieniu powyższego polecenia powinieneś zobaczyć, że zarówno usługa PHP-FPM, jak i Nginx są uruchomione i działają:
Pamiętaj, że jeśli chcesz usunąć którąkolwiek z uruchomionych usług, możesz wykonać poniższe polecenie:

Step 2: Create Local Storage and Persistent Volume

Kubernetes udostępnia różne wtyczki pamięci masowej, które pomagają tworzyć przestrzeń dyskową dla Twojego środowiska. Ten krok poprowadzi Cię przez proces tworzenia lokalnej klasy StorageClass i pokaże, jak ta klasa Storage Class może być dalej użyta do utworzenia woluminu Persistent Volume.

Tworzenie lokalnej pamięci masowej

Utwórz plik, na przykład storageClass.yaml, w swoim edytorze:

Dodaj kind jako "storageClass" oraz apiVersion jako "storage.k8s.io/v1" w następujący sposób:

Nazwij tę klasę StorageClass jako "my-local-storage" i dodaj provisioner oraz volumeBindingMode w następujący sposób:

Zapisz i zamknij plik. Twój ostateczny plik storageClass.yaml powinien wyglądać następująco:

Teraz utwórz klasę StorageClass, uruchamiając polecenie kubectl create, jak poniżej:

Po uruchomieniu powyższego polecenia powinieneś otrzymać następujące dane wyjściowe:

Tworzenie lokalnego woluminu Persistent Volume

Po utworzeniu lokalnej pamięci masowej możesz utworzyć lokalny wolumin Persistent Volume. Wolumin Persistent Volume, znany również jako PV, to pamięć blokowa o określonym rozmiarze, która jest niezależna od cyklu życia poda. Lokalny wolumin Persistent Volume to nic innego jak lokalny dysk lub katalog dostępny na węźle klastra Kubernetes. Ten lokalny wolumin Persistent Volume umożliwia użytkownikom dostęp do lokalnej pamięci masowej przy użyciu lokalnego żądania Persistent Volume Claim w bardzo prosty, a zarazem przenośny sposób. Możesz utworzyć ten lokalny wolumin Persistent Volume, korzystając z właśnie utworzonej klasy pamięci masowej. Otwórz plik, na przykład persistentVolume.yaml, w swoim edytorze:

Nadaj temu woluminowi persistent volume nazwę, na przykład "my-local-pv":

Podczas tworzenia lokalnego woluminu Persistent Volume możesz dodać pojemność pamięci masowej zgodnie ze swoimi potrzebami. W tym samouczku użyjemy 5 Gi na pamięć masową:

Dodaj accessModes, persistentVolumeReclaimPolicy i podaj taką samą nazwę storageClassName, jak użyta w storageClass.yaml:

Note: persistentVolumeReclaimPolicy określa, co dzieje się z wolumenem Persistent Volume po zwolnieniu jego żądania (Persistent Volume Claim). Dla tego parametru istnieją trzy prawidłowe opcje: Retain, Delete i Recycle. W naszym kodzie użyjemy opcji Retain. Więcej szczegółów na temat pola persistentVolumeReclaimPolicy można znaleźć tutaj: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#persistentvolumeclaim-v1-core

Dodaj local.path dla swojego Persistent Volume w następujący sposób:

Note: Upewnij się, że ta lokalna ścieżka (/mnt/disk/vol) istnieje na węźle Twojego klastra Kubernetes.

Po dodaniu wszystkich wymaganych pól Twój plik persistentVolume.yaml powinien wyglądać następująco:

Note: Musisz użyć prawidłowej nazwy węzła swojej maszyny. W tym przypadku jest to: “worker.”
Przygotowanie wolumenu lokalnego

Teraz musimy przygotować wolumen lokalny na węźle “worker”, tak jak dodaliśmy w pliku persistentVolume.yaml. Uruchom poniższe polecenia na węźle skonfigurowanym w persistentVolume. W tym przypadku jest to węzeł “worker”:

Note: Upewnij się, że masz wystarczające uprawnienia do utworzenia katalogu i zmiany uprawnień, jak pokazano powyżej. Jeśli nie, uruchom te polecenia jako odpowiedni użytkownik.

Uruchom poniższe polecenie na węźle nadrzędnym (master), na którym znajduje się Twój plik persistentVolume.yaml:

Powinieneś otrzymać następujący wynik:

Po pomyślnym utworzeniu pamięci lokalnej i wolumenu Persistent Volume możesz teraz przejść do utworzenia żądania Persistent Volume Claim, które będzie przechowywać kod aplikacji i pliki konfiguracyjne.

Krok 3: Utwórz Persistent Volume

Kod Twojej aplikacji musi być bezpieczny podczas zarządzania podami lub ich aktualizacji. W tym celu użyjesz wolumenu Persistent Volume utworzonego w poprzednim kroku, do którego dostęp uzyskuje się za pomocą PersistentVolumeClaim (PVC). To PVC montuje PV w wymaganej ścieżce.

Otwórz plik, na przykład code_volume.yaml, w edytorze:

Nazwij swoje PVC jako code, dodając do pliku poniższe parametry i wartości:

Sekcja spec w PVC zawiera następujące elementy:

  1. accessModes: Istnieją różne możliwe wartości dla tego pola, jak poniżej:
    • ReadWriteOnce – montuje wolumen dla pojedynczego węzła z uprawnieniami zarówno do odczytu, jak i zapisu.
    • ReadOnlyMany – montuje wolumen dla wielu węzłów tylko z uprawnieniem do odczytu.
    • ReadWriteMany – montuje wolumen dla wielu węzłów z uprawnieniami zarówno do odczytu, jak i zapisu.
  2. resources: definiuje wymaganą przestrzeń dyskową.

Ponieważ pamięć lokalna jest montowana tylko do jednego węzła, konieczne będzie ustawienie accessMode na ReadWriteOnce. W tym samouczku dodasz tylko niewielki fragment kodu aplikacji, dlatego 1 GB pamięci będzie tutaj wystarczający. Jeśli jednak chcesz przechowywać większą ilość danych lub kodu, możesz zmodyfikować parametr storage zgodnie ze swoimi wymaganiami. Pamiętaj, że po utworzeniu woluminu będzie można zwiększyć rozmiar pamięci. Jednak jej zmniejszenie nie jest obsługiwane:

Teraz zadeklaruj klasę pamięci (storage class), której klaster Kubernetes użyje do przydzielenia woluminów. Użyj utworzonej w poprzednim kroku klasy pamięci my-local-storage jako wartości parametru storageClassName:

Po wykonaniu powyższych kroków Twój plik code_volume.yaml powinien wyglądać następująco:

Teraz zapisz i zamknij plik.

Tworzenie PVC

Utwórz PVC code, uruchamiając polecenie kubectl apply:

Powinieneś otrzymać następujące dane wyjściowe, które wskazują, że obiekt został pomyślnie utworzony i jest gotowy do zamontowania Twojego PVC o rozmiarze 1 GB jako woluminu:

Możesz uruchomić następujące polecenie, aby sprawdzić dostępny wolumin Persistent Volume (PV):

Wynik powyższego polecenia powinien być następujący:

Wszystkie powyższe pola, z wyjątkiem Reclaim Policy i Status, stanowią przegląd Twojego pliku konfiguracyjnego. Reclaim Policy definiuje, co dzieje się z PV po usunięciu uzyskującego do niego dostęp PVC. Wartość Delete usuwa PV zarówno z klastra Kubernetes, jak i z infrastruktury pamięci masowej. Możesz zapoznać się z dokumentacją Kubernetes PV, aby dokładnie zrozumieć działanie Reclaim Policy i Status.

Możesz teraz utworzyć swoje pody za pomocą wdrożenia (Deployment), ponieważ pomyślnie utworzyłeś wolumin Persistent Volume przy użyciu pamięci lokalnej.

Step 4: Create Deployment for your PHP-FPM Application

Ten krok pomoże Ci utworzyć pod PHP-FPM przy użyciu Deployment. Deployment używa ReplicaSets, aby zapewnić stabilny sposób tworzenia, aktualizowania i zarządzania podami. Deployment automatycznie przywraca pody do poprzedniego obrazu.

Klucz spec.selector we wdrożeniu (Deployment) zawiera listę wszystkich etykiet podów, którymi zarządza. Używa również klucza template do tworzenia wymaganych podów.

W tym kroku wprowadzimy również zastosowanie Init Containers. Kontenery Init (Init Containers) uruchamiają kilka poleceń przed zwykłymi kontenerami określonymi w szablonie poda. W tym przypadku kontener Init użyje usługi GitHub Gist (https://gist.github.com/) do pobrania przykładowego pliku index.php. Zawartość przykładowego pliku to:

Tworzenie wdrożenia PHP

Otwórz nowy plik o nazwie php_deployment.yaml w edytorze, aby utworzyć wdrożenie (Deployment):

Teraz nazwij obiekt Deployment jako PHP, ponieważ ten Deployment będzie zarządzał Twoimi podami PHP-FPM. Dodaj etykietę tier: backend ponieważ pod będzie należał do warstwy backendu:

Używając parametru replica, określ liczbę kopii tego poda, które powinny zostać utworzone. Liczba replik może się różnić w zależności od Twoich wymagań i dostępnych zasobów. W tym samouczku utworzysz tylko jedną replikę swojego poda:

Dodaj app: php oraz tier:backend etykiety pod kluczem selector, który oznacza, że ten Deployment będzie zarządzał podami pasującymi do tych dwóch etykiet:

Teraz definicja obiektu Twojego poda wymaga szablonu (template) w specyfikacji Deploymentu. Ten szablon definiuje specyfikację potrzebną do utworzenia poda. Na początek dodaj etykiety, które zostały określone dla selektora usługi php oraz matchLabels Deploymentu. Następnie dodaj app:php oraz tier:backend pod template.metadata.labels:

Uwaga: Pod może mieć wiele kontenerów lub wolumenów i każdy z nich będzie potrzebował innej nazwy, aby można było je rozróżnić.  Możesz określić ścieżkę montowania dla każdego wolumenu, aby selektywnie zamontować ten wolumen w kontenerze.

Najpierw musisz określić wszystkie wolumeny, do których Twoje kontenery będą miały dostęp. Nazwij ten wolumen code, ponieważ utworzyłeś PVC o nazwie code do przechowywania kodu aplikacji:

Następnie określ nazwę kontenera wraz z obrazem, który chcesz uruchomić wewnątrz poda. W sklepie Docker dostępnych jest wiele różnych obrazów (https://hub.docker.com/explore/), ale w tym samouczku użyjemy obrazu php:7-fpm :

Teraz zamontuj wolumeny, do których kontener wymaga dostępu. Ponieważ ten kontener będzie uruchamiał Twój kod PHP, będzie potrzebował dostępu do wolumenu code utworzonego w poprzednim kroku. W tym kroku dowiesz się również, jak skopiować kod aplikacji za pomocą Init Containera.

Uwaga: Możesz użyć jednego initContainera do uruchomienia skryptu budującego aplikację lub jednego initContainera na polecenie, w zależności od złożoności procesu konfiguracji. Musisz upewnić się, że wolumeny są zamontowane w initContainerze.

Aby pobrać kod, ten samouczek pokaże Ci, jak użyć pojedynczego Init Containera z busybox. Busybox to mały kontener z narzędziem wget, którego użyjesz do tego celu.

Najpierw dodaj swój initContainer pod spec.template.spec i określ obraz busybox:

Następnie, aby pobrać kod do wolumenu code, Twój Init Container będzie potrzebował do niego dostępu. Zamontuj wolumen code w ścieżce /code pod spec.template.spec.initContainers:

Każdy Init Container wymaga uruchomienia polecenia. Ten Init Container użyje wget do pobrania code z Github do katalogu /code . Możesz przekazać opcję -O , aby nadać pobranemu plikowi nazwę, i możesz nazwać ten plik index.php.

Uwaga: Upewnij się, że ufasz kodowi, który pobierasz za pomocą Init Containera na swój serwer. Możesz sprawdzić kod źródłowy i upewnić się, że zgadzasz się z tym, co robi.

Dodatkowo dodaj poniższe linie pod kontenerem install w spec.template.spec.initContainers:

Po wykonaniu wszystkich tych kroków Twój plik php_deployment.yaml powinien wyglądać następująco:

Możesz teraz zapisać plik i wyjść. Następnie utwórz wdrożenie PHP-FPM za pomocą kubectl apply polecenia:

Pomyślne utworzenie wdrożenia (Deployment) powinno dać poniższy wynik:

To wdrożenie rozpoczyna się od pobrania określonych obrazów, następnie zażąda PersistentVolume z Twojego PersistentVolumeClaim, a następnie uruchomi initContainers. Po zakończeniu tego kroku kontenery zostaną uruchomione i zamontują woluminy w określonym punkcie montowania. Po wykonaniu wszystkich tych kroków Twój pod będzie działał.

Możesz uruchomić poniższe polecenie, aby wyświetlić swoje wdrożenie (Deployment):

Po uruchomieniu powyższego polecenia powinieneś otrzymać poniższy wynik:

Możesz zrozumieć bieżący stan wdrożenia za pomocą tego wyniku. Wdrożenie (Deployment) to kontroler, który utrzymuje pożądany stan. Pole DESIRED określa, że posiada ono 1 replikę poda o nazwie php. Pole CURRENT wskazuje, ile replik stanu DESIRED jest obecnie uruchomionych. Dla prawidłowo działającego poda powinno to być zgodne ze stanem DESIRED state. Więcej informacji o pozostałych polach można znaleźć w dokumentacji Kubernetes Deployments.

Następnie, aby sprawdzić status uruchomionego poda, możesz uruchomić poniższe polecenie:

Wynik tego polecenia może się różnić w zależności od czasu, jaki upłynął od utworzenia wdrożenia (Deployment). Jeśli zostanie ono uruchomione krótko po utworzeniu wdrożenia, wynik będzie podobny do:

Wyjaśnienie:

Te kolumny reprezentują następujące informacje:

  • Ready: Liczba bieżących/pożądanych replik uruchomionych w tym podzie.
  • Status: Status Twojego poda. Init:0/1 oznacza, że kontenery Init są uruchomione i 0 z 1 kontenerów Init zakończyło działanie.
  • Restarts: Wskazuje to liczbę ponownych uruchomień tego procesu w celu uruchomienia poda.

Zmiana statusu Twojego poda na podInitializing może zająć kilka minut, w zależności od złożoności skryptów startowych:

Oznacza to, że kontenery Init zostały pomyślnie uruchomione i teraz następuje inicjalizacja kontenerów:

Jak widać, Twój pod jest teraz uruchomiony i działa. Jeśli jednak pod się nie uruchomi, możesz użyć poniższych poleceń w celach debugowania:

1. Aby wyświetlić szczegółowe informacje o podzie:

2.  Aby wyświetlić logi poda:

Uwaga: Dla polecenia “kubectl logs” dostępnych jest wiele opcji. Możesz uruchomić polecenie “kubectl logs –help”, aby dowiedzieć się więcej.

3. Aby wyświetlić logi konkretnego kontenera w podzie:

Gratulacje! Pomyślnie zamontowano kod aplikacji, a usługa PHP-FPM jest gotowa do obsługi połączeń. W podobny sposób możesz utworzyć wdrożenie Nginx.

Krok 5: Utwórz wdrożenie Nginx

Ten krok poprowadzi Cię przez konfigurację Nginx przy użyciu ConfigMap. ConfigMap przechowuje wszystkie wymagane konfiguracje w formacie klucz-wartość, które będą używane w innych definicjach obiektów Kubernetes. Dzięki temu podejściu masz elastyczność ponownego użycia lub zamiany obrazu Nginx na inną wersję w razie potrzeby. Możesz zaktualizować ConfigMap, a zmiany te zostaną automatycznie zreplikowane do każdego poda, który montuje ten ConfigMap.

Na początek otwórz plik nginx_configmap.yaml w swoim edytorze:

Teraz nazwij ten ConfigMap jako nginx-config i dodaj go do tier: backend mikrousługi:

Dodatkowo możesz dodać dane do ConfigMap. Dodaj klucz o nazwie config i dodaj całą zawartość pliku konfiguracyjnego Nginx jako wartość.

Ponieważ Kubernetes może kierować żądania do odpowiednich hostów dla danej usługi, możesz wpisać nazwę swojej usługi PHP-FPM w parametrze fastcgi_pass zamiast jej adresu IP. Dodaj następujące linie kodu do swojego pliku nginx_configMap.yaml :

Po zakończeniu Twój plik nginx_configMap.yaml będzie wyglądać następująco:

Możesz teraz zapisać i zamknąć edytor. Teraz wykonaj polecenie kubectl apply polecenie, aby utworzyć ConfigMap:

Następnie na ekranie powinien pojawić się poniższy wynik:

Pomyślnie utworzono obiekt ConfigMap dla Nginx. Teraz możesz utworzyć wdrożenie (Deployment) Nginx.

Tworzenie wdrożenia Nginx

Na początek możesz utworzyć nowy plik o nazwie nginx_deployment.yaml w edytorze:

Nazwij to wdrożenie (Deployment) nginx i dodaj do niego etykietę tier: backend:

Następnie określ liczbę replik, dodając pole replica w specyfikacji wdrożenia (Deployment spec) i dodaj do niego etykiety app: nginx oraz tier: backend:

Podobnie dodaj szablon poda. Upewnij się, że dodajesz te same etykiety, które zostały dodane w sekcji selector.matchLabels wdrożenia. Możesz dodać następujące elementy:

Zapewnij Nginx dostęp do utworzonego wcześniej PVC kodu, dodając następujące parametry w sekcji spec.template.spec.volumes:

Uwaga: Pod może zamontować ConfigMap jako wolumen. Określając nazwę pliku i klucz, utworzymy plik z jego wartością jako zawartością. Aby użyć tej mapy konfiguracji (ConfigMap), ustaw ścieżkę (path) na nazwę pliku, który przechowuje zawartość klucza. Możesz utworzyć plik site.conf z klucza config. Dodaj następujący kod w sekcji spec.template.spec.volumes:

Ostrzeżenie: Zawartość klucza zastąpi ścieżkę montowania (mountPath) wolumenu, jeśli plik nie zostanie określony. Innymi słowy, utracisz całą zawartość folderu docelowego, jeśli ścieżka nie zostanie wyraźnie określona.

Teraz określ nazwę, obraz i port, których chcesz użyć w swoim podzie. Tutaj użyjemy obrazu nginx:1.7.9 oraz portu 80. Dodaj je w sekcji spec.template.spec - sekcja:

Dodatkowo zamontuj wolumen kodu w /code, ponieważ zarówno Nginx, jak i PHP-FPM będą potrzebować dostępu do pliku pod tą samą ścieżką:

Obraz nginx-1.7.9 automatycznie ładuje każdy plik konfiguracyjny z folderu /etc/nginx/conf.d. Jeśli teraz zamontujemy wolumen konfiguracyjny w tym katalogu, utworzy on /etc/nginx/conf.d/site.conf. Dodaj poniższe elementy pod sekcją volumeMount:

Po wykonaniu wszystkich powyższych kroków Twój plik nginx_deployment.yaml powinien wyglądać następująco:

Możesz teraz zapisać i zamknąć plik, a następnie utworzyć wdrożenie (Deployment) Nginx, uruchamiając następujące polecenie:

Po pomyślnym wykonaniu polecenia powinieneś zobaczyć następujący wynik:

Możesz wyświetlić listę wszystkich swoich wdrożeń (Deployments), wykonując poniższe polecenia:

Powinieneś teraz zobaczyć wdrożenia (Deployments) zarówno Nginx, jak i PHP-FPM:

kubernetes deployment status

Ponadto możesz wykonać następujące polecenie, aby wyświetlić listę podów, które są zarządzane przez oba wymienione powyżej wdrożenia:

Zobaczysz, że oba pody działają i są uruchomione w następujący sposób:

kubernetes pod status

Ponieważ wszystkie obiekty Kubernetes są w tym momencie aktywne, możesz teraz uzyskać dostęp do usługi Nginx w swojej przeglądarce.

Uruchom następujące polecenie, aby wyświetlić listę usług:

Zanotuj zewnętrzny adres IP (External IP) swojej usługi Nginx:external ip of nginx Deploy a PHP Application on Kubernetes Cluster with Ubuntu 18.04

Teraz, używając tego zewnętrznego adresu IP usługi Nginx, możesz odwiedzić swój serwer, wpisując http://your_public_ip w przeglądarce. Powinieneś zobaczyć wynik działania php_info(), który potwierdza, że Twoje usługi Kubernetes działają i są uruchomione.

Podsumowanie

W tym samouczku, aby niezależnie zarządzać usługami PHP-FPM i Nginx, skonteneryzowałeś obie te usługi. Dzięki temu nie tylko poprawisz skalowalność swojego projektu, ale także efektywnie wykorzystasz zasoby. Dowiedziałeś się również, jak utworzyć lokalną pamięć masową i wolumen trwały (Persistent Volume), aby przechowywać kod aplikacji na wolumenie i móc łatwo aktualizować swoje usługi w przyszłości. W ten sposób poprawiłeś użyteczność i łatwość utrzymania swojego kodu.

Ponadto zapoznaj się z naszymi innymi samouczkami dotyczącymi Dockera i Kubernetesa, które znajdziesz na naszym blogu:

Udanego kodowania!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev jest projektantem kreatywnym w CloudSigma, skupiającym się na spójnej tożsamości biznesowej przy wykorzystaniu tradycyjnych i innowacyjnych kanałów marketingowych. Biegle łączy wizję artystyczną ze strategicznym marketingiem, tworząc wywierające wpływ narracje marki.

Komentarze

Brak komentarzy. Bądź pierwszy.