Kubernetes Objelerini Nasıl Oluşturur ve Yönetirsiniz?

Serhat Levent Yavas
8 min readAug 11, 2024

--

Kubernetes Objelerini Nasıl Oluşturur ve Yönetirsiniz?

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:

  1. Kubernetes’in Geçmişi ve Evrimi
  2. Kubernetes Cluster Nedir? Yeni Başlayanlar İçin Kılavuz
  3. Kubernetes Komut Satırı Aracı: kubectl

Kubernetes’de bir obje oluşturmanın üç temel yolu vardır:

  1. Yaml yapılandırma dosyaları
  2. JSON yapılandırma dosyaları
  3. 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ı:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. 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.
  2. Performans: JSON’a göre daha karmaşık ve soyut bir yapısı olduğundan, işlenmesi JSON’dan daha yavaş olabilir.
  3. 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ı:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. Okunabilirlik: Özellikle karmaşık yapılandırma dosyaları söz konusu olduğunda, JSON’un okunması ve yönetilmesi zor olabilir.
  2. 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.
  3. 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ı:

  1. Hızlı ve Anlık Yönetim: Kubernetes objeleri doğrudan komut satırı aracılığıyla da oluşturulabilir ve yönetilebilir.

Eksileri:

  1. Sürdürülebilirlik: Yapılandırmaların belgelenmesi ve versiyon kontrolü zor olur.
  2. 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

  1. 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.
  2. Yorumlar: YAML yorumları desteklerken JSON desteklemez. Bu, YAML’ı yapılandırma dosyaları için daha uygun hale getirir.
  3. 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?

  1. 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.
  2. 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.
  3. 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:

  1. apiVersion: Bu alan, Kubernetes API'sinin hangi versiyonunun kullanıldığını belirtir. Her objenin, belirli bir API versiyonuna bağlı olarak tanımlanması gerekir.
  2. kind: Bu alan, oluşturulacak Kubernetes objesinin türünü tanımlar (örneğin, Pod, Service, Deployment vb.).
  3. metadata: Objenin adı, etiketler, ve açıklamalar gibi meta bilgileri içerir.
  4. 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 ve metada 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.

pod documentation
  • 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 ve apiVersion bilgilerini görebilirsiniz.

kubectl explain pod

Her kubernetes objesine ek bilgiler eklemek için metada bölümünü kullanırız. metada içerisine name, labels (etiketler), annotations (ek açıklamalar) gibi tanımlamalar yapabiliriz. Aşağıdaki yaml tanımlamasında gördüğünüz gibi metadata 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
kubectl get pods

Ayrıca aşağıdaki komut ile pod hakkında daha fazla bilgi öğrenebiliriz.

kubectl describe pods mypod
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.

kubectl apply -f mypod.yaml

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
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
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.

--

--

Serhat Levent Yavas

Flutter, .Net, NodeJS, React, Docker, PostgreSQL, Github Actions, CI/CD, Firebase, AWS -- https://github.com/serhatleventyavas