Bloğa geri dön

Ubuntu 18.04 ile bir Kubernetes Kümesinde PHP Uygulaması Dağıtma

Ubuntu 18.04 ile bir Kubernetes Kümesinde PHP Uygulaması Dağıtma

Kubernetes (k8s olarak da bilinir) açık kaynaklı bir orkestrasyon sistemidir. Kullanıcıların konteynerleştirilmiş uygulamaları minimum kesinti süresiyle dağıtmasına, ölçeklendirmesine ve yönetmesine olanak tanır. Bu öğreticide, bir PHP Uygulamasını bir Kubernetes Kümesinde nasıl dağıtacağınızı öğreneceksiniz.

Nginx, bir PHP uygulamasını çalıştırırken PHP-FPM için bir proxy görevi görür. Bu iki hizmeti tek bir konteynerde yönetmek zor bir süreçtir. Kubernetes bunları iki farklı konteynerde yönetmemize yardımcı olur ve zahmeti azaltır. Ayrıca kullanıcıların konteynerleri yeniden kullanmasına ve her yeni PHP/Nginx sürümü için kendi konteyner imajlarını oluşturma konusunda endişelenmemelerine olanak tanır.

Uygulamanızı ve proxy hizmetinizi iki ayrı konteynerde çalıştıracaksınız. Bu öğretici ayrıca, bir Persistent Volume (PV) ve Persistent Volume Claim (PVC) oluşturmak için yerel depolamanın nasıl kullanılacağına dair bilgiler de sağlayacaktır. Daha sonra yapılandırma dosyalarınızı ve kodunuzu konteyner imajlarının dışında tutmak için bu PVC'yi kullanacaksınız. Bu öğreticiyi tamamladıktan sonra, Nginx imajınızı proxy sunucusu gerektiren diğer uygulamalar için yeniden kullanabileceksiniz. Bunu, imajı yeniden oluşturmak yerine bir yapılandırma ileterek gerçekleştirebilirsiniz.

Önkoşullar

  1. Kubernetes (k8s) ve nesneleri hakkında temel bir anlayış. Şunun için bu kılavuza başvurun: Kubernetes ekosistemine ayrıntılı genel bakış.
  2. Ubuntu 18.04 üzerinde çalışan bir Kubernetes kümesi. Şunun için bu öğreticiyi takip edin: kubeadm kullanarak Kubernetes kümenizi oluşturun.
  3. Ek olarak, uygulama kodunuzu herkese açık bir URL'de barındırmanız gerekir, örneğin, GitHub.

Adım 1: PHP-FPM ve Nginx Hizmetlerini Oluşturma

Bu adım, PHP-FPM ve Nginx hizmetlerini oluşturmanıza yardımcı olacaktır. Herhangi bir hizmet, bir küme içindeki bir dizi pod'a erişim sağlar. Bir kümede bulunan tüm hizmetler, IP adresleri olmadan kendi adlarıyla birbirleriyle iletişim kurabilir. PHP-FPM hizmeti ve Nginx hizmeti, sırasıyla PHP-FPM ve Nginx pod'larına erişim sağlayacaktır.

PHP-FPM pod'ları için bir proxy görevi göreceğinden, PHP-FPM hizmetine Nginx pod'larını nasıl bulacağını söylemeniz gerekecektir. Bunun için Kubernetes’in otomatik hizmet keşfinden yararlanacak ve isteği ilgili hizmete yönlendirmek için okunabilir adlar kullanacaksınız.

Herhangi bir hizmet oluşturmak için, nesne tanımını içeren bir YAML dosyası oluşturmanız gerekecektir. Bu YAML dosyası en azından aşağıdaki etiketlere sahiptir:

  1. apiVersion: Tanımın ait olduğu Kubernetes API sürümü.
  2. kind: Bu YAML dosyasının oluşturduğu Kubernetes nesnesinin türü. Örneğin: bir service, bir job, veya bir pod.
  3. metadata: Nesnenin adı ve kullanıcının bu nesneye uygulamak isteyebileceği farklı labels bu etiket altında tanımlanır.
  4. spec: Bu etiket; ENV'ler, kullanılacak konteyner imajı, konteyner hizmetine erişilebilecek bağlantı noktaları gibi nesnenizin nesne özelliklerini içerir.
