Kubernetes dünyasında yapılandırma dosyalarının doğru ve etkili bir şekilde yönetilmesi, başarılı bir operasyonun temel taşlarından biridir. Bu yazıda, Kubernetes objelerini tanımlarken kullandığımız araçları inceleyecek ve aralarındaki farkları açıklayacağız. Önceki makalelere göz atmak isterseniz, aşağıdaki bağlantılardan başlayabilirsiniz:
Kubernetes'de bir obje oluşturmanın üç temel yolu vardır:
Yaml yapılandırma dosyaları
JSON yapılandırma dosyaları
kubectl komut satırı
YAML Yapılandırma Dosyaları
YAML (YAML Ain't Markup Language), insan tarafından okunabilir yapılandırma dosyaları oluşturmak için kullanılan sade ve anlaşılır bir veri serileştirme dilidir. Kubernetes'de, YAML dosyaları, sistemin ihtiyaç duyduğu yapılandırmaları tanımlamak ve yönetmek için standart bir araç haline gelmiştir.
Artıları:
Okunabilirlik: YAML, girintileme ve boşluklarla yapıyı ifade eder, bu da onu insanlar tarafından daha kolay okunabilir hale getirir. Karmaşık yapılandırma dosyaları için daha anlaşılırdır.
Yalınlık: Daha az sembol ve işaretleme kullanır (
{}
,[]
,,
,:
gibi). Bu da özellikle büyük dosyalarda temiz ve anlaşılır bir yapı sağlar.Desteklenen Veri Türleri: YAML, string, integer, float, boolean gibi temel veri türlerini destekler. Ayrıca çok satırlı string'ler, liste ve sözlük (dictionary) gibi daha karmaşık yapıları da rahatlıkla ifade edebilir.
Esneklik: YAML esnek bir yapı sunar. Veri türleri genellikle otomatik olarak algılanır, bu da özellikle hızlıca yapılandırma dosyaları yazarken kullanışlı olabilir. Örneğin, string değerler tırnak işareti olmadan da yazılabilir, bu da yazmayı ve okumayı kolaylaştırır.
Eksileri:
Hata Yapma Riski: Girintileme hataları YAML dosyalarında sıkça karşılaşılan bir sorundur. Girintileme hataları doğru çalışmayan yapılandırmalara yol açabilir.
Performans: JSON'a göre daha karmaşık ve soyut bir yapısı olduğundan, işlenmesi JSON'dan daha yavaş olabilir.
Standart Dışı Kullanımlar: YAML, isteğe bağlı olarak yorum satırları ve özel karakterleri destekler, bu da bazen taşınabilirlik ve standart uyumu açısından sorun yaratabilir.
YAML ile bir pod oluşturmak istediğimizde aşağıdaki gibi bir tanımlama yapabiliriz.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
JSON Yapılandırma Dosyaları
JSON (JavaScript Object Notation), veri depolama ve veri aktarımı için yaygın olarak kullanılan hafif bir veri değişim formatıdır. JSON, insan tarafından okunabilir bir metin formatı olup, JavaScript nesne gösterimi üzerine kurulmuştur, ancak dil bağımsızdır. JSON, yapılandırılmış verileri bir dizi anahtar-değer çifti ve sıralı liste olarak ifade eder.
Artıları:
Basitlik: JSON, basit bir yapıdadır ve çok net bir sözdizimi kullanır. Bu da onu hızlı ve kolay bir şekilde yazılabilir ve işlenebilir hale getirir.
Performans: JSON, daha basit yapısı sayesinde daha hızlı işlenebilir. Genellikle web API'larında veri aktarımı için kullanılır.
Standart Uyumluluk: JSON, web servisleri ve API'lar için yaygın olarak kullanılan bir format olduğu için geniş bir destek ve uyumluluk sağlar.
Tip Güvenliği ve Veri Doğrulama: JSON, tip güvenliği ve veri doğrulama konusunda daha katıdır. JSON dosyasında her veri türü (string, number, boolean, array, object) açıkça belirtilir ve bu sayede veri yapısının doğruluğu daha net bir şekilde kontrol edilebilir. Örneğin, bir string değeri her zaman tırnak içinde belirtilir, bu da JSON'un veri doğrulama araçları tarafından kolayca işlenmesini sağlar.
Eksileri:
Okunabilirlik: Özellikle karmaşık yapılandırma dosyaları söz konusu olduğunda, JSON'un okunması ve yönetilmesi zor olabilir.
Yazım Hataları: JSON'un sıkı bir sözdizimi vardır (örneğin, tırnak işaretleri, virgüller). Küçük bir hata, JSON dosyasının tamamen geçersiz olmasına neden olabilir.
Esneklik Eksikliği: JSON, çok satırlı stringler ve yorumlar gibi özellikleri desteklemez. Bu da yapılandırma dosyalarında esnekliği sınırlayabilir.
JSON ile bir pod oluşturmak istediğimizde aşağıdaki gibi bir tanımlama yapabiliriz.
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "my-pod"
},
"spec": {
"containers": [
{
"name": "my-container",
"image": "nginx:latest",
"ports": [
{
"containerPort": 80
}
]
}
]
}
}
Kubectl Komut Satırı
Yaml ya da json dosyaları kullanmadan da kubectl komutlarını kullanarak çeşitli objeler oluşturmak ve güncellemek mümkündür.
Artıları:
- Hızlı ve Anlık Yönetim: Kubernetes objeleri doğrudan komut satırı aracılığıyla da oluşturulabilir ve yönetilebilir.
Eksileri:
Sürdürülebilirlik: Yapılandırmaların belgelenmesi ve versiyon kontrolü zor olur.
Karmaşıklık: Daha karmaşık yapılandırmalar için komut satırı yeterli olmaz.
Kubectl ile bir pod oluşturmak istediğimizde aşağıdaki gibi komut yazabiliriz.
kubectl run my-pod --image=nginx:latest --port=80
Her ne kadar kubectl komut satırı, hızlı ve doğrudan müdahale gerektiren durumlar için kullanışlı olsa da, uzun vadeli yapılandırmalar için tercih edilmez. Kubectl, komut satırı doğrudan terminal üzerinden çalıştığı için yapılan işlemlerin tekrarlanabilirliği ve izlenebilirliği sınırlıdır. Bu yöntem, özellikle karmaşık ve uzun yapılandırmalar için uygun değildir, çünkü komutlar terminalde çalıştırıldıktan sonra kaybolur ve bu da uzun vadeli yapılandırmaların yönetimini zorlaştırır. Bunun yerine, JSON ve YAML dosyaları, yapılandırma dosyalarının daha etkili bir şekilde yönetilmesine olanak tanır. CI/CD (Continuous Integration/Continuous Deployment) süreçlerinde, yapılandırma dosyalarının versiyon kontrolü altında tutulması, izlenebilir olması ve otomatik olarak işlenebilirliği son derece önemlidir. Hem JSON hem de YAML dosyaları, bu süreçlerde başarıyla kullanılabilir. YAML dosyaları, özellikle insan tarafından okunabilirliği ve yazılabilirliği nedeniyle CI/CD süreçlerinde daha fazla tercih edilirken, JSON da belirli otomasyon araçları ve API entegrasyonları ile uyumluluğu nedeniyle tercih edilebilir.
YAML ve JSON Arasındaki Farklar
Sözdizimi: YAML, girintileme kullanırken JSON köşeli parantezler (
[]
) ve süslü parantezler ({}
) kullanır. Bu, YAML'ı daha okunabilir, JSON'u ise daha katı bir format haline getirir.Yorumlar: YAML yorumları desteklerken JSON desteklemez. Bu, YAML'ı yapılandırma dosyaları için daha uygun hale getirir.
Veri Yapıları: Her iki format da aynı veri yapılarının çoğunu destekler, ancak YAML daha zengin ve esnek bir şekilde çok satırlı stringler ve karmaşık yapıların ifade edilmesine izin verir.
Kubernetes ve Cloud Dünyasında Neden YAML Tercih Ediliyor?
Okunabilirlik: Kubernetes gibi karmaşık sistemlerde yapılandırma dosyalarının anlaşılması ve yönetilmesi önemlidir. YAML, okunabilirliği sayesinde kullanıcılar için daha erişilebilir hale gelir.
Modülerlik ve Esneklik: YAML, girintileme ve blok tabanlı yapısıyla, karmaşık nesne yapılarını ve hiyerarşileri düzenlemek için idealdir. Kubernetes gibi büyük ölçekli sistemlerde, farklı konfigürasyon parçalarının bir araya getirilmesi ve düzenlenmesi gerektiğinde, YAML'ın modüler yapısı büyük bir avantaj sağlar.
Yorumlama Yeteneği: YAML, yapılandırma dosyalarında yorum satırlarına izin verir. Bu, yapılandırma dosyalarının amacı ve kullanımı hakkında daha fazla bilgi vermek için yararlıdır.
YAML ve JSON'un her biri farklı senaryolar için güçlü araçlar sunar. Kubernetes başta olmak üzere birçok modern bulut sistemi, yapılandırma dosyaları için YAML'ın okunabilirliği, esnekliği ve yorumlama yeteneği gibi avantajları onu tercih edilen bir format haline getirir.
YAML ile Kubernetes Objelerinin Yönetimi
YAML, JSON ve kubectl komut satırından bahsettiğimize göre şimdi bir kubernetes yaml dosyasının nasıl yapılandırıldığını, bu dosyalarda sıkça kullanılan alanları ve objeye göre değişebilen alanları inceleyeceğiz.
Bir Kubernetes YAML dosyası, genellikle dört ana bölüm içerir:
apiVersion
: Bu alan, Kubernetes API'sinin hangi versiyonunun kullanıldığını belirtir. Her objenin, belirli bir API versiyonuna bağlı olarak tanımlanması gerekir.kind
: Bu alan, oluşturulacak Kubernetes objesinin türünü tanımlar (örneğin, Pod, Service, Deployment vb.).metadata
: Objenin adı, etiketler, ve açıklamalar gibi meta bilgileri içerir.spec
: Bu alan, objenin özel yapılandırmalarını içerir. Bu bölüm, objenin türüne göre büyük ölçüde değişir.
Bu dört ana bölümden
apiVersion
,kind
vemetada
tüm objelerin tanımında bulunur.spec
bölümü obje türüne göre değişir.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
Örneğin yukarıdaki yaml tanımlamasında, kind
değeri Pod
. Yani biz bir pod tanımlaması yapıyoruz. apiVersion
kısmında v1
değerini görüyoruz. Bu tanımlar rastgele yazdığımız tanımlar değildir. Bu tanımlar kubernetes api içerisinde bulunur. Örneğin biz bir pod oluşturmak istiyoruz ancak apiVersion
, kind
alanlarına ne yazacağımızı bilmiyoruz diyelim. Bu durumda kubectl komut satırını kullanarak ya da kubernetes dökümantasyonunu okuyarak öğrenebiliriz.
Yukarıdaki adresi ziyaret ettiğimizde tarayıcımızda aşağıdakine benzer sayfa yüklenecektir. Burada kind
ve apiVersion
bilgilerini bulabileceğiz.
Bu bilgileri kubectl komut satırı üzerinden de öğrenebiliriz.
kubectl explain pod
Yukarıdaki komutu çalıştırdığımızda, terminal bize cevap olarak aşağıdaki gibi bir çıktı üretir. Burada
kind
veapiVersion
bilgilerini görebilirsiniz.Her kubernetes objesine ek bilgiler eklemek için
metada
bölümünü kullanırız.metada
içerisinename
,labels
(etiketler),annotations
(ek açıklamalar) gibi tanımlamalar yapabiliriz. Aşağıdaki yaml tanımlamasında gördüğünüz gibimetadata
içerisinde pod'a isim, etiketler ve ekstra bilgiler ekledik.
Labels (etiketler), Kubernetes ekosisteminde çok önemlidir. Kubernetes objelerini ayırmada, gruplamada ve seçici sorgulamalar yapmada kullanılır. Etiketler sayesinde belirli bir etiketle işaretlenmiş objeleri seçebilir, bu objeler üzerinde toplu işlemler gerçekleştirebilir ve monitoring, scaling gibi operasyonlarda etiketleri referans alarak otomatik süreçler oluşturabilirsiniz. Ayrıca, etiketler kullanarak belirli bir uygulamanın farklı versiyonlarını veya ortamlarını ayırt etmek mümkündür.
apiVersion: v1
kind: Pod
metadata:
name: frontend
labels:
app: cmspanel
environment: production
tier: frontend
annotations:
description: "Bu pod frontend uygulamamızı, production ortamında çalıştırır."
maintainer: "serhatleventyavas@gmail.com"
spec:
containers:
- name: cmspanel
image: nginx:latest
ports:
- containerPort: 80
Her kubernetes objesinin kendi özgü ayarları, tanımlamaları vardır. Bu tanımları yapmak için spec
bölümünü kullanırız. Bu bölüm, objenin türüne göre büyük ölçüde değişir.
Örneğin, aşağıdaki YAML dosyasında bir Pod oluşturulurken kullanılan spec
tanımını görebilirsiniz.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
Spec bölümünde kullandığımız tanımları açıklamak gerekirse:
containers
: Pod içinde çalışacak container'ları tanımlar.name
: Container'ın adını belirler.image
: Kullanılacak Docker imajını belirtir.ports
: Container'da açılacak portları tanımlar. Bu örnekte,containerPort
80 olarak belirlenmiştir.
Pod'un spec
bölümü hakkında daha detaylı bilgi edinmek için Kubernetes dokümantasyonunu ziyaret edebilirsiniz.
Kubectl Komutu ve YAML ile Pod Yönetimi
Yazımızın bu son bölümünde, bir YAML dosyası kullanarak nasıl bir Pod oluşturabileceğimizi, güncelleyebileceğimizi ve silebileceğimizi ele alacağız. Bu konuları ileride yazmayı planladığım Pod makalesinde daha detaylı olarak inceleyeceğim. Ancak, bu noktada bir YAML dosyasının nasıl çalıştırıldığını göstermek ve temel Pod yönetimi işlemlerini anlamak adına bu örnek oldukça faydalı olacaktır.
Pod Oluşturma
Öncelikle, bir YAML dosyası oluşturarak Pod tanımlamamızı yapalım. Aşağıdaki içerikle mypod.yaml
adlı bir dosya oluşturalım:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx:latest
ports:
- containerPort: 80
Bu YAML dosyasını oluşturduktan sonra, aşağıdaki kubectl apply
komutunu kullanarak Pod'u çalıştırabiliriz:
kubectl apply -f mypod.yaml
Bu komut, Kubernetes API'sine dosyada tanımlı olan Pod'u oluşturmasını söyler. Pod'un başarıyla oluşturulup oluşturulmadığını doğrulamak için şu komutu kullanabilirsiniz:
kubectl get pods
Ayrıca aşağıdaki komut ile pod hakkında daha fazla bilgi öğrenebiliriz.
kubectl describe pods mypod
Pod Güncelleme
Oluşturduğumuz Pod'u güncellemek için YAML dosyamızda değişiklikler yapabiliriz. Örneğin, container'ın kullandığı imajı değiştirelim ve bir adet etiket ekleyelim:
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: backend
spec:
containers:
- name: mycontainer
image: nginx:alpine
ports:
- containerPort: 80
Değişiklikleri kaydettikten sonra, yine kubectl apply
komutunu çalıştırarak Pod'u güncelleyebilirsiniz:
kubectl apply -f mypod.yaml
Bu komut, mevcut Pod'u günceller ve yeni yapılandırmaya göre yeniden oluşturur.
Tekrardan aşağıdaki komutu çalıştıralım ve yaptığımız değişiklikleri görelim.
kubectl describe pods mypod
Pod Silme
Son olarak, oluşturduğumuz Pod'u silmek istersek, kubectl delete
komutunu kullanabiliriz:
kubectl delete -f mypod.yaml
Bu komut, YAML dosyasında tanımlı olan Pod'u siler ve kümede bu isimde bir Pod kalmaz. Bunu görebilmek için tekrardan podları listeleyelim.
kubectl get pods
Bu makalede, Kubernetes yapılandırma dosyalarının oluşturulması ve yönetilmesi konusunda JSON, YAML formatlarını ve kubectl komut satırı ele aldık. YAML'ın neden sektör standardı haline geldiğini ve Kubernetes dünyasında yapılandırma dosyalarının vazgeçilmez bir parçası olduğunu inceledik. Kubernetes YAML dosyalarının ana bölümlerini tanıtarak, Kubernetes objelerinin nasıl tanımlandığını ve yönetildiğini açıkladık. Son olarak, öğrendiklerimizi pekiştiren bir örnekle, YAML kullanarak Kubernetes'te Pod oluşturma sürecini adım adım uyguladık. Bu bilgilerin üzerine daha fazla araştırma yaparak, denemeler yaparak kubernetes konusunda kendinizi geliştirebilir ve uygulamalarınızı kubernetes ortamında çalıştırabilirsiniz. Umarım sana dokunmuş olabilirim. Merak ettiğin bir şey olursa benimle iletişime geçebilirsin.