Giriş
Kubernetes, açık kaynaklı bir konteyner düzenleme sistemidir. Kapalı kalma süresi konusunda endişelenmeden konteynerler oluşturmanıza, güncellemenize ve ölçeklendirmenize olanak tanır.
Bir PHP uygulamasını çalıştırmak için Nginx, PHP-FPM için bir vekil görevi görür . Bu kurulumu tek bir kapsayıcıda kapsayıcı hale getirmek zahmetli bir süreç olabilir, ancak Kubernetes her iki hizmeti de ayrı kapsayıcılarda yönetmeye yardımcı olacaktır. Kubernetes kullanmak, konteynerlerinizi yeniden kullanılabilir ve değiştirilebilir durumda tutmanıza olanak tanır ve her yeni Nginx veya PHP sürümü olduğunda konteyner görüntünüzü yeniden oluşturmanız gerekmez.
Bu eğitimde, ayrı konteynerlerde çalışan Nginx ve PHP-FPM ile bir Kubernetes kümesinde bir PHP 7 uygulaması konuşlandıracaksınız. Ayrıca, DigitalOcean’ın Blok Depolama sistemini kullanarak yapılandırma dosyalarınızı ve uygulama kodunuzu konteyner görüntüsünün dışında nasıl tutacağınızı da öğreneceksiniz . Bu yaklaşım, görüntüyü yeniden oluşturmak yerine bir yapılandırma birimini ileterek bir web / proxy sunucusuna ihtiyaç duyan herhangi bir uygulama için Nginx görüntüsünü yeniden kullanmanıza olanak tanır.
Önkoşullar
- Kubernetes nesnelerine ilişkin temel bir anlayış. Bizim göz atın Giriş Kubernetes için daha fazla bilgi için makaleyi.
- Ubuntu 18.04 üzerinde çalışan bir Kubernetes kümesi. Bunu, Ubuntu 18.04 üzerinde Kubeadm Kullanarak Kubernetes 1.14 Kümesi Oluşturma öğreticisini izleyerek ayarlayabilirsiniz .
- Depolama birimimizi oluşturmak için bir DigitalOcean hesabı ve okuma ve yazma izinlerine sahip bir API erişim belirteci. API erişim jetonunuz yoksa buradan oluşturabilirsiniz .
- Uygulama kodunuz, Github gibi herkese açık bir URL’de barındırılıyor .
Adım 1 – PHP-FPM ve Nginx Hizmetlerinin Oluşturulması
Bu adımda, PHP-FPM ve Nginx hizmetlerini oluşturacaksınız. Bir hizmet, küme içinden bir dizi bölmeye erişime izin verir. Bir küme içindeki hizmetler, IP adreslerine ihtiyaç duymadan doğrudan adları aracılığıyla iletişim kurabilir. PHP-FPM hizmeti, PHP-FPM bölmelerine erişime izin verirken, Nginx hizmeti Nginx bölmelerine erişime izin verecektir.
Nginx bölmeleri PHP-FPM bölmelerine proxy uygulayacağından, hizmete bunları nasıl bulacağını söylemeniz gerekir. IP adreslerini kullanmak yerine, istekleri uygun hizmete yönlendirmek için insan tarafından okunabilir adları kullanmak için Kubernetes’in otomatik hizmet keşfinden yararlanacaksınız.
Hizmeti oluşturmak için bir nesne tanımlama dosyası oluşturacaksınız. Her Kubernetes nesne tanımı, en azından aşağıdaki öğeleri içeren bir YAML dosyasıdır:
apiVersion
: Tanımın ait olduğu Kubernetes API sürümü.kind
: Bu dosyanın temsil ettiği Kubernetes nesnesi. Örneğin, apod
veyaservice
.metadata
: Buname
, nesneyelabels
uygulamak isteyebileceğiniz her şeyle birlikte nesneyi içerir .spec
: Bu, kapsayıcı görüntüsü veya kapsayıcıya erişilebilecek bağlantı noktaları gibi, oluşturduğunuz nesnenin türüne bağlı olarak belirli bir yapılandırma içerir.
Önce, Kubernetes nesne tanımlarınızı tutmak için bir dizin oluşturacaksınız.
Ana düğümünüze SSH uygulayın ve definitions
Kubernetes nesne tanımlarınızı tutacak dizini oluşturun .
mkdir definitions
Yeni oluşturulan definitions
dizine gidin :
cd definitions
Bir php_service.yaml
dosya oluşturarak PHP-FPM hizmetinizi oluşturun :
nano php_service.yaml
Set kind
olarak Service
bu nesne bir hizmet olduğunu belirtmek için:php_service.yaml
apiVersion: v1
kind: Service
php
PHP-FPM’ye erişim sağlayacağı için hizmeti adlandırın :php_service.yaml
...
metadata:
name: php
Mantıksal olarak farklı nesneleri etiketlerle gruplayacaksınız. Bu eğitimde, nesneleri ön uç veya arka uç gibi “katmanlara” gruplamak için etiketleri kullanacaksınız. PHP bölmeleri bu hizmetin arkasında çalışacak, bu nedenle onu olarak etiketleyeceksiniz tier: backend
.php_service.yaml
...
labels:
tier: backend
Bir hizmet, selector
etiketleri kullanarak hangi bölmelere erişileceğini belirler . Kapsülün servisten önce mi sonra mı oluşturulduğundan bağımsız olarak, bu etiketlerle eşleşen bir bölmeye hizmet verilecektir. Eğiticide daha sonra bölmeleriniz için etiketler ekleyeceksiniz.
tier: backend
Kapsülü arka uç katmanına atamak için etiketi kullanın . app: php
Bu bölmenin PHP çalıştırdığını belirtmek için etiketi de ekleyeceksiniz . Bu iki etiketi metadata
bölümden sonra ekleyin .php_service.yaml
...
spec:
selector:
app: php
tier: backend
Ardından, bu hizmete erişmek için kullanılan bağlantı noktasını belirtin. 9000
Bu eğitimde port kullanacaksınız . php_service.yaml
Şunun altındaki dosyaya ekleyin spec
:php_service.yaml
...
ports:
- protocol: TCP
port: 9000
Tamamladığınız php_service.yaml
dosya şöyle görünecek:php_service.yaml
apiVersion: v1
kind: Service
metadata:
name: php
labels:
tier: backend
spec:
selector:
app: php
tier: backend
ports:
- protocol: TCP
port: 9000
Hit CTRL + O
sonra dosyayı kaydetmek için, ve CTRL + X
çıkışa nano
.
Artık hizmetiniz için nesne tanımını oluşturduğunuza göre, hizmeti çalıştırmak kubectl apply
için -f
bağımsız değişkenle birlikte komutu kullanacak ve php_service.yaml
dosyanızı belirteceksiniz .
Hizmetinizi oluşturun:
kubectl apply -f php_service.yaml
Bu çıktı, hizmet oluşturmayı doğrular:
Outputservice/php created
Hizmetinizin çalıştığını doğrulayın:
kubectl get svc
PHP-FPM hizmetinizin çalıştığını göreceksiniz:
OutputNAME 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
There are various service types that Kubernetes supports. Your php
service uses the default service type, ClusterIP
. This service type assigns an internal IP and makes the service reachable only from within the cluster.
Now that the PHP-FPM service is ready, you will create the Nginx service. Create and open a new file called nginx_service.yaml
with the editor:
nano nginx_service.yaml
This service will target Nginx pods, so you will name it nginx
. You will also add a tier: backend
label as it belongs in the back-end tier:nginx_service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
tier: backend
Similar to the php
service, target the pods with the selector labels app: nginx
and tier: backend
. Make this service accessible on port 80
, the default HTTP port.nginx_service.yaml
...
spec:
selector:
app: nginx
tier: backend
ports:
- protocol: TCP
port: 80
Nginx hizmeti, Droplet’inizin genel IP adresinden internete herkesin erişimine açık olacaktır. your_public_ip
senin dan bulunabilir DigitalOcean Kontrol Paneli . Altına şunu spec.externalIPs
ekleyin:nginx_service.yaml
...
spec:
externalIPs:
- your_public_ip
Kişisel nginx_service.yaml
dosya şu şekilde olacaktır:nginx_service.yaml
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
Dosyayı kaydedin ve kapatın. Nginx hizmetini oluşturun:
kubectl apply -f nginx_service.yaml
Servis çalışırken aşağıdaki çıktıyı göreceksiniz:
Outputservice/nginx created
Çalışan tüm hizmetleri şunları çalıştırarak görüntüleyebilirsiniz:
kubectl get svc
Çıktıda listelenen hem PHP-FPM hem de Nginx hizmetlerini göreceksiniz:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 50s
php ClusterIP 10.100.59.238 <none> 9000/TCP 8m
Lütfen bir servisi silmek istiyorsanız çalıştırabileceğinizi unutmayın:
kubectl delete svc/service_name
Artık PHP-FPM ve Nginx hizmetlerinizi oluşturduğunuza göre, uygulama kodunuzu ve yapılandırma dosyalarınızı nerede saklayacağınızı belirtmeniz gerekecek.
Adım 2 – DigitalOcean Depolama Eklentisinin Kurulması
Kubernetes, ortamınız için depolama alanı oluşturabilen farklı depolama eklentileri sağlar. Bu adımda, DigitalOcean üzerinde blok depolama oluşturmak için DigitalOcean depolama eklentisini kuracaksınız. Kurulum tamamlandığında, do-block-storage
blok depolamanızı oluşturmak için kullanacağınız adlı bir depolama sınıfı ekleyecektir .
Önce DigitalOcean API jetonunuzu depolamak için bir Kubernetes Gizli nesnesi yapılandıracaksınız. Gizli nesneler, SSH anahtarları ve şifreler gibi hassas bilgileri aynı ad alanı içindeki diğer Kubernetes nesneleriyle paylaşmak için kullanılır. Ad alanları, Kubernetes nesnelerinizi mantıksal olarak ayırmanın bir yolunu sağlar.
Editörle adlandırılmış bir dosya açın secret.yaml
:
nano secret.yaml
Gizli nesnenizi adlandıracak digitalocean
ve kube-system
ad alanına ekleyeceksiniz . kube-system
Ad Kubernetes’ iç hizmetler için varsayılan ad alanı ve aynı zamanda çeşitli bileşenlerini başlatmak için eklenti DigitalOcean depolama tarafından kullanılır.secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: digitalocean
namespace: kube-system
Bir spec
anahtar yerine , bir Gizli anahtar gerekli bilgileri tutmak için a data
veya stringData
anahtarını kullanır . data
Parametresi alınan otomatik olarak kodu çözülmüş bir kodlanmış veri base64 tutar. stringData
Sırları alırken parametre değil çıkış verilerini otomatik olarak oluşturma veya güncelleme sırasında kodlanır olmayan kodlanmış verileri tutan ve yapar. stringData
Kolaylık sağlamak için bu öğreticide kullanacaksınız .
Ekle access-token
olarak stringData
:secret.yaml
...
stringData:
access-token: your-api-token
Dosyayı kaydedin ve çıkın.
Kişisel secret.yaml
dosya şu şekilde olacaktır:secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: digitalocean
namespace: kube-system
stringData:
access-token: your-api-token
Sırrı oluşturun:
kubectl apply -f secret.yaml
Bu çıktıyı Gizli oluşturmada göreceksiniz:
Outputsecret/digitalocean created
Sırrı aşağıdaki komutla görüntüleyebilirsiniz:
kubectl -n kube-system get secret digitalocean
Çıktı şuna benzer görünecektir:
OutputNAME TYPE DATA AGE
digitalocean Opaque 1 41s
Opaque
Bu gizli için standart olan salt okunur tipi araçlar stringData
Sırlar. Gizli tasarım spesifikasyonunda bunun hakkında daha fazla bilgi edinebilirsiniz . DATA
Alan, bu sır saklanan öğelerin sayısını gösterir. Bu durumda, 1
sakladığınız tek bir anahtarınız olduğu için gösterilir .
Sırrınız yerinde olduğuna göre, DigitalOcean blok depolama eklentisini kurun :
kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml
Aşağıdakine benzer çıktı göreceksiniz:
Outputcsidriver.storage.k8s.io/dobs.csi.digitalocean.com created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
storageclass.storage.k8s.io/do-block-storage created
statefulset.apps/csi-do-controller created
serviceaccount/csi-do-controller-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-provisioner-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-attacher-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-attacher-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-snapshotter-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-snapshotter-binding created
daemonset.apps/csi-do-node created
serviceaccount/csi-do-node-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-node-driver-registrar-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-node-driver-registrar-binding created
error: unable to recognize "https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml": no matches for kind "VolumeSnapshotClass" in version "snapshot.storage.k8s.io/v1alpha1"
Bu eğitimde hataları göz ardı etmek güvenlidir.
Artık DigitalOcean depolama eklentisini kurduğunuza göre, uygulama kodunuzu ve yapılandırma dosyalarınızı saklamak için blok depolama alanı oluşturabilirsiniz.
Adım 3 – Kalıcı Birimi Oluşturma
Sırrınız yerinde ve blok depolama eklentisi kuruluyken, artık Kalıcı Biriminizi oluşturmaya hazırsınız . Kalıcı Birim veya PV, bir bölmenin yaşam döngüsünden bağımsız olarak yaşayan, belirli bir boyuttaki blok depolamadır. Kalıcı Birim kullanmak, uygulama kodunuzu kaybetme endişesi olmadan bölmelerinizi yönetmenize veya güncellemenize olanak tanır. Kalıcı PersistentVolumeClaim
Birime, PV’yi gerekli yola monte eden a veya PVC kullanılarak erişilir .
code_volume.yaml
Editörünüzle adlandırılmış bir dosya açın :
nano code_volume.yaml
code
Dosyanıza aşağıdaki parametreleri ve değerleri ekleyerek PVC’yi adlandırın :code_volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: code
spec
Bir PVC için aşağıdaki öğeleri içerir:
accessModes
kullanım durumuna göre değişir. Bunlar:ReadWriteOnce
– birimi tek bir düğüm tarafından okuma-yazma olarak bağlarReadOnlyMany
– birimi birçok düğüm tarafından salt okunur olarak bağlarReadWriteMany
– Birimi birçok düğüm tarafından okuma-yazma olarak bağlar
resources
– ihtiyacınız olan depolama alanı
Eğer set böylece DigitalOcean blok depolama yalnızca tek bir düğüm monte edilir accessModes
etmek ReadWriteOnce
. Bu eğitim, az miktarda uygulama kodu eklemeniz için size rehberlik edecek, bu nedenle bu kullanım durumunda 1 GB yeterli olacaktır. Birimde daha büyük miktarda kod veya veri depolamayı planlıyorsanız, storage
parametreyi gereksinimlerinize uyacak şekilde değiştirebilirsiniz . Birim oluşturduktan sonra depolama miktarını artırabilirsiniz ancak diskin küçültülmesi desteklenmez.code_volume.yaml
...
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Ardından, Kubernetes’in birimleri sağlamak için kullanacağı depolama sınıfını belirtin. do-block-storage
DigitalOcean blok depolama eklentisi tarafından oluşturulan sınıfı kullanacaksınız .code_volume.yaml
...
storageClassName: do-block-storage
Kişisel code_volume.yaml
dosya şu şekilde olacaktır:code_volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: code
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: do-block-storage
Dosyayı kaydedin ve çıkın.
code
PVC’yi kullanarak oluşturun kubectl
:
kubectl apply -f code_volume.yaml
Aşağıdaki çıktı, nesnenin başarıyla oluşturulduğunu ve 1GB PVC’nizi bir birim olarak monte etmeye hazır olduğunuzu söyler.
Outputpersistentvolumeclaim/code created
Mevcut Kalıcı Birimleri (PV) görüntülemek için:
kubectl get pv
PV’nizin listelendiğini göreceksiniz:
OutputNAME 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
Yukarıdaki alanlar, Reclaim Policy
ve dışındaki yapılandırma dosyanıza genel bir bakıştır Status
. Reclaim Policy
PVC silinir eriştikten sonra PV ne yapıldığını tanımlar. Delete
PV’yi Kubernetes’ten ve DigitalOcean altyapısından kaldırır. Sen hakkında daha fazla bilgi edinebilirsiniz Reclaim Policy
ve Status
gelen Kubernetes PV belgelerinde .
DigitalOcean blok depolama eklentisini kullanarak bir Persistent Volume başarıyla oluşturdunuz. Kalıcı Biriminiz artık hazır olduğuna göre, bölmelerinizi bir Dağıtım kullanarak oluşturacaksınız.
Adım 4 – Bir PHP-FPM Dağıtımı Oluşturma
Bu adımda, PHP-FPM bölmenizi oluşturmak için bir Dağıtımı nasıl kullanacağınızı öğreneceksiniz. Dağıtımlar, ReplicaSets kullanarak bölmeleri oluşturmak, güncellemek ve yönetmek için tek tip bir yol sağlar . Güncelleme beklendiği gibi çalışmazsa, Dağıtım bölmelerini otomatik olarak önceki bir görüntüye geri alır.
Dağıtım spec.selector
anahtarı, yöneteceği bölmelerin etiketlerini listeler. Ayrıca template
gerekli bölmeleri oluşturmak için anahtarı kullanacaktır .
Bu adım aynı zamanda Başlatma Konteynerlerinin kullanımını da tanıtacaktır. Başlatma Kapsayıcıları , bölmenin template
anahtarı altında belirtilen normal kapsayıcılardan önce bir veya daha fazla komut çalıştırır . Bu öğreticide, Başlangıç Konteynırınız kullanarak GitHub Gist’ten bir örnek index.php
dosya getirecektir . Örnek dosyanın içeriği şu şekildedir:wget
index.php
<?php
echo phpinfo();
Dağıtımınızı oluşturmak için php_deployment.yaml
, düzenleyicinizle çağrılan yeni bir dosya açın :
nano php_deployment.yaml
Bu Dağıtım, PHP-FPM bölmelerinizi yönetecek, böylece Dağıtım nesnesini adlandıracaksınız php
. Bölmeler arka uç katmanına aittir, bu nedenle şu tier: backend
etiketi kullanarak Dağıtımı bu grupta gruplayacaksınız :php_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php
labels:
tier: backend
For the Deployment spec
, you will specify how many copies of this pod to create by using the replicas
parameter. The number of replicas
will vary depending on your needs and available resources. You will create one replica in this tutorial:php_deployment.yaml
...
spec:
replicas: 1
This Deployment will manage pods that match the app: php
and tier: backend
labels. Under selector
key add:php_deployment.yaml
...
selector:
matchLabels:
app: php
tier: backend
Next, the Deployment spec
requires the template
for your pod’s object definition. This template will define specifications to create the pod from. First, you will add the labels that were specified for the php
service selectors
and the Deployment’s matchLabels
. Add app: php
and tier: backend
under template.metadata.labels
:php_deployment.yaml
...
template:
metadata:
labels:
app: php
tier: backend
A pod can have multiple containers and volumes, but each will need a name. You can selectively mount volumes to a container by specifying a mount path for each volume.
First, specify the volumes that your containers will access. You created a PVC named code
to hold your application code, so name this volume code
as well. Under spec.template.spec.volumes
, add the following:php_deployment.yaml
...
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
Next, specify the container you want to run in this pod. You can find various images on the Docker store, but in this tutorial you will use the php:7-fpm
image.
Under spec.template.spec.containers
, add the following:php_deployment.yaml
...
containers:
- name: php
image: php:7-fpm
Ardından, konteynerin erişim gerektirdiği birimleri bağlayacaksınız. Bu kapsayıcı PHP kodunuzu çalıştıracak, bu nedenle code
birime erişmesi gerekecek . Bağlama noktası olarak mountPath
belirtmek için de kullanacaksınız /code
.
Altına şunu spec.template.spec.containers.volumeMounts
ekleyin:php_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
Artık biriminizi taktığınıza göre, uygulama kodunuzu birimden almanız gerekir. Bunu gerçekleştirmek için daha önce FTP / SFTP kullanmış veya kodu bir SSH bağlantısı üzerinden klonlamış olabilirsiniz, ancak bu adım size kodu bir Başlatma Kabı kullanarak nasıl kopyalayacağınızı gösterecektir.
Kurulum işleminizin karmaşıklığına bağlı olarak, initContainer
uygulamanızı oluşturan bir komut dosyasını çalıştırmak için tek bir komut kullanabilir veya initContainer
komut başına bir tane kullanabilirsiniz . Birimlerin initContainer
.
Bu öğreticide, busybox
kodu indirmek için tek bir Başlatma Kabı kullanacaksınız . bunu gerçekleştirmek için kullanacağınız yardımcı programı busybox
içeren küçük bir resimdir wget
.
Altına spec.template.spec
, sizin ekleyin initContainer
ve busybox
resmi belirtin :php_deployment.yaml
...
initContainers:
- name: install
image: busybox
Başlangıç Konteynırınızın code
kodu o konuma indirebilmesi için birime erişmesi gerekecektir . Altında spec.template.spec.initContainers
, hacim monte code
at /code
yolu:php_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
Her Başlatma Konteynerinin bir command
. Kişisel Init Konteyner kullanacak wget
indirmek için kod adlı Github içine /code
çalışan dizinine. -O
Seçeneği indirilen dosyanın bir isim verir ve bu dosyayı adlandırır index.php
.
Not: Çektiğiniz koda güvendiğinizden emin olun. Sunucunuza çekmeden önce, kodun ne yaptığından emin olmak için kaynak kodunu inceleyin.
İçindeki install
konteynerin altına spec.template.spec.initContainers
şu satırları ekleyin:php_deployment.yaml
...
command:
- wget
- "-O"
- "/code/index.php"
- https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php
Tamamladığınız php_deployment.yaml
dosya şöyle görünecek:php_deployment.yaml
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
Dosyayı kaydedin ve düzenleyiciden çıkın.
PHP-FPM Dağıtımını şununla oluşturun kubectl
:
kubectl apply -f php_deployment.yaml
Dağıtım oluşturulduktan sonra aşağıdaki çıktıyı göreceksiniz:
Outputdeployment.apps/php created
Özetlemek gerekirse, bu Dağıtım, belirtilen görüntüleri indirerek başlayacaktır. Daha sonra sizden talep PersistentVolume
edecek PersistentVolumeClaim
ve initContainers
. Tamamlandığında, kapsayıcılar çalışacak ve volumes
belirtilen bağlama noktasına monte edilecektir. Tüm bu adımlar tamamlandıktan sonra, bölmeniz hazır ve çalışır durumda olacaktır.
Dağıtımınızı şunları çalıştırarak görüntüleyebilirsiniz:
kubectl get deployments
Çıktıyı göreceksiniz:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
php 1 1 1 0 19s
Bu çıktı, Dağıtımın mevcut durumunu anlamanıza yardımcı olabilir. A Deployment
, istenen durumu koruyan denetleyicilerden biridir . template
Eğer belirtir oluşturulan DESIRED
devlet 1 olacak replicas
adlandırılmış Kapsülün php
. CURRENT
Alan birçok kopyaları çalıştıran nasıl, bu nedenle bu eşleşmesi gerekir gösteren DESIRED
devlet. Kubernetes Dağıtımları belgelerinde kalan alanlar hakkında bilgi edinebilirsiniz .
Bu Dağıtımın başlattığı bölmeleri aşağıdaki komutla görüntüleyebilirsiniz:
kubectl get pods
Bu komutun çıktısı, Dağıtımı oluşturduktan sonra ne kadar zaman geçtiğine bağlı olarak değişir. Oluşturduktan kısa bir süre sonra çalıştırırsanız, çıktı muhtemelen şöyle görünecektir:
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-bf8zd 0/1 Init:0/1 0 9s
Sütunlar aşağıdaki bilgileri temsil eder:
Ready
:replicas
Bu bölmeyi çalıştırma sayısı .Status
: Bölmenin durumu.Init
Başlatma Konteynerlerinin çalıştığını gösterir. Bu çıktıda, 1 Başlatma Konteynırından 0’ı çalışmayı bitirdi.Restarts
: Bölmeyi başlatmak için bu işlemin kaç kez yeniden başlatıldığı. Init Container’larınızdan herhangi biri başarısız olursa bu sayı artacaktır. Dağıtım, istenen duruma ulaşana kadar onu yeniden başlatacaktır.
Başlangıç komut dosyalarınızın karmaşıklığına bağlı olarak, durumun şu şekilde değişmesi birkaç dakika sürebilir podInitializing
:
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-lkwgn 0/1 podInitializing 0 39s
Bu, Başlangıç Konteynerlerinin bittiği ve konteynerlerin başlatıldığı anlamına gelir. Komutu tüm kapsayıcılar çalışırken çalıştırırsanız, bölme durumunun olarak değiştiğini göreceksiniz Running
.
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-lkwgn 1/1 Running 0 1m
Şimdi bölmenizin başarıyla çalıştığını görüyorsunuz. Bölmeniz başlamazsa, aşağıdaki komutlarla hata ayıklayabilirsiniz:
- Bir bölmenin ayrıntılı bilgilerini görüntüleyin:
kubectl describe pods pod-name
- Bir bölme tarafından oluşturulan günlükleri görüntüleyin:
kubectl logs pod-name
- Bir bölmedeki belirli bir kapsayıcı için günlükleri görüntüleyin:
kubectl logs pod-name container-name
Uygulama kodunuz bağlanmıştır ve PHP-FPM hizmeti artık bağlantıları işlemeye hazırdır. Artık Nginx Dağıtımınızı oluşturabilirsiniz.
Adım 5 – Nginx Dağıtımının Oluşturulması
Bu adımda, Nginx’i yapılandırmak için bir ConfigMap kullanacaksınız . ConfigMap, yapılandırmanızı diğer Kubernetes nesne tanımlarında başvurabileceğiniz bir anahtar-değer biçiminde tutar. Bu yaklaşım, gerekirse görüntüyü yeniden kullanma veya farklı bir Nginx sürümüyle değiştirme esnekliği sağlayacaktır. ConfigMap’in güncellenmesi, değişiklikleri otomatik olarak onu monte eden herhangi bir bölmeye kopyalar.
nginx_configMap.yaml
Düzenleyicinizle ConfigMap’iniz için bir dosya oluşturun :
nano nginx_configMap.yaml
ConfigMap’i adlandırın nginx-config
ve tier: backend
mikro hizmette gruplandırın :nginx_configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
labels:
tier: backend
Ardından, data
ConfigMap için ekleyeceksiniz. Anahtarı adlandırın config
ve Nginx yapılandırma dosyanızın içeriğini değer olarak ekleyin. Bu öğreticiden örnek Nginx yapılandırmasını kullanabilirsiniz .
Kubernetes, istekleri bir hizmet için uygun ana bilgisayara yönlendirebildiğinden, fastcgi_pass
parametreye IP adresi yerine PHP-FPM hizmetinizin adını girebilirsiniz . Aşağıdakileri nginx_configMap.yaml
dosyanıza ekleyin :nginx_configMap.yaml
...
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;
}
}
Kişisel nginx_configMap.yaml
dosya şu şekilde olacaktır:nginx_configMap.yaml
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;
}
}
Dosyayı kaydedin ve düzenleyiciden çıkın.
ConfigMap’i oluşturun:
kubectl apply -f nginx_configMap.yaml
Aşağıdaki çıktıyı göreceksiniz:
Outputconfigmap/nginx-config created
ConfigMap’inizi oluşturmayı tamamladınız ve şimdi Nginx Dağıtımınızı oluşturabilirsiniz.
nginx_deployment.yaml
Düzenleyicide yeni bir dosya açarak başlayın :
nano nginx_deployment.yaml
Dağıtımı adlandırın nginx
ve etiketi ekleyin tier: backend
:nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
tier: backend
replicas
Konuşlandırmada bir tane istediğinizi belirtin spec
. Bu Dağıtım etiketlerle bölmeleri yönetecek app: nginx
ve tier: backend
. Aşağıdaki parametreleri ve değerleri ekleyin:nginx_deployment.yaml
...
spec:
replicas: 1
selector:
matchLabels:
app: nginx
tier: backend
Ardından bölmeyi ekleyin template
. Dağıtım için eklediğiniz etiketlerin aynısını kullanmanız gerekir selector.matchLabels
. Aşağıdakileri ekleyin:nginx_deployment.yaml
...
template:
metadata:
labels:
app: nginx
tier: backend
code
Daha önce oluşturduğunuz PVC’ye Nginx erişimi verin . Altına şunu spec.template.spec.volumes
ekleyin:nginx_deployment.yaml
...
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
Bölmeler bir ConfigMap’i birim olarak bağlayabilir. Bir dosya adı ve anahtarının belirtilmesi, içerik olarak değeri olan bir dosya oluşturacaktır. ConfigMap’i kullanmak için, .pdf path
dosyasının içeriğini tutacak dosyanın adına ayarlayın key
. site.conf
Anahtardan bir dosya oluşturmak istiyorsunuz config
. Altına spec.template.spec.volumes
aşağıdakileri ekleyin:nginx_deployment.yaml
...
- name: config
configMap:
name: nginx-config
items:
- key: config
path: site.conf
Uyarı : Bir dosya belirtilmezse, birimin içeriği birimin key
yerini alacaktır mountPath
. Bu, bir yol açıkça belirtilmezse, hedef klasördeki tüm içeriği kaybedeceğiniz anlamına gelir.
Ardından, bölmenizi oluşturmak için görüntüyü belirleyeceksiniz. Bu eğitim, nginx:1.7.9
imajı kararlılık için kullanacaktır , ancak Docker mağazasında diğer Nginx imajlarını da bulabilirsiniz . Ayrıca, Nginx’i bağlantı noktasında kullanılabilir hale getirin 80
. spec.template.spec
Ekle altında :nginx_deployment.yaml
...
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Nginx ve PHP-FPM’nin dosyaya aynı yoldan erişmesi gerekir, bu nedenle code
birimi şu adresten bağlayın /code
:nginx_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
nginx:1.7.9
Resim otomatik altında herhangi bir yapılandırma dosyalarını yükleyecektir /etc/nginx/conf.d
dizine. Birimi config
bu dizine bağlamak dosyayı oluşturacaktır /etc/nginx/conf.d/site.conf
. Altında volumeMounts
aşağıdaki ekleyin:nginx_deployment.yaml
...
- name: config
mountPath: /etc/nginx/conf.d
Kişisel nginx_deployment.yaml
dosya şu şekilde olacaktır:nginx_deployment.yaml
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
Dosyayı kaydedin ve düzenleyiciden çıkın.
Nginx Dağıtımını Oluşturun:
kubectl apply -f nginx_deployment.yaml
Aşağıdaki çıktı, Dağıtımınızın artık oluşturulduğunu gösterir:
Outputdeployment.apps/nginx created
Dağıtımlarınızı şu komutla listeleyin:
kubectl get deployments
Nginx ve PHP-FPM Dağıtımlarını göreceksiniz:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 1 1 1 0 16s
php 1 1 1 1 7m
Her iki Dağıtım tarafından yönetilen bölmeleri listeleyin:
kubectl get pods
Çalışan bölmeleri göreceksiniz:
OutputNAME READY STATUS RESTARTS AGE
nginx-7bf5476b6f-zppml 1/1 Running 0 32s
php-86d59fd666-lkwgn 1/1 Running 0 7m
Artık tüm Kubernetes nesneleri aktif olduğuna göre, tarayıcınızda Nginx hizmetini ziyaret edebilirsiniz.
Çalışan hizmetleri listeleyin:
kubectl get services -o wide
Nginx hizmetiniz için Harici IP’yi alın:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m <none>
nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 27m app=nginx,tier=backend
php ClusterIP 10.100.59.238 <none> 9000/TCP 34m app=php,tier=backend
Tarayıcınızda yazarak sunucunuzu ziyaret edin . Sen çıktısını göreceksiniz ve Kubernetes servisleri çalışır durumda olduğunu doğruladı.http://your_public_ip
php_info()
Sonuç
Bu kılavuzda, PHP-FPM ve Nginx hizmetlerini bağımsız olarak yönetebilmeniz için kapsayıcı hale getirdiniz. Bu yaklaşım sadece siz büyüdükçe projenizin ölçeklenebilirliğini artırmakla kalmayacak, aynı zamanda kaynakları verimli bir şekilde kullanmanıza da olanak sağlayacaktır. Gelecekte hizmetlerinizi kolayca güncelleyebilmeniz için uygulama kodunuzu da bir birimde sakladınız.