PHP-FPM hizmetini oluşturma

Başlamak için, Kubernetes nesne tanımınızı tutmak üzere bir dizin oluşturmalısınız. Master düğümünüzde oturum açın ve “definitions:”

Dizini definitions dizini olarak değiştirin:

Ardından, PHP-FPM hizmet dosyanızı php_service.yaml dosyası olarak oluşturun:

Bundan sonra, apiVersion ve kind değerlerini php_fpm_service.yaml dosyasında ayarlayın:

PHP-FPM uygulamanıza erişim sağlayacağı için hizmetinizi php veya php-fpm olarak adlandırın:

PHP uygulaması bu hizmetin arkasında çalışacağından, php hizmetinizi tier: backend olarak etiketleyin:

Bir hizmet, hangi pod'lara erişeceğini belirlemek için selector etiketlerini kullanır. Pod'un ne zaman oluşturulduğuna bakılmaksızın, bu etiketlerle eşleşen her pod'a hizmet verilir. Bu öğreticinin ilerleyen kısımlarında pod'larınıza nasıl etiket ekleyeceğinizi öğreneceksiniz.

Pod'unuzu backend katmanına atayan tier: backend etiketini ve pod'un bir PHP-FPM uygulaması çalıştırdığını belirten app: php-fpm etiketini dahil edin. Bu etiketleri şu bölümden sonra eklemelisiniz: metadata bölümü:

Ardından, bu servise erişmek için portu tanımlamanız gerekir: php-fpm servisi, şunun altında: spec. İstediğiniz herhangi bir portu ekleyebilirsiniz, ancak biz bu eğitimde 9000 portunu kullanacağız:

Yukarıdaki adımları tamamladıktan sonra, php_fpm_service.yaml dosyanız şu şekilde görünecektir:

Dosyayı kaydetmek için Ctrl + O tuşlarına basın, ardından çıkmak için Ctrl + X tuşlarına basarak şundan çıkın: nano.

PHP servisini oluşturmak için kubectl komutunu uygulama

Servisiniz için nesne tanımı oluşturulduktan sonra, kubectl apply komutunu -f parametresiyle ve php_fpm_service.yaml dosyanızı belirterek çalıştırın:

Yukarıdaki komutun çıktısı şu şekilde olmalıdır:

php-fpm servisinizin çalıştığını doğrulamak için aşağıdaki komutu çalıştırın:

php-fpm servisinin çalışır durumda olduğunu görebileceksiniz:

Not: Kubernetes çeşitli servis türlerini destekler. php-fpm servisiniz varsayılan ClusterIP servis türünü kullanır. Bu servis türü dahili bir IP atar ve servisin yalnızca Kubernetes kümesi içinden erişilebilir olmasını sağlar.
Nginx servisini oluşturma

PHP-FPM servisiniz artık hazır olduğuna göre, Nginx servisinizi de oluşturma zamanı geldi. Editörde bu servis için nginx_service.yaml adında yeni bir YAML dosyası oluşturun ve açın:

Nginx pod'larını hedefleyeceği için bu servisi nginx olarak adlandırın. Bu servis de backend katmanına ait olduğundan, ona bir tier: backend etiketi eklemelisiniz:

php-fpm servisinde yaptığımız gibi, pod'ları hedeflemek için app: nginx ve tier: backend seçici etiketlerini ekleyin. Bu servise erişmek için varsayılan HTTP portu olan 80 portunu ekleyin:

Nginx servisine genel IP adresinden internet üzerinden herkese açık olarak erişilebilir. Worker node’unuzun IP’sini your_public_ip olarak ekleyebilirsiniz. Aşağıdaki satırları şu bölümün altına ekleyin: spec.externalIPs:

Yukarıdaki adımların tümünü tamamladığınızda, nginx_service.yaml dosyanız aşağıdaki gibi görünmelidir:

