๐งPV/PVC
persistent volume and persistent volume claim
Last updated
persistent volume and persistent volume claim
Last updated
Ephemeral volume bรถlรผmรผnde, podun yaลam sรผresi boyunca saklamak ve yeni container oluลturulduฤunda kaybetmemek istediฤimiz dosyalarฤฑ tutmak iรงin "emptydir" ve "hostpath" tipinde volumelerin nasฤฑl oluลturulduฤunu gรถrmรผลtรผk.
Bu yazฤฑda, podun yaลam sรผresinden baฤฤฑmsฤฑz ลekilde oluลturabileceฤimiz volumeleri yani persistent volumeleri inceleyeceฤiz.
Sorun nedir?
ฤฐlk olarak 3 node'lu bir cluster'mฤฑz olduฤunu dรผลรผnelim. 3 node'lu cluster รผzerinde mySQL bir veritabanฤฑ รงalฤฑลtฤฑrmak istiyoruz. Bunun iรงin tek replika oluลturacak deployment tasarladฤฑk. Deployment iรงerisinde de mysql container'ฤฑn veritabanฤฑ dosyalarฤฑnฤฑ tutacaฤฤฑ "emptyDir" tipinde bir volume oluลturmak iรงin bir tanฤฑm girdik. Bu volume'u container'a mount edecek tanฤฑmlarฤฑda ekledikten sonra, Deployment objemizi oluลturduk. mySQL container'dan oluลan podumuz uygun bir worker node รผzerinde oluลturuldu ve รงalฤฑลmaya baลladฤฑ. Bu nokta da eฤer container'da bir sฤฑkฤฑntฤฑ olursa, kubelet yeni bir container oluลturacak ve biz volume tanฤฑmฤฑnฤฑ da eklediฤimiz iรงin sฤฑkฤฑntฤฑ รงฤฑkmadan รงalฤฑลmaya devam edecek.
Ancak ลรถyle bir senaryo dรผลรผnelim;
Bu podun รงalฤฑลtฤฑฤฤฑ worker node da sฤฑkฤฑntฤฑ รงฤฑktฤฑ ve worker node devre dฤฑลฤฑ kaldฤฑ. Podumuz deployment objesinin bir parรงasฤฑ olduฤu iรงin, Kubernetes bu durumu dรผzeltmek iรงin รงalฤฑลmaya baลlayacak ve uygun olan worker node'lardan bir tanesi รผzerinde yeni pod yaratฤฑlacak. Fakat bu durum ephemeral volume kฤฑsmฤฑnda da belirttiฤimiz uygulama iรงin sฤฑkฤฑntฤฑ yaratmฤฑyorken, bu sefer mySQL veritabanฤฑmฤฑz iรงin problem oluลturuyor. รรผnkรผ veritabanฤฑ รผzerinde geรงici, yeniden kolayca รผretebileceฤimiz dosyalarฤฑ deฤil, uzun sรผre barฤฑndฤฑrmak zorunda olduฤumuz verileri tutuyor.
Pod'a ne olursa olsun, bu verileri kaybetmememiz gerekiyor. Pod'u oluลturduk, mySQL container รงalฤฑลtฤฑ ve verileri "emptyDir" tipindeki volume'e yazmaya baลladฤฑ. Bu volume fiziksel olarak o container'ฤฑn รงalฤฑลtฤฑฤฤฑ worker node รผzerinde duruyor. Artฤฑk o worker node'a eriลim gittiฤi iรงin, Dolayฤฑsฤฑyla pod baลka bir worker node รผstรผnde yeniden oluลturulduฤunda, bu dosyalara eriลilemeyecek. Ve bu mySQL iรงin fazlasฤฑyla kรถtรผ bir senaryodur.
Bunun iรงin tek bir รงรถzรผm var, bizim bu volume'leri cluster dฤฑลฤฑnda duran, fakat tรผm worker node'lar tarafฤฑndan ulaลฤฑlabilen bir yerde oluลturabiliyor olmamฤฑz lazฤฑm.
Eฤer bunu baลarabilirsek, pod hangi node รผzerine taลฤฑnฤฑrsa taลฤฑnsฤฑn, aynฤฑ volume tekrar baฤlayarak veri devamlฤฑlฤฑฤฤฑ saฤlayabiliriz. Bu tarz cluster dฤฑลฤฑnda tutulan รงeลitli tรผrde depolama รผnitelerinin รผzerinde, oluลturabildiฤimiz ve pod yaลam sรผresinden baฤฤฑmsฤฑz ve daha uzun sรผre saklamamฤฑz gereken verileri saklamamฤฑza imkan veren volume'ler mevcut. Biz bunlara Persistent Volume diyoruz.
Persistent Volume nasฤฑl oluลturuyoruz?
Bunun iรงin รถncelikle, bir kaรง ayar yapmamฤฑz gerekiyor. ฤฐlk olarak volume oluลturmak istediฤimiz depolama birimi ile cluster'mฤฑzฤฑn konuลabiliyor olmasฤฑ gerekiyor.
Bunun iรงinde cluster รผstรผnde, bu depolama biriminin volume driver'larฤฑnฤฑn yรผklenmesi gerekiyor. Kubernetes, NFS-ISCSI gibi unฤฑversal protokollere ait driver'larฤฑn yanฤฑnda, AzureDisk-AzureFile-AWS EBS-Google PD-CEPHFS gibi bir รงok bulut servis saฤlayฤฑcฤฑnฤฑn รถzel storage รงรถzรผmlerine ait driver'larฤฑ bรผnyesinde barฤฑndฤฑrฤฑyor.
Yani Kubernetes, varsayฤฑlan olarak bu tiplerdeki depolama รงรถzรผmleri ile konuลabiliyor durumdadฤฑr. Fakat depolama รงรถzรผmleri sadece bunlarla sฤฑnฤฑrlฤฑ deฤildir. Kubernetes bunlarฤฑn yanฤฑnda farklฤฑ depolama รงรถzรผmleri ile de konuลabilecek yetenekleri, Container Storage Interface (CSI) adlฤฑ bir arayรผz ile saฤlฤฑyor.
CSI, isteฤe baฤlฤฑ blok ve dosya depolama sistemlerini Kubernetes gibi Container Orchestration'lar รผzerindeki Container iล yรผklerine maruz bฤฑrakmak iรงin bir standart olarak geliลtirmiลtir. CSI'ฤฑn benimsemesiyle kubernetes volume katmanฤฑ geniลletilebilir hale geldi. 3. taraf depolama saฤlayฤฑcฤฑlarฤฑ, CSI kullanarak รงekirdek kubernetes koduna dokunmak zorunda kalmadan Kubernetes'de yeni depolama sistemlerini aรงฤฑฤa รงฤฑkaran eklentiler yazabilme imkanฤฑna kavuลtu.
CSI, Kubernetes'in storage altyapฤฑsฤฑnฤฑn nasฤฑl ayarlanmasฤฑ gerektiฤini belirten bir standarttฤฑr. Depolama รงรถzรผmรผ รผretenler, bu standart'a uygun driver'lar yazarak Kubernetes'in kendi alt yapฤฑlarฤฑyla da konuลabilmelerine imkan saฤlayabiliyorlar.
Yani รถzetlersek, baฤlanacaฤฤฑmฤฑz depolama birimi volume driver kฤฑsmฤฑnda saydฤฑklarฤฑmฤฑzdan ise, (NFS,Azure,EBS) vb. bunlarla ilgili driver'lar hali hazฤฑrda Kubernetes รผzerinde mevcut. Ancak bunlardan biri deฤilse, misal NetAPP firmasฤฑnฤฑn saฤladฤฑฤฤฑ depolama cihazฤฑnฤฑ kullanฤฑyorsam da, bu sefer o firmanฤฑn(NetAPP misal) bize saฤlayacaฤฤฑ CSI driver'nฤฑn sisteme yรผklememiz gerekecektir.
ฤฐlk adฤฑm bu ลekilde. รncelikle cluster ile depolama alt yapฤฑsฤฑnฤฑ birbirine baฤlฤฑyoruz ve bu iลi halledip, Kubernetes cluster ile depolama birimini konuลabilecek hale getirdikten sonra, bizler gidip bu depolama birimi รผzerinde Kubernetes Cluster'mฤฑz altฤฑnda kullanmak iรงin, depolama birimleri yaratฤฑyoruz. Sonrasฤฑnda da bu depolama birimini karลฤฑlฤฑฤฤฑnฤฑ Kubernetes Cluster'mฤฑz altฤฑnda, persistent volume isimli bir obje olarak oluลturuyoruz.
รrnekle, Kubernetes Cluster'mฤฑzฤฑn eriลebildiฤi NFS tabanlฤฑ bir depolama รงรถzรผmรผmรผz olduฤunu varsayalฤฑm. Kubernetes altฤฑnda, NFS driver'larฤฑ bulunduฤu iรงin, ek bir driver yรผklememize gerek kalmadan bu 2 ortam birbirleri ile gรถrรผลebilir durumda. Sฤฑrada ise, bu depolama รผnitesi รผzerinde, bizlerin eriลip kullanabileceฤi, depolama birimleri oluลturmakta. Bizler gidip NFS cihazฤฑmฤฑza baฤlanฤฑyor ve รถrneฤin "tmp" adฤฑnda bir paylaลฤฑm yaratฤฑyoruz. Bu iลi de hallettikten sonra, sฤฑra geldi bunun Kubernetes tarafฤฑnda karลฤฑlฤฑฤฤฑnฤฑ yaratmaya. ฤฐลte bu nokta da oluลturacaฤฤฑmฤฑz objenin adฤฑ "Persistent Volume"dir.
Yukarฤฑda gรถrdรผฤรผnรผz gibi apiVersion: 1 olan, tipi de Persistent Volume olacak ลekilde bir obje yaratฤฑyoruz. Spec kฤฑsmฤฑ baฤlanacaฤฤฑmฤฑz depolama รผnitesine baฤlanฤฑrken, kullanฤฑlacak driver'a gรถre deฤiลebilir.
Burada driver'a gรถre deฤiลmeyen 3 seรงenek mevcut.
Capacity => Bu parametre bize ne kadarlฤฑk bir volume yaratmak istediฤimizi belirtiyor. Yukarฤฑdaki รถrnekte 5GB boyutunda bir volume oluลturduฤumuz belirtilmiล.
AccessMode => Bu volume'ฤฑn aynฤฑ anda birden fazla, pod'a baฤlandฤฑฤฤฑ zaman, ne ลekilde bir davranฤฑล sergileyeceฤini seรงiyoruz. Burada da seรงenekler 3'e ayrฤฑlฤฑyor. 1- ReadWriteOnce=> Bu volume aynฤฑ anda sadece tek bir pod'a baฤlanabilir ve baฤlanan pod hem yazabilir hem de okuyabilir. 2- ReadOnlyMany => Bu volume aynฤฑ anda birden fazla poda baฤlanabilir. Fakat podlar sadece bu volume de daha รถnceden bu volume eklenmiล dosyalar mevcut ise onlarฤฑ okuyabilirler. Dosya yazamazlar ve oluลturamazlar. 3- ReadWriteMany => Volume aynฤฑ anda birden fazla pod'a baฤlanarak, hem yazabilir hem okuyabilir.
Burada kullandฤฑฤฤฑmฤฑz seรงenekler, depolama รผnitemizin ve driver'larฤฑn yeteneklerine gรถre deฤiลebilir.
รrneฤin, Azure รผzerinde AzureDisk kullanฤฑlฤฑrsa sadece "ReadWriteOnce" desteklenirken, AzureFile tipi bir storage ve driver kullanฤฑlฤฑrsa, bu sefer yukarฤฑda bahsettiฤim 3 seรงeneฤe de desteฤi mevcuttur.
PersistentVolumeReclaimPolicy => Burada bizler pod tarafฤฑndan iลi bitip, kullanฤฑlmayฤฑ bฤฑraktฤฑktan sonra, bu volume'e nasฤฑl davranacaฤฤฑnฤฑ belirtiyoruz. Burada, retain-recycle-delete seรงenekleri mevcuttur.
Retain seรงeneฤi seรงildiฤi durumda, bu persistent volume kullanฤฑldฤฑktan sonra olduฤu gibi kalฤฑyor ve bizler buradaki dosyalarฤฑ manuel olarak kurtarฤฑp, baลka bir yere taลฤฑma imkanฤฑna kavuลuyoruz.
Recycle seรงeneฤini seรงtiฤimiz durumda, bu sefer volume ile iลimiz bittiฤinde volume silinmiyor, fakat iรงindeki tรผm dosyalar siliniyor. Bizler tekrar boล bir volume elde ederek baลka iลlerimizde kullanabiliyoruz.
Delete seรงeneฤini seรงtiฤimiz durumda, volume ile iลimiz bittiฤinde volume tamamen siliniyor.
Yukarฤฑdaki รถrneฤi ele alฤฑrsak, NFS tabanlฤฑ eriลim saฤlayan 172.17.0.2 IP adresi รผstรผnden eriลilebilen bir depolama รผnitesi รผstรผndeki "TMP" isimli paylaลฤฑmฤฑ kullanacak. 5GB boyutunda, sadece tek bir pod'a baฤlanabilecek ve bu pod tarafฤฑndan, hem dosya yazmak hem de okumak iรงin kullanฤฑlabilen pod'un, iลi bittiฤi zaman iรงerisindeki dosyalarฤฑn silineceฤi app=mySQL labeline sahip bir persistent volume oluลturuyoruz.
Bizler bir volume'รผ direkt olarak bir pod ile eลleลtirme imkanฤฑna sahip deฤiliz. Biz bir persistent volume'รผ bir pod'a baฤlamak iรงin รถncelikle Persistent Volume Claim tipinde bir obje daha yaratmamฤฑz gerekmektedir.
Persistent volume claim, bizlerin sistemde bulunan persistent volume'ler arasฤฑnda iลimize uygun olan bir tanesini seรงmemize yani bunu kullanmak adฤฑna talep etmemize imkan veren objelerdir.
Yukarฤฑda gรถrdรผฤรผnรผz รผzere, yine V1 api da bulunan, PersistentVolumeClaim tipinde bir obje yaratฤฑlฤฑyor. Spec kฤฑsmฤฑ Persistent volume'e รงok benziyor. Burada da, ne kadarlฤฑk bir volume talep ettiฤimizi, hangi mode ile baฤlanmak istediฤimizi belirtiyoruz. Son olarak "selector" kฤฑsmฤฑnda, bu persistent volume claim ile persistent volume'รผ label รผstรผnden eลleลtiriyoruz.
Persistent volume claim (volume talebi) app:mysql etiketine sahip, persistent volume tarafฤฑndan saฤlansฤฑn diyoruz.
Kubernetes neden depolama birimi oluลturma ve bunu talep etme iลini 2 farklฤฑ obje รผzerinden hallediyor?
Bunu ลรถyle dรผลรผnelim, bir developer olarak kullandฤฑฤฤฑm kubernetes cluster'ฤฑ biz yรถnetmiyor olabiliriz. Bizim iลimiz olmayabilir ve bu iลe bakan ayrฤฑ bir ekip olabilir. Dolayฤฑsฤฑyla oradaki iลlemleri bizim bilmemiz mรผmkรผn olmayabilir.
A firmasฤฑnda NFS tabanlฤฑ bir depolama รผnitesi kullanฤฑyorken, B firmasฤฑnda ISCSI tabanlฤฑ bir depolama รผnitesi kullanฤฑlabilir. Bu ikisi iรงin "Persistent volume" ayarlarฤฑ deฤiลik olabilir. An รถnce persistent volume'den bahsederken de belirtmiลtik. "Spec" altฤฑndaki ayarlar depolama รผnitelerine gรถre deฤiลebilir. Dolayฤฑsฤฑyla bu volume oluลturma iลini Developer ekibine verirsek, her cihaz iรงin ayrฤฑ ayrฤฑ ayar yapmayฤฑ bilmesi gerekir. Bu da bir hayli zorlayฤฑcฤฑ olacaktฤฑr.
Kubernetes bu sฤฑkฤฑntฤฑyฤฑ volume oluลturma ve oluลturulan volume'รผ talep etme iลini ayฤฑrarak รงรถzmรผลtรผr. Persistent volume'ler, kubernetes cluster'ฤฑ yรถneten ve depolama รผnitelerine de eriลimi olan sistem yรถneticileri veya cluster adminler tarafฤฑndan oluลturulur.
Bu ekip, ortama uygun depolama รผrรผnlerinde gerekli ayarlamalarฤฑ yapar, kullanฤฑlabilecek volume'leri oluลturur, ardฤฑndan developer ekibi, kendi podlarฤฑnda kullanmak adฤฑna uygun รถzelliklerde "persistent volume claim" yaratฤฑr. Bu claim'i, ne รงeลiit bir depolama รงรถzรผmรผ ile karลฤฑladฤฑฤฤฑmฤฑz developer ekibinin bilmesine gerek olan bir bilgi deฤildir.
Developer ekibi talebi oluลturur, bu talep kimi yerlerde NFS depolama รผniteleri ile, kimi yerlerde ISCSI ile รงรถzรผm saฤlanฤฑr.
Persistent Volume Claim oluลturulur, cluster da ki mevcut "persistent volume"lerden uygun olan bu talebi karลฤฑlar. Bu sayede depolama alt yapฤฑsฤฑnฤฑn ayarlanmasฤฑ ve talep edilmesi 2 farklฤฑ ekip tarafฤฑndan halledilebilir.
Ayrฤฑca talep ve oluลturma adฤฑmlarฤฑ ayrฤฑldฤฑฤฤฑ iรงin, tek bir talep yani "Persistent volume claim" tanฤฑmฤฑ bir รงok cluster da kullanฤฑlabilir hale gelir ki, bu da uygulama taลฤฑnabilirliฤini saฤlar.
Elimizde artฤฑk persistent volume yani (pv) bir de persistent volume claim (pvc) mevcut. Gelelim bunu pod'a baฤlamaya,
Pod tanฤฑmฤฑnda bizler kullanmak istediฤimiz volume'รผ talep eden, persistent volume claim ile bir baฤ kurarฤฑz. Pod tanฤฑmlarฤฑnda, "spec" parametresi altฤฑnda yeni bir volume oluลturur ve bunun hedefini oluลturduฤumuz "persistent volume claim" olarak belirleriz. Sonrasฤฑnda da bunu pod altฤฑnda gerekli pathe mount ederiz. Bu pod oluลturulduฤu anda bu talep devreye girer ve bu talebi karลฤฑlayan Persistent volume" objesindeki tanฤฑma gรถre, bu podun oluลturulacaฤฤฑ worker node รผzerinde ayarlamalar yapฤฑlฤฑr.
Storage cihazฤฑna baฤlanฤฑlฤฑr, arkada driver yapmasฤฑ gerekenleri yapar, sonucunda da bu pod, iรงerisindeki container'ฤฑn ilgili pathine depolama cihazฤฑ รผstรผnde duran, bu volume baฤlanฤฑr.
Bu noktada itibaren, bu pathe yazฤฑlan dosyalar aslฤฑnda bu volume'e yazฤฑlฤฑr. Eฤer bu pod bulunduฤu worker node รผstรผnden bir ลekilde silinir, baลka bir worker node'a taลฤฑnฤฑrsa, bu sefer aynฤฑ iลlemler, taลฤฑndฤฑฤฤฑ worker node รผzerinde gerรงekleลtirilir. Ve yeni pod, bu volume'e baฤlanฤฑr. Bu sayede podun yaลam sรผresinden daha uzun sรผre boyunca veri saklayabileceฤimiz, alt yapฤฑya kavuลmuล oluruz.
Persistent volume cluster'dan baฤlanabileceฤimiz, bir depolama รผnitesindeki paylaลฤฑmlara veya diskleri kubernetes podlarฤฑna mount edebilmemize imkan saฤlฤฑyor.
pv.yaml => Yukarฤฑdaki รถrnekte, mysqlpv adฤฑnda bir persistent volume oluลturuyoruz. Burada bir de label atฤฑyoruz. Label kฤฑsmฤฑ รถnemli, รงรผnkรผ persistent volume claim bu volume'รผ bu label'a gรถre seรงecek. 5G alan talep ediyoruz. Volume tipi olarak ReadWriteOnce seรงiyoruz. En altta NFS sunucu IP adresi ve paylaลฤฑmฤฑn pathini belirtiyoruz. Buradaki ayarlar baฤlanacaฤฤฑmฤฑz depolama รผnitesine gรถre, kullanฤฑlacak driver'a gรถre deฤiลir.
Persistent volume talep eden, persistent volume claim oluลturmak gerekiyor. Bรถylelikle ilgili podlara bu volume'รผ baฤlayabiliriz.
pvc.yaml => mysqlclaim adฤฑnda bir persistent volume claim oluลturuyoruz. Burada belirttiฤimiz access moduda persistent volume tanฤฑmฤฑ ile aynฤฑ olmak zorundadฤฑr. Storage kฤฑsmฤฑnda talep edilen alan mevcuttur. "selector" kฤฑsmฤฑ ile "matchLabels" kullanฤฑlarak "app:mysql" labeline sahip persistent volume seรงiyoruz. Hangi "Persistent Volume"รผ talep ettiฤimizi burada belirtiyoruz(Label-Selector).
deploy.yaml => (Pod tanฤฑmฤฑ ve volume'รผ pod'a mount etmek) "mysqlvolume" adฤฑnda volume tanฤฑmlฤฑyoruz. Bu volume'de "mysqlclaim" isimli "persistent volume claim"den saฤlanmasฤฑnฤฑ talep ediyoruz. Ardฤฑndan, "volumeMounts" parametresi ile pod'un "/var/lib/mysql" pathine mount ediyoruz.