Bulut Günlüğü (AWS)

Kubernetes Küme Kurulumu ve Temel Kavramlar: Kapsamlı Bir Teknik Rehber

 · 

Kubernetes Küme Kurulumu ve Temel Kavramlar: Kapsamlı Bir Teknik Rehber

Kubernetes Küme Kurulumu ve Temel Kavramlar: Kapsamlı Bir Teknik Rehber

Giriş: Neden Kubernetes?

Modern uygulamaların dağıtım ve yönetimini basitleştirmek amacıyla tasarlanan Kubernetes (K8s), konteynerleştirilmiş uygulamaların otomasyonunu, ölçeklendirilmesini ve yönetimini sağlayan açık kaynaklı bir platformdur. Tekil sunucularda çalışan uygulamalardan, dağıtık ve mikroservis mimarilerine geçişin kaçınılmaz olduğu günümüz IT ortamlarında, Kubernetes'in sunduğu orkestrasyon yetenekleri kritik öneme sahiptir. Bu rehber, bir Kubernetes kümesinin nasıl kurulacağını ve temel bileşenlerinin ne anlama geldiğini teknik derinliği yüksek bir şekilde ele alacaktır.

Kubernetes Mimarisinin Temelleri

Bir Kubernetes kümesi temel olarak iki ana bileşenden oluşur: Kontrol Düzlemi (Control Plane) ve Çalışma Düğümleri (Worker Nodes). Bu bileşenler birlikte, konteynerlerinizi çalıştırmak ve yönetmek için gereken altyapıyı sağlar.

Kontrol Düzlemi (Control Plane)

Kümenin beyin görevi gören Kontrol Düzlemi, küme durumunu yönetir, kararlar alır ve kümedeki kaynakların istenen durumda tutulmasını sağlar. Başlıca bileşenleri şunlardır:

  • kube-apiserver: Kubernetes API'sini sunar. Tüm küme etkileşimleri bu bileşen üzerinden gerçekleşir. RESTful API isteklerini işler ve doğrular.
  • etcd: Kümenin tutarlı ve yüksek erişilebilir birincil veri deposudur. Tüm küme verilerini (yapılandırma, durum, meta veri) JSON formatında saklar. Güvenilirliği kritik öneme sahiptir.
  • kube-scheduler: Yeni oluşturulan Pod'ları hangi Çalışma Düğümünde çalıştıracağına karar verir. Kaynak gereksinimleri, kısıtlamalar, öncelikler gibi faktörleri göz önünde bulundurur.
  • kube-controller-manager: Çeşitli kontrol döngülerini çalıştırır. Örneğin, Node Controller kümedeki düğümleri izler, Replication Controller Pod sayısını istenen sayıda tutar.
  • cloud-controller-manager: Bulut sağlayıcısına özgü kontrol mantığını içerir. Örneğin, bulut sağlayıcısının yük dengeleyicileri veya depolama birimleri ile etkileşim kurar.

Çalışma Düğümleri (Worker Nodes)