Yukarıdaki tüm gerekli parametreleri ekledikten sonra dosyayı kaydedip kapatın.

Nginx servisini oluşturmak için kubectl komutunu uygulama
Yukarıdaki komut için aşağıdaki çıktıyı görmelisiniz:
Şimdi, çalışan tüm servislerinizi görüntülemek için aşağıdaki komutu yürütün:
Yukarıdaki komutu çalıştırarak hem PHP-FPM hem de Nginx servislerinizin çalışır durumda olduğunu görebilmelisiniz:
Çalışan servislerinizden herhangi birini silmek isterseniz aşağıdaki komutu yürütebileceğinizi unutmayın:

Adım 2: Yerel Depolama ve Kalıcı Birim (Persistent Volume) Oluşturma

Kubernetes, ortamınız için depolama alanı oluşturmanıza yardımcı olan çeşitli depolama eklentileri sunar. Bu adım, yerel bir StorageClass oluşturma ve bu Depolama Sınıfının Kalıcı Birim oluşturmak için daha sonra nasıl kullanılabileceği konusunda size yol gösterecektir.

Yerel depolama oluşturma

Editörünüzde, örneğin storageClass.yaml adında bir dosya oluşturun:

kind değerini "storageClass" ve apiVersion değerini "storage.k8s.io/v1" olarak aşağıdaki gibi ekleyin:

Bu StorageClass'ı "my-local-storage" olarak adlandırın ve provisioner ile volumeBindingMode alanlarını aşağıdaki gibi ekleyin:

Dosyayı kaydedip kapatın; nihai storageClass.yaml dosyanız şu şekilde görünmelidir:

Şimdi, aşağıdaki gibi kubectl create komutunu çalıştırarak StorageClass'ı oluşturun:

Yukarıdaki komutu çalıştırdıktan sonra aşağıdaki çıktıyı almalısınız:

Yerel Kalıcı Birim (Persistent Volume) Oluşturma

Yerel Depolama oluşturduktan sonra yerel Kalıcı Biriminizi oluşturabilirsiniz. PV olarak da bilinen Kalıcı Birim, bir podun yaşam döngüsünden bağımsız olan, belirli boyuttaki blok depolamadır. Yerel bir Kalıcı Birim, bir Kubernetes küme düğümünde bulunan yerel bir disk veya dizinden başka bir şey değildir. Bu yerel Kalıcı Birim, kullanıcılarının yerel bir Kalıcı Birim Talebi (Persistent Volume Claim) kullanarak yerel depolamaya son derece basit ama taşınabilir bir şekilde erişmesini sağlar. Bu yerel Kalıcı Birimi, az önce oluşturduğumuz depolama sınıfını kullanarak oluşturabilirsiniz. Editörünüzde, örneğin persistentVolume.yaml adında bir dosya açın:

Bu kalıcı birime, örneğin "my-local-pv":

Yerel bir Kalıcı Birim oluştururken kullanımınıza göre depolama kapasitesi ekleyebilirsiniz. Bu eğitimde depolama için 5 Gi kullanacağız:

accessModes, persistentVolumeReclaimPolicy alanlarını ekleyin ve storageClass.yaml dosyasında kullanılanla aynı storageClassName değerini sağlayın:

Not: persistentVolumeReclaimPolicy, talebi (Persistent Volume Claim) serbest bırakıldığında Kalıcı Birime (Persistent Volume) ne olacağını belirtir. Bu parametre için geçerli üç seçenek vardır: Retain, Delete ve Recycle. Kodumuzda Retain seçeneğini kullanacağız. Daha fazla ayrıntı için persistentVolumeReclaimPolicy alanını buradan kontrol edebilirsiniz: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#persistentvolumeclaim-v1-core

Kalıcı Biriminiz için local.path değerini aşağıdaki gibi ekleyin:

Not: Bu yerel yolun (/mnt/disk/vol) Kubernetes küme düğümünüzde mevcut olduğundan emin olun.

Gerekli tüm alanları ekledikten sonra, persistentVolume.yaml dosyanız şu şekilde görünmelidir:

