Kubernetes YAML Yapıları: Detaylı Anlatım

Kubernetes'te sıkça kullanılan temel yapılandırma dosyalarını ve amaçlarını keşfedin.

Giriş

Kubernetes, tüm kaynaklarını bildirimsel (declarative) YAML dosyaları aracılığıyla yönetir. Bu, istediğiniz son durumu tanımladığınız ve Kubernetes'in bu duruma ulaşmak için gerekli adımları attığı anlamına gelir. Bu bölümde, Kubernetes'te en sık kullanılan YAML yapılarını detaylı bir şekilde inceleyeceğiz: ConfigMap, Secret, Deployment, PersistentVolumeClaim (PVC) ve Service. Her bir yapının amacını, kullanım senaryolarını ve örnek YAML kodlarını bulacaksınız.

1. ConfigMap

**ConfigMap**, uygulama yapılandırma verilerini Pod'lardan ayırmak için kullanılan bir Kubernetes API objesidir. Bu, uygulama kodunu değiştirmeden yapılandırma ayarlarını kolayca güncellemenizi sağlar. Hassas olmayan (non-sensitive) verileri depolamak için idealdir. Örneğin, veritabanı bağlantı dizeleri, loglama seviyeleri, API URL'leri gibi bilgileri ConfigMap'lerde saklayabilirsiniz.

Kullanım Senaryoları:

  • Uygulama ortam değişkenlerini yönetme.
  • Yapılandırma dosyalarını (örneğin `nginx.conf`, `application.properties`) Pod'lara bağlama.
  • Komut satırı argümanları sağlama.

Örnek YAML:


apiVersion: v1
kind: ConfigMap
metadata:
  name: uygulama-ayarlari
data:
  # Key-value çiftleri olarak yapılandırma verileri
  API_URL: "http://api.example.com/v1"
  DATABASE_HOST: "mysql-service"
  LOG_LEVEL: "INFO"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: your-app-image:latest
        ports:
        - containerPort: 80
        envFrom: # ConfigMap'ten ortam değişkenlerini yükleme
        - configMapRef:
            name: uygulama-ayarlari
        volumeMounts: # ConfigMap'i dosya olarak bağlama
        - name: app-config-volume
          mountPath: "/etc/app-config"
          readOnly: true
      volumes:
      - name: app-config-volume
        configMap:
          name: uygulama-ayarlari
          items:
          - key: API_URL
            path: api_url.txt
          - key: DATABASE_HOST
            path: db_host.txt
                

2. Secret

**Secret**'lar, parolalar, API anahtarları, OAuth tokenları ve SSH anahtarları gibi hassas bilgileri depolamak ve yönetmek için kullanılır. ConfigMap'ler gibi hassas olmayan verilerden farklı olarak, Secret'lar hassas veriler için tasarlanmıştır. Kubernetes, Secret'ları Pod'lara ortam değişkenleri veya dosya sistemi aracılığıyla güvenli bir şekilde enjekte etmenin birden fazla yolunu sunar. Veriler `base64` ile kodlanmış olarak saklanır, ancak bu bir şifreleme değildir; sadece bir kodlamadır. Hassas verilerinizin gerçekten güvende olduğundan emin olmak için ek güvenlik önlemleri (örneğin, şifreleme çözümleri) almanız önerilir.

Kullanım Senaryoları:

  • Veritabanı kimlik bilgileri (kullanıcı adı, parola).
  • API anahtarları ve tokenlar.
  • Özel SSH anahtarları.
  • TLS sertifikaları ve anahtarları.

Örnek YAML:


apiVersion: v1
kind: Secret
metadata:
  name: my-database-secret
type: Opaque # Varsayılan tip, genellikle hassas veriler için kullanılır
data:
  # base64 kodlanmış değerler
  # echo -n 'myuser' | base64
  DB_USERNAME: bXl1c2Vy
  # echo -n 'mypassword' | base64
  DB_PASSWORD: bXlwYXNzd29yZA==
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: database-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: database-app
  template:
    metadata:
      labels:
        app: database-app
    spec:
      containers:
      - name: database-app-container
        image: your-db-app-image:latest
        ports:
        - containerPort: 80
        env: # Secret'tan ortam değişkeni olarak yükleme
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-database-secret
              key: DB_USERNAME
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-database-secret
              key: DB_PASSWORD
        volumeMounts: # Secret'ı dosya olarak bağlama
        - name: secret-volume
          mountPath: "/etc/secrets"
          readOnly: true
      volumes:
      - name: secret-volume
        secret:
          secretName: my-database-secret
                

3. Deployment

**Deployment**, durum bilgisiz (stateless) uygulamalar için Pod ve ReplicaSet yönetimini kolaylaştıran yüksek seviyeli bir Kubernetes kaynağıdır. Uygulamanızın istenen durumunu tanımlar (kaç kopya, hangi imaj, hangi portlar vb.) ve Kubernetes Deployment Controller bu durumu korumak için gerekli Pod'ları ve ReplicaSet'leri otomatik olarak yönetir. Kesintisiz güncellemeler (rolling updates) ve kolay geri alma (rollback) yetenekleri sunar.

Kullanım Senaryoları:

  • Web uygulamaları ve API'ler gibi durum bilgisi olmayan hizmetleri dağıtma.
  • Uygulama sürüm güncellemeleri yapma (sıfır kesintiyle).
  • Uygulama sürümünü önceki bir stabil duruma geri alma.
  • Uygulama kopyalarını yatay olarak ölçeklendirme.

Örnek YAML:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server-deployment
  labels:
    app: web-server
