# 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](https://serhatleventyavas.dev/kubernetesin-gecmisi-ve-evrimi)
    
2. [Kubernetes Cluster Nedir? Yeni Başlayanlar İçin Kılavuz](https://serhatleventyavas.dev/kubernetes-cluster-nedir-yeni-baslayanlar-icin-kilavuz)
    
3. [Kubernetes Komut Satırı Aracı: kubectl](https://serhatleventyavas.dev/kubernetes-komut-satiri-araci-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)**](https://yaml.org/), 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.

```yaml
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)**](https://www.json.org/json-en.html), 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.

```json
{
  "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](https://kubernetes.io/docs/reference/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.

```bash
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](https://kubernetes.io/docs/concepts/workloads/pods/), [Service](https://kubernetes.io/docs/concepts/services-networking/service/), [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/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.

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

* **Dökümantasyon**: [https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/)
    

Yukarıdaki adresi ziyaret ettiğimizde tarayıcımızda aşağıdakine benzer sayfa yüklenecektir. Burada `kind` ve `apiVersion` bilgilerini bulabileceğiz.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723385213468/f2c608cb-6f98-443b-be81-1bdbcd69bd7f.png align="center")

* Bu bilgileri kubectl komut satırı üzerinden de öğrenebiliriz.
    
    ```yaml
    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.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723385062711/09119873-74f1-48d0-b4e3-359e4c3285bf.png align="center")
    
    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.

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

```yaml
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](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec) 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:

```yaml
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:

```bash
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:

```bash
kubectl get pods
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395269542/43383c49-b32d-4602-ac7a-37280d583270.png align="center")

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

```bash
kubectl describe pods mypod
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395502908/5fe8bf00-c8e4-448f-81c5-d5480b43338f.png align="center")

#### 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:

```yaml
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:

```bash
kubectl apply -f mypod.yaml
```

Bu komut, mevcut Pod'u günceller ve yeni yapılandırmaya göre yeniden oluşturur.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395632924/c40be2fb-5275-4960-8da2-127aeaf9576b.png align="center")

Tekrardan aşağıdaki komutu çalıştıralım ve yaptığımız değişiklikleri görelim.

```bash
kubectl describe pods mypod
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395662814/7898209d-4b87-422c-896b-4027071eb11a.png align="center")

#### Pod Silme

Son olarak, oluşturduğumuz Pod'u silmek istersek, `kubectl delete` komutunu kullanabiliriz:

```bash
kubectl delete -f mypod.yaml
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395905696/eddceef3-cf28-4c9a-a420-7e07fb393e2b.png align="center")

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.

```bash
kubectl get pods
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723395899485/bdaa34d9-d6c1-4906-8478-0318f340c92f.png align="center")

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.