Not: Makinenizin doğru düğüm adını kullanmalısınız. Bu durumda bu ad: “worker.”
Yerel Birimi Hazırlama

Şimdi, persistentVolume.yaml dosyasında eklediğimiz gibi “worker” düğümünde yerel bir birim hazırlamamız gerekiyor. persistentVolume içinde yapılandırdığınız düğümde aşağıdaki komutları çalıştırın. Bu durumda bu düğüm “worker” düğümüdür:

Not: Dizini oluşturmak ve yukarıda gösterildiği gibi izni değiştirmek için yeterli yetkiniz olduğundan emin olun. Yetkiniz yoksa komutları doğru kullanıcıyla çalıştırın.

Aşağıdaki komutu, persistentVolume.yaml dosyanızın bulunduğu master düğümde çalıştırın:

Aşağıdaki çıktıyı almalısınız:

Yerel depolama alanınızı ve Kalıcı Biriminizi (Persistent Volume) başarıyla oluşturduğunuza göre, artık uygulama kodunuzu ve yapılandırma dosyalarınızı tutmak için bir Kalıcı Birim Talebi (Persistent Volume Claim) oluşturmaya geçebilirsiniz.

Adım 3: Kalıcı Birimi Oluşturma

Pod'larınızı yönetirken veya güncellerken uygulama kodunuzun güvende tutulması gerekir. Bunun için, bir önceki adımda oluşturulan ve bir PersistentVolumeClaim (PVC) kullanılarak erişilen Kalıcı Birimi (Persistent Volume) kullanacaksınız. Bu PVC, PV'yi gerekli yola bağlar.

Editörünüzde, örneğin code_volume.yaml, adında bir dosya açın:

Dosyanıza aşağıdaki parametreleri ve değerleri ekleyerek PVC'nizi code olarak adlandırın:

Bir PVC'nin spec bölümü aşağıdaki öğeleri içerir:

  1. accessModes: Bu alan için olası çeşitli değerler aşağıdaki gibidir:
    • ReadWriteOnce – Birimi, hem okuma hem de yazma izinleriyle tek bir düğüm için bağlar.
    • ReadOnlyMany – Birimi, yalnızca okuma izniyle birçok düğüm için bağlar.
    • ReadWriteMany – Birimi, hem okuma hem de yazma izinleriyle birçok düğüm için bağlar.
  2. resources: Gerekli depolama alanını tanımlar.

Yerel depolama yalnızca tek bir düğüme bağlandığından, accessMode değerini ReadWriteOnce olarak ayarlamanız gerekecektir. Bu öğreticide yalnızca küçük bir uygulama kodu parçası ekleyeceksiniz, bu nedenle burada 1 GB depolama alanı yeterli olacaktır. Ancak, daha büyük miktarda veri veya kod depolamak istiyorsanız, depolama parametresini gereksinimlerinize göre değiştirebilirsiniz. Birim oluşturulduktan sonra depolama boyutunu artırabileceğinizi unutmayın. Ancak, boyutun azaltılması desteklenmez:

Şimdi, Kubernetes kümesinin birimlere tahsis etmek için kullanacağı depolama sınıfını bildirin. storageClassName değeriniz için burada, önceki adımda oluşturulan my-local-storage depolama sınıfını kullanın:

Yukarıdaki adımları tamamladıktan sonra, code_volume.yaml dosyanız şu şekilde görünmelidir:

Şimdi dosyayı kaydedip çıkın.

PVC Oluşturma

kubectl apply komutunu çalıştırarak code PVC'sini oluşturun:

Nesnenin başarıyla oluşturulduğunu ve 1 GB PVC'nizi birim olarak bağlamaya hazır olduğunu belirten aşağıdaki çıktıyı almalısınız:

Mevcut Kalıcı Birimi (PV) kontrol etmek için aşağıdaki komutu yürütebilirsiniz:

Yukarıdaki komutun çıktısı aşağıdaki gibi olmalıdır:

Geri Kazanım Politikası (Reclaim Policy) ve Durum (Status) dışındaki yukarıdaki tüm alanlar, yapılandırma dosyanızın genel bir özetidir. Geri Kazanım Politikası, ona erişen PVC silindiğinde PV'ye ne olacağını tanımlar. Delete değeri, PV'yi hem Kubernetes kümesinden hem de depolama altyapısından kaldırır. Geri Kazanım Politikası ve Durum hakkında net bir anlayışa sahip olmak için Kubernetes PV documentation başvurabilirsiniz.

Yerel depolamayı kullanarak Kalıcı Biriminizi başarıyla oluşturduğunuza göre, artık bir Deployment kullanarak pod'larınızı oluşturabilirsiniz.

Adım 4: PHP-FPM Uygulamanız için Deployment Oluşturma

Bu adım, Deployment kullanarak PHP-FPM pod'unuzu oluşturmanıza yardımcı olacaktır. Deployment, pod'larınızı oluşturmak, güncellemek ve yönetmek için kararlı bir yol sağlamak üzere ReplicaSet'leri kullanır. Bir Deployment, pod'larını otomatik olarak önceki bir imaja geri döndürür.

Deployment içindeki spec.selector anahtarı, yönettiği pod'ların tüm etiketlerini listeler. Ayrıca gerekli pod'ları oluşturmak için template anahtarını kullanır.

Bu adımda ayrıca Init Containers uygulamasını da tanıtacağız. Init Container'lar, pod’un şablonu altında belirtilen normal konteynerlerden önce birkaç komut çalıştırır. Burada Init Container, örnek bir index.php dosyası almak için GitHub Gist (https://gist.github.com/) kullanacaktır. Örnek dosyanın içeriği şöyledir:

PHP Deployment Oluşturma

Deployment'ınızı oluşturmak için düzenleyicinizde php_deployment.yaml adında yeni bir dosya açın:

Şimdi, bu Deployment PHP-FPM pod'larınızı yöneteceğinden Deployment nesnesini PHP olarak adlandırın. Şu etiketi ekleyin: tier: backend çünkü pod backend katmanına ait olacak:

replica parametresini kullanarak, bu pod'un oluşturulması gereken kopya sayısını belirtin. Replika sayısı, gereksinimlerinize ve mevcut kaynaklara bağlı olarak değişebilir. Bu öğreticide, pod'unuzun yalnızca bir replikasını oluşturacaksınız:

Şunu ekleyin: app: php ve tier:backend etiketlerini, bu Deployment'ın bu iki etiketle eşleşen pod'ları yöneteceğini belirten selector anahtarının altına ekleyin:

Şimdi, pod'unuzun nesne tanımının Deployment spec'iniz altında bir şablona (template) ihtiyacı var. Bu şablon, pod'unuzu oluşturmak için gereken özellikleri tanımlar. Başlamak için, php servis seçicisi ve Deployment'ın matchLabels'ı için belirtilen etiketleri ekleyin. Ardından şunu ekleyin: app:php ve tier:backend şunun altına: template.metadata.labels:

Not: Bir pod birden fazla konteynere veya birime (volume) sahip olabilir ve bunları birbirlerinden ayırt edebilmek için her birinin farklı bir isme ihtiyacı olacaktır. Her bir birimi bir konteynere seçici olarak bağlamak (mount) için bir bağlama yolu (mount path) belirtebilirsiniz.

İlk olarak, konteynerlerinizin erişeceği tüm birimleri (volumes) belirtmeniz gerekir. Uygulama kodunuzu tutmak için code adında bir PVC oluşturduğunuzdan, bu birimi code olarak adlandırın:

Ardından, pod'unuzun içinde çalıştırmak istediğiniz imajla birlikte konteyner adını belirtin. Docker mağazasında (https://hub.docker.com/explore/) çeşitli imajlar mevcuttur, ancak bu öğreticide şu imajı kullanacağız: php:7-fpm imajı:

Şimdi, konteynerin erişmesi gereken birimleri bağlayın (mount edin). Bu konteyner php kodunuzu çalıştıracağından, bir önceki adımda oluşturulan code birimine erişmesi gerekecektir. Bu adımda ayrıca Init Container kullanarak uygulama kodunuzu nasıl kopyalayacağınızı da öğreneceksiniz.