spec:
  replicas: 3 # 3 adet Pod kopyası çalıştır
  selector:
    matchLabels:
      app: web-server
  template: # Pod şablonu - bu Deployment'ın oluşturacağı Pod'ların tanımı
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest # Nginx imajını kullan
        ports:
        - containerPort: 80 # Konteynerin açığa çıkardığı port
        resources: # Konteyner için kaynak limitleri ve istekleri
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
      affinity: # Pod'ların düğümlere nasıl dağıtılacağını belirler
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: web-server
            topologyKey: "kubernetes.io/hostname" # Aynı düğümde birden fazla Pod olmasını engeller
                

4. PersistentVolumeClaim (PVC)

**PersistentVolumeClaim (PVC)**, bir kullanıcının veya uygulamanın bir `PersistentVolume` (PV) için yaptığı depolama isteğidir. PV'ler, küme yöneticileri tarafından sağlanan veya dinamik olarak oluşturulan fiziksel depolama birimlerini temsil ederken, PVC'ler bu depolamayı talep eden Pod'lar için bir soyutlama katmanı sağlar. Bu sayede, Pod'lar hangi depolama teknolojisinin kullanıldığını bilmek zorunda kalmadan kalıcı depolama isteyebilir. PVC'ler genellikle durum bilgisi olan (stateful) uygulamalar (örneğin veritabanları) için kullanılır, çünkü bu uygulamaların verileri konteynerlerin yaşam döngüsünden bağımsız olarak kalıcı olmalıdır.

Kullanım Senaryoları:

  • Veritabanı verilerini kalıcı olarak depolama.
  • Uygulama loglarını veya kullanıcı yüklemelerini depolama.
  • Sıra dışı veya büyük veri setlerini işleyen uygulamalar için depolama sağlama.

Örnek YAML:


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-data-pvc
spec:
  accessModes: # Erişim modları
    - ReadWriteOnce # Tek bir düğümden yazma/okuma
  resources:
    requests:
      storage: 5Gi # 5 Gigabayt depolama alanı isteği
  storageClassName: standard # Kullanılacak depolama sınıfı (Cloud'da GCE, AWS EBS vb.)
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateful-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stateful-app
  template:
    metadata:
      labels:
        app: stateful-app
    spec:
      containers:
      - name: stateful-app-container
        image: your-stateful-app-image:latest
        volumeMounts:
        - name: app-persistent-storage
          mountPath: "/data" # Konteyner içinde verinin bağlanacağı yol
      volumes:
      - name: app-persistent-storage
        persistentVolumeClaim:
          claimName: my-app-data-pvc # Yukarıda tanımlanan PVC'ye referans
                

5. Service

**Service** (Hizmet), kümedeki Pod'lara ağ trafiğini eşleyen bir Kubernetes kaynağıdır. Pod'lar geçici olduğu ve IP adresleri değişebileceği için, Servisler Pod'ların önüne geçerek onlara sabit bir erişim noktası ve yük dengeleme yeteneği sağlar. Bu sayede, Pod'lar yeniden oluşturulsa bile uygulamalar Servis üzerinden istikrarlı bir şekilde erişilebilir kalır. Farklı Servis türleri, uygulamanızın küme içinde mi yoksa küme dışında mı erişilebilir olacağını belirler.

Kullanım Senaryoları:

  • Küme içindeki diğer Pod'ların bir dizi Pod'a erişmesini sağlama (Microservices iletişimi).
  • Uygulamanın dışarıdan (internet üzerinden) erişilebilir olmasını sağlama.
  • Yük dengeleme ve trafik dağıtımı yapma.
  • Sabit bir DNS adı ve IP adresi sağlama.

Örnek YAML:


apiVersion: v1
kind: Service
metadata:
  name: my-web-service
spec:
  selector:
    app: web-server # Bu Servis'in trafiği yönlendireceği Pod'lar için etiket seçici
  ports:
    - protocol: TCP
      port: 80 # Servis'in dinleyeceği port
      targetPort: 80 # Pod'ların dinlediği port
      nodePort: 30080 # (NodePort tipi için isteğe bağlı) Düğümde açılacak port
  type: LoadBalancer # Servis tipi: ClusterIP, NodePort, LoadBalancer, ExternalName
                

**Servis Tipleri:**

  • ClusterIP: Varsayılan tiptir. Servis'i yalnızca küme içinde erişilebilir sabit bir IP adresi altında birleştirir. Mikroservisler arası iletişim için kullanılır.
  • NodePort: Her çalışan düğümde belirli bir port açarak Servis'i küme dışına açar. Küme dışından erişim için temel bir yoldur, ancak genellikle gelişim/test ortamlarında kullanılır.
  • LoadBalancer: Servis'i bulut sağlayıcısının (AWS, GCP, Azure vb.) bir yük dengeleyicisi aracılığıyla dışarıya açar. İnternetten erişim için tercih edilen yoldur. Bulut sağlayıcınızda otomatik olarak bir yük dengeleyici oluşturur.
  • ExternalName: Bir DNS CNAME kaydı döndürerek Servis'i harici bir DNS adına eşler. Genellikle harici bir hizmeti küme içindeki Pod'lara açmak için kullanılır.

Sonuç

ConfigMap, Secret, Deployment, PersistentVolumeClaim ve Service gibi temel Kubernetes YAML yapıları, konteynerli uygulamaları Kubernetes üzerinde etkili bir şekilde dağıtmak, yönetmek ve ağa açmak için kritik öneme sahiptir. Bu yapılar, uygulamanızın yaşam döngüsünü, yapılandırmasını, hassas verilerini ve ağ erişilebilirliğini bildirimsel bir şekilde tanımlamanıza olanak tanır. Bu kavramları ve YAML kullanımlarını anlamak, Kubernetes'te başarılı bir şekilde çalışmanın temelini oluşturur.