Kubernetes üzerinde oluşturulan Podlar geçicidirler. Herhangi bir problem durumda içerisindeki verileri tutmazlar ve yeniden başlatıldıklarında önceki verileriniz olmadan oluşturulurlar.
Bunun üstesinden gelebilmek için Kubernetes, Volume’leri kullanır. Volume’ler çeşitli ortamlarda olmakla birlikte Pod’da bağlı ve kalıcı bir ortamda bulunmaktadır. Pod’da oluşabilecek bir problemden etkilenmez ve Pod yeniden başlatıldığında içerisindeki verilerin tekrar kullanılmasına izin verir. Çeşitli ortamlarda oluşturulabilen Volume Tipleri aşağıdaki gibidir.
- emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- nfs
- iscsi
- secret
- configMap
- persistentVolumeClaim
Volume Tipleri hakkında daha detaylı bilgiyi https://kubernetes.io/docs/concepts/storage/volumes/ adresinden alabilirsiniz.
Persistent Volumes (PV)
Kubernetes, kalıcı depolamayı yönetmesi ve kullanması için API ile erişim sağlayan PersistentVolume (PV) alt sistemini kullanır. Persistent Volume’ler NAS, SAN, Cloud Storage gibi ortamlarda oluşturabilir.
Persistent Volume destekleyen ortamlar;
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- CephFS
- NFS
- iSCSI
Persistent Volume tipleri hakkında daha fazla detaylı bilgiyi https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes adresinden alabilirsiniz.
PersistentVolumes, storage kaynağına göre dinamik olarak sağlanabilir. PersistentVolume oluşturmak için önceden tanımlanmış koşul ve parametrelerkullanılır. PersistentVolumeClaims’ı kullanarak, bir kullanıcı storage kaynağına bağlanan dinamik PV oluşturma talebi gönderir.
PersistentVolumeClaims (PVC)
PVC, bir kullanıcı tarafından storage için yapılan istektir. Kullanıcı belirlediği boyutta, erişim tipinde ve izinlerle Persistent Volume kaynağına talepte bulunur. Bu kaynağa 3 çeşit erişim modu vardır.
- ReadWriteOnce (Tek bir node tarafından yazma)
- ReadOnlyMany (Birçok node tarafından okuma)
- ReadWriteMany (Birçok node tarafından yazmak)
PVC talebinden sonra PV’e bağlanılır ve Container içerisindeki Pod’lar bu kaynağı kullanır.
PersistentVolumeClaims hakkında daha detaylı bilgiyi https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims adresinden alabilirsiniz.
Örnek Çalışma
Çalışmamızda bir container içerisinde iki tane pod oluşturacağız. Bu Podlardan bir tanesi oluşturduğumuz kalıcı alana içerik yazacak, diğeri ise yazılan alandan içerik okuyacak.
minikube start komutuyla daha önceden Virtualbox üzerinde kurduğumuz cluster’ımızı başlatıyoruz.
minikube ssh komutuyla clusterımızın kurulu olduğu sanal sunucumuza bağlanıyoruz.
mkdir pod-volume komutu ile PersistentVolume için bir klasör oluşturuyoruz. Bu şekilde node üzerinde kalıcı bir storage kaynağını simule edeceğiz. Aslında Persistent Volume tiplerinden hostPath tipini kullanacağız.
cd pod-volume ile klasör içerisine giriyoruz.
pwd ile klasör yolunu görüntülüyoruz. Bu yol, yaml dosyasını hazırlarken bize gerekli olacak.
sharepod.yaml isimli bir yaml dosyası oluşturuyoruz. Ben dosya yoluna kolay bir şekilde erişebileceğim bir klasör altında yaml dosyalarını oluşturuyorum. Sizde isterseniz benim izlediğim yolu izleyebilirsiniz. Yaml dosyalarında işlem yaparken yaml dosyasının bulunduğu dizinde olmanız gerekiyor. Yada Powershell’de komutlarını girerken yaml dosyasının dizinini tam yazmanız gerekir.
apiVersion: v1
kind: Pod
metadata:
name: sharepod
labels:
app: sharepod
spec:
volumes:
- name: host-volume
hostPath:
path: /home/docker/pod-volume
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: host-volume
- image: debian
name: debian
volumeMounts:
- mountPath: /host-vol
name: host-volume
command: ["/bin/sh", "-c", "echo Merhaba Kubernetes > /host-vol/index.html; sleep 3600"]
Yaml dosyamızı oluşturduk. Burada şuna dikkat çekmek istiyorum. Yaml dosyası bazen çok sinir bozucu olabiliyor. Hiyerarşik yapıya çok dikkat etmeniz gerekiyor. İçerikteki ufak bir hata pod’un veya container’ın çalışmamasına neden olabilir.
minikube kubectl create — -f sharepod.yaml komutuyla nginx ve debian imajlarını kullanarak 2 pod oluşturuyoruz. Ayrıca hostPath parametresi ile node içerisindeki oluşturduğumuz klasörü göstererek kullanacakları alanı belirtiyoruz.
minikube kubectl get pods ile kontrol edelim. Pod’umuz ve 2 container’ımız hazır. Dilerseniz minikube dashboard komutuyla browserdan da kontrol edebilirsiniz.
minikube kubectl expose pod sharepod — –type=NodePort –port=80 komutuyla pod’umuzu dış dünyaya erişime açacak bir servis oluşturuoruz.
minikube kubectl get services,endpoints ile oluşturduğumuz pod’un 30563 portundan dışarıya erişim sağladığını görebiliriz.
minikube service sharepod komutuyla browser’da sayfamızı görüntülüyoruz. Dikkat ederseniz klasik nginx sayfası yerine debian imajı içerisine eklediğimiz komuttaki Merhaba Kubernetes yazısı görüntülendi. Sayfayı görüntülemek için illa bir komut yazmanıza gerek yok. Endpoint olarak kubernetes IP’mizi yukarıda resimde görebiliyoruz (192.168.99.101). Pod’umuza ise dışarıdan erişim portumuz ise 30563. http://192.168.99.101:30563 adresinden de erişim sağlayabilirsiniz. Port numarası ve IP sizde farklı olabilir. IP adresi VirtualBox’daki sanal sunucunuzun adresidir. Port numarası ise servis oluşturulurken Kubernetes tarafından otomatik atanır. Sizlerde farklı bir port numarası oluşabilir.
minikube ssh ile tekrar minikube sunucumuza bağlanıyoruz. Oluşturduğumuz dosyanın altını kontrol ettiğimizde yaml dosyamız içerisindeki komutla birlikte index.html dosyasının oluştuğunu görüyoruz.
minikube kubectl delete pod sharepod komutu ile önceden oluşturduğumuz pod siliyoruz.
Yaml dosyamızdaki debian imajını kaldırıyoruz. Dosyamızı aşağıdaki gibi düzenliyoruz.
apiVersion: v1
kind: Pod
metadata:
name: sharepod
labels:
app: sharepod
spec:
volumes:
- name: host-volume
hostPath:
path: /home/docker/pod-volume
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: host-volume
Tekrar minikube kubectl create — -f sharepod.yaml komutu ile pod’umuzu oluşturuyoruz.
Pod’umuzu bir daha expose etmemize gerek yok. Çünkü sharepod için daha önceden oluşturduğumuz servis duruyor. Biz silerken sadece pod’u sildik. Servis cluster’ımız üzerinde hala duruyor.
Tekrar minikube service sharepod komutu ile browserdan sayfamızı görüntülüyelim.
Pod’umuzu ve içerisindeki container’ları silmiştik. Ancak oluşturduğumuz sayfayı sunucumuz üzerindeki bir dosyada sakladığımız için sadece pod’u yeniden ayağa kaldırmamız yeterli oldu.
Faydalı olması dileğiyle,
Serinin diğer dokümanları;
1-Container Kubernetes Minikube
2-Pod Nedir? Deployment ve Rollout İşlemleri
3-Kubernetesde Authentication ve Authorization Nedir?
4-Kubernetes WEB Arayüzünden Pod Oluşturmak
5-Kubernetes’de CLI üzerinde Deployment işlemleri