Not: Kurulum sürecinizin karmaşıklığına bağlı olarak, uygulamanızı derleyen bir betiği çalıştırmak için tek bir initContainer kullanabilir veya komut başına bir initContainer kullanabilirsiniz. Birimlerin initContainer'a bağlandığından (mount edildiğinden) emin olmanız gerekir.

Kodu indirmek için bu öğretici, busybox ile tek bir Init Container'ı nasıl kullanacağınız konusunda size rehberlik edecektir. Busybox, bunu gerçekleştirmek için kullanacağınız wget aracına sahip küçük bir konteynerdir.

İlk olarak, initContainer'ınızı şunun altına ekleyin: spec.template.spec ve busybox imajını belirtin:

Ardından, kodu code birimine indirmek için Init Container'ınızın bu birime erişmesi gerekecektir. code birimini şu yola bağlayın: /code (şunun altındaki yol): spec.template.spec.initContainers:

Her Init Container'ın bir komut çalıştırması gerekir. Bu Init Container, code kodunu Github üzerinden /code dizinine indirmek için wget kullanacaktır. İndirilen bu dosyaya bir isim vermek için bir -O seçeneği geçebilirsiniz ve bu dosyayı index.php.

Not: Init Container kullanarak sunucunuza çektiğiniz koda güvendiğinizden emin olun. Kaynak kodu inceleyebilir ve ne yaptığından emin olabilirsiniz.

Ayrıca, install konteynerinin altına şu satırları ekleyin: spec.template.spec.initContainers:

Tüm bu adımları tamamladıktan sonra, php_deployment.yaml dosyanız şu şekilde görünmelidir:

Artık dosyayı kaydedip çıkabilirsiniz. Ardından, şu komutu kullanarak PHP-FPM Deployment'ınızı oluşturun: kubectl apply komutu:

Deployment'ın başarıyla oluşturulması size aşağıdaki çıktıyı vermelidir:

Bu Deployment, belirtilen imajları indirerek başlar, ardından PersistentVolume kaynağını PersistentVolumeClaim üzerinden talep eder ve ardından initContainers bileşenlerinizi çalıştırır. Bu adım tamamlandıktan sonra, konteynerler çalışacak ve birimleri belirtilen bağlama noktasına bağlayacaktır. Tüm bu adımları tamamladıktan sonra pod'unuz çalışır durumda olacaktır.

Deployment'ınızı görüntülemek için aşağıdaki komutu çalıştırabilirsiniz:

Yukarıdaki komutu çalıştırdıktan sonra aşağıdaki çıktıyı almalısınız:

Bu çıktının yardımıyla Deployment'ın mevcut durumunu anlayabilirsiniz. Deployment, istenen durumu koruyan bir denetleyicidir. DESIRED alanı, php adlı pod'un 1 replikasına sahip olduğunu belirtir. CURRENT alanı, şu anda DESIRED durumunun kaç replikasının çalıştığını gösterir. Sağlıklı bir pod için bu değerin DESIRED durumuyla eşleşmesi gerekir. Kalan alanlar hakkında daha fazla bilgiyi Kubernetes Deployments Dokümantasyonu.

Bundan sonra, çalışan pod'unuzun durumunu kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz:

Bu komutun çıktısı, Deployment'ınızı oluşturmanızın üzerinden geçen süreye bağlı olarak değişebilir. Deployment oluşturulduktan kısa bir süre sonra çalıştırılırsa çıktı şuna benzer olacaktır:

Açıklama:

Bu sütunlar aşağıdaki bilgileri temsil eder:

  • Ready: Bu pod'u çalıştıran mevcut/istenen replika sayısı.
  • Durum: Pod'unuzun durumu. Init:0/1, Init Konteynerlerinin çalıştığını ve 1 Init Konteynerinden 0'ının çalışmayı tamamladığını belirtir.
  • Yeniden Başlatmalar: Bu, pod'u başlatmak için bu işlemin kaç kez yeniden başlatıldığını gösterir.