Çalışma Düğümleri, kümenin iş yüklerini (uygulamalarınızı barındıran Pod'lar) çalıştıran makinelerdir (fiziksel veya sanal). Her Çalışma Düğümünde aşağıdaki bileşenler bulunur:

  • kubelet: Her düğümde çalışan bir ajandır. API sunucusundan Pod ve Konteyner tanımlarını alır ve bu konteynerlerin çalıştığından emin olur.
  • kube-proxy: Düğümdeki ağ kurallarını yönetir ve Pod'lara ağ iletişimi sağlar. Servis soyutlamasını gerçekleştirir.
  • Container Runtime: Konteynerleri çalıştırmaktan sorumlu yazılımdır. Docker, containerd, CRI-O gibi örnekleri vardır.

Kubernetes Küme Kurulumu: Kubeadm ile Pratik Bir Yaklaşım

Kubernetes kümesi kurmanın birçok yolu vardır. AWS EKS, GKE gibi yönetilen servisler veya kops, kubespray gibi araçlar kullanılabilir. Ancak, temel prensipleri anlamak için kubeadm aracı ile manuel kurulum yapmak faydalıdır. Bu araç, küme bileşenlerini başlatmak için en iyi uygulamaları takip eder.

Ön Gereksinimler

  • En az iki Linux makinesi (bir kontrol düzlemi, bir veya daha fazla çalışma düğümü).
  • Makinelere SSH erişimi.
  • Her makinede Docker veya başka bir konteyner çalışma zamanı kurulu olmalı.
  • kubeadm, kubelet ve kubectl araçlarının kurulumu.

Kontrol Düzlemi Başlatma (Master Node)

Kontrol Düzlemi düğümünde aşağıdaki komutu çalıştırın:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Bu komut, Kontrol Düzlemi bileşenlerini başlatır ve etcd'yi yapılandırır. Komutun çıktısı, Çalışma Düğümlerini kümele eklemek için kullanılacak bir kubeadm join komutu içerir. Ayrıca, kubectl'i kullanabilmek için gerekli yapılandırma dosyalarını oluşturmanız gerekir:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Ağ Eklentisi (CNI) Kurulumu

Kubernetes Pod'larının birbirleriyle ve dış dünya ile iletişim kurabilmesi için bir Container Network Interface (CNI) eklentisi gereklidir. Popüler seçeneklerden biri Calico'dur:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

Bu komut, Calico Pod'larını kümele dağıtır ve ağ politikasını yapılandırır.

Çalışma Düğümü Ekleme (Worker Node)

Kontrol Düzlemi başlatıldıktan sonra, kubeadm init komutunun çıktısında size verilen kubeadm join komutunu her Çalışma Düğümünde çalıştırın. Örneğin:

sudo kubeadm join :6443 --token  \
    --discovery-token-ca-cert-hash sha256:

Bu komut, Çalışma Düğümünü kümele kaydeder ve kubelet'in Kontrol Düzlemi ile iletişim kurmasını sağlar.

Temel Kubernetes Kavramları ve Production Senaryoları

Pod'lar

Pod, Kubernetes'teki en küçük dağıtım birimidir. Bir veya daha fazla konteyner, depolama kaynakları ve ağ IP'sini paylaşan bir gruptur. Genellikle tek bir uygulama bileşeni bir Pod içinde çalışır.

Production Senaryosu: Bir web uygulamasının ön yüz (frontend) sunucusu bir Pod içinde çalışırken, arka plan işleyicisi (worker) ayrı bir Pod içinde çalışabilir. İki Pod aynı ağ ad alanını paylaştığı için birbirleriyle localhost üzerinden iletişim kurabilirler.

Deployments

Deployments, Pod'ların ve ReplicaSet'lerin deklaratif güncellenmesini sağlar. Bir Deployment tanımlayarak, istediğiniz sayıda Pod replikasını çalıştırabilir, rolling update'ler gerçekleştirebilir ve rollback yapabilirsiniz.

Production Senaryosu: Bir web servisinin yeni bir sürümünü yayınlarken, Deployment kullanarak eski Pod'ları kademeli olarak yeni Pod'larla değiştirebilirsiniz. Bu sayede uygulama kesintiye uğramaz. Örneğin, 10 replikadan oluşan bir Deployment'ta, her seferinde 2 Pod güncellenir ve sonraki güncelleme için önceki 2 Pod'un sağlıklı çalıştığı doğrulanır.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web-container
        image: nginx:latest
        ports:
        - containerPort: 80

Services

Services, Pod'lara erişim sağlayan bir soyutlamadır. Pod'lar geçici olabilir (yeniden başlatıldıklarında IP'leri değişebilir), ancak bir Service, sabit bir IP adresi ve DNS adı ile Pod'lara erişimi garanti eder. LoadBalancer, NodePort, ClusterIP gibi farklı Service türleri bulunur.

Production Senaryosu: Web uygulamanızın ön yüz Pod'larına dışarıdan erişim sağlamak için bir LoadBalancer tipi Service kullanabilirsiniz. Kubernetes, bulut sağlayıcınızda (AWS, GCP, Azure) bir yük dengeleyici oluşturacak ve trafiği Pod'larınıza yönlendirecektir. İç servisler arasındaki iletişim için ClusterIP tipi Service'ler kullanılır.


apiVersion: v1
kind: Service
metadata:
  name: my-webapp-service
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Namespaces

Namespaces, bir küme içindeki kaynakları mantıksal olarak ayırmak için kullanılır. Farklı ekiplerin veya projelerin kaynaklarını izole etmeye yardımcı olur.

Production Senaryosu: Bir şirkette, geliştirme (dev), test (staging) ve üretim (prod) ortamları için ayrı Namespaceler oluşturulabilir. Bu, kaynakların çarpışmasını önler ve güvenlik politikalarını uygulamayı kolaylaştırır.

ConfigMaps ve Secrets

ConfigMaps, uygulamanızın yapılandırma verilerini Pod'lardan ayırmak için kullanılır. Secrets ise hassas bilgileri (parolalar, API anahtarları, sertifikalar) depolamak için kullanılır.

Production Senaryosu: Bir veritabanı bağlantı dizesini doğrudan uygulama imajına yerleştirmek yerine, bir Secret içine koyup Pod'unuza ortam değişkeni veya dosya olarak enjekte edebilirsiniz. Bu, güvenliği artırır ve yapılandırmayı kolayca güncelleyebilmenizi sağlar.

Sonuç

Kubernetes, modern uygulama dağıtımları için güçlü bir orkestrasyon platformudur. Bu rehberde, küme mimarisini, temel bileşenleri ve kubeadm ile basit bir kurulum süreci ele alındı. Pod'lar, Deployments, Services gibi temel kavramlar ve bunların gerçek dünya senaryolarındaki uygulamaları açıklanmıştır. Kubernetes'in sunduğu otomasyon ve esneklik, büyük ölçekli ve dağıtık sistemlerin yönetimini önemli ölçüde kolaylaştırmaktadır.

← Blog Listesine Dön