Başlangıç betiklerinizin karmaşıklığına bağlı olarak pod'unuzun durumunun podInitializing olarak değişmesi birkaç dakika sürebilir:

Bu, Init Konteynerlerinin başarıyla çalıştığını ve şimdi konteynerlerin başlatıldığını gösterir:

Şimdi görebileceğiniz gibi, pod'unuz çalışır durumdadır. Ancak pod'unuzun başlamaması durumunda, hata ayıklama amacıyla aşağıdaki komutları çalıştırabilirsiniz:

1. Pod'un ayrıntılı bilgilerini görüntülemek için:

2.  Pod'un günlüklerini (loglarını) görüntülemek için:

Not: “kubectl logs” komutu için birden fazla seçenek mevcuttur, bu konuda daha fazlasını keşfetmek için “kubectl logs –help” komutunu çalıştırabilirsiniz.

3. Pod içindeki belirli bir konteynerin günlüklerini görüntülemek için:

Tebrikler! Uygulama kodunu başarıyla bağladınız ve PHP-FPM servisi bağlantıları karşılamaya hazır. Benzer şekilde, Nginx Dağıtımınızı (Deployment) oluşturabilirsiniz.

Adım 5: Nginx Dağıtımınızı Oluşturun

Bu adım, bir ConfigMap kullanarak Nginx'i nasıl yapılandıracağınız konusunda size rehberlik edecektir. Bir ConfigMap, diğer Kubernetes nesne tanımlarında kullanılacak tüm gerekli yapılandırmalarınızı anahtar-değer (key-value) biçiminde tutar. Bu yaklaşımla, gerektiğinde Nginx görüntüsünü yeniden kullanma veya farklı bir sürümle değiştirme esnekliğine sahip olursunuz. ConfigMap nesnesini güncelleyebilirsiniz ve bu değişiklikler, bu ConfigMap.

nesnesini bağlayan tüm pod'lara otomatik olarak yansıtılacaktır. Başlamak için, editörünüzde bir nginx_configmap.yaml dosyası açın:

Şimdi, bu ConfigMap'i nginx-config olarak adlandırın ve tier: backend mikro servisine ekleyin:

Ek olarak, verileri ConfigMap'e ekleyebilirsiniz. config adında bir anahtar ekleyin ve tüm Nginx yapılandırma dosyası içeriklerini değer olarak ekleyin.

Kubernetes'in istekleri bir servis için ilgili ana bilgisayarlara yönlendirmesi mümkün olduğundan, IP adresi yerine fastcgi_pass parametresinin altına PHP-FPM servisinizin adını girebilirsiniz. nginx_configMap.yaml dosyanıza aşağıdaki kod satırlarını ekleyin:

Tamamlandığında, nginx_configMap.yaml dosyanız şu şekilde görünecektir:

Artık düzenleyiciyi kaydedip kapatabilirsiniz. Şimdi kubectl apply komutunu çalıştırarak şu nesneyi oluşturun: ConfigMap:

Bundan sonra, ekranınızda aşağıdaki çıktıyı görmelisiniz:

Nginx Configmap'inizi başarıyla oluşturdunuz. Şimdi Nginx Deployment'ınızı oluşturabilirsiniz.

Nginx Deployment Oluşturma

Başlamak için, düzenleyicide nginx_deployment.yaml adında yeni bir dosya oluşturabilirsiniz:

Bu Deployment'ı nginx olarak adlandırın ve ona tier: backend etiketini ekleyin:

Bundan sonra, Deployment spesifikasyonuna replica alanını ekleyerek replika sayısını belirtin ve ona app: nginx ve tier: backend etiketlerini ekleyin:

Benzer şekilde, pod şablonunu ekleyin. Deployment’ın selector.matchLabels alanına eklediğiniz etiketlerin aynısını eklediğinizden emin olun. Aşağıdakileri ekleyebilirsiniz:

Daha önce oluşturulan code PVC'sine Nginx erişimi vermek için, aşağıdaki parametreleri şu bölümün altına ekleyin: spec.template.spec.volumes:

Not: Bir pod, ConfigMap'i bir birim (volume) olarak bağlayabilir. Dosya adını ve anahtarı belirterek, değeri içerik olacak şekilde bir dosya oluşturacağız. Bu ConfigMap'i kullanmak için yolu, anahtarın içeriğini barındıran dosyanın adına ayarlayın. config anahtarından bir site.conf dosyası oluşturabilirsiniz. spec.template.spec.volumes altına aşağıdakileri ekleyin:

Uyarı: Bir dosya belirtilmezse, anahtarın içeriği birimin mountPath değerinin yerini alacaktır. Başka bir deyişle, bir yol açıkça belirtilmezse hedef klasördeki tüm içeriği kaybedersiniz.

Şimdi, podunuzda kullanmak istediğiniz adı, imajı ve portu belirtin. Burada nginx:1.7.9 imajını ve 80 portunu kullanacağız. Bunları şunun altına ekleyin: spec.template.spec bölümü:

Ayrıca, kod birimini /code dizinine bağlayın, çünkü hem Nginx hem de PHP-FPM'in dosyaya aynı yoldan erişmesi gerekecektir:

The nginx-1.7.9 imajı, /etc/nginx/conf.d klasörü altındaki tüm yapılandırma dosyalarını otomatik olarak yükler. Şimdi, yapılandırma birimini bu dizine bağlarsak, /etc/nginx/conf.d/site.conf dosyasını oluşturacaktır. volumeMount bölümünün altına aşağıdakileri ekleyin:

Yukarıdaki tüm adımları tamamladıktan sonra, nginx_deployment.yaml dosyanız şu şekilde görünmelidir:

Artık dosyayı kaydedip çıkabilir ve aşağıdaki komutu çalıştırarak Nginx Deployment'ı oluşturabilirsiniz:

Komut başarıyla çalıştırıldığında aşağıdaki çıktıyı görmelisiniz:

Aşağıdaki komutları çalıştırarak tüm Deployment'larınızı listeleyebilirsiniz:

Şimdi hem Nginx hem de PHP-FPM Deployment'larını görmelisiniz:

kubernetes deployment status

Ayrıca, yukarıda listelenen her iki Deployment tarafından yönetilen pod'ları listelemek için aşağıdaki komutu yürütebilirsiniz:

Her iki pod'unuzun da aşağıdaki gibi çalışır durumda olduğunu göreceksiniz:

kubernetes pod status

Bu noktada tüm Kubernetes nesneleriniz aktif olduğundan, artık tarayıcınızdan Nginx servisine erişebilirsiniz.

Servisleri listelemek için aşağıdaki komutu çalıştırın:

Nginx servisinizin Harici IP'sini (External IP) not edin:external ip of nginx Deploy a PHP Application on Kubernetes Cluster with Ubuntu 18.04

Şimdi, Nginx servisinin bu Harici IP'sini kullanarak, tarayıcınıza http://your_public_ip yazarak sunucunuzu ziyaret edebilirsiniz. Kubernetes servislerinizin çalışır durumda olduğunu onaylayan php_info() çıktısını görebilmelisiniz.

Sonuç

Bu öğreticide, PHP-FPM ve Nginx servislerinizi bağımsız olarak yönetmek için bu iki servisi konteynerleştirdiniz. Bunu yaparak, yalnızca projenizin ölçeklenebilirliğini artırmakla kalmayacak, aynı zamanda kaynaklarınızı da verimli bir şekilde kullanacaksınız. Ayrıca, uygulama kodunuzu bir birimde depolamak ve gelecekte servislerinizi kolayca güncelleyebilmek için yerel depolama ve bir Persistent Volume (Kalıcı Birim) oluşturmayı da öğrendiniz. Böylece kodunuzun kullanılabilirliğini ve bakımı kolaylığını artırdınız.

Ayrıca, Docker ve Kubernetes konularına odaklanan ve blogumuzda:

Keyifli Çalışmalar!

author

Hark Labs

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.