spinny:~/writing $ vim introduction-to-kubernetes.md
1~2Yazılım geliştirme dünyasında çalışıyorsanız, Kubernetes'i mutlaka duymuşsunuzdur. Peki tam olarak nedir ve konteynerleştirilmiş uygulamaları yönetmek için neden fiili standart haline geldi? Bu rehber sizi temellerden temel kavramlara, pratik örnekler ve diyagramlarla götürecektir.3~4## Kubernetes'ten Önce: Biraz Tarih5~6Kubernetes'in neden bu kadar devrimci olduğunu anlamak için bir adım geriye gidelim.7~81. **Geleneksel Dağıtım**: Başlangıçta uygulamalar fiziksel sunucularda çalıştırılıyordu. Bu yaklaşım pahalı, ölçeklenmesi zor ve kaynak çatışmalarına açıktı.92. **Sanallaştırılmış Dağıtım**: Sonra Sanal Makineler (VM'ler) geldi. VM'ler aynı donanımda birden fazla izole uygulamanın çalışmasını sağlayarak kaynak kullanımını ve güvenliği iyileştirdi. Ancak her VM tam bir işletim sistemi çalıştırır ve bu çok fazla kaynak tüketir.103. **Konteynerleştirilmiş Dağıtım**: Konteynerler (Docker gibi) bir sonraki evrimdir. Aynı ana bilgisayar işletim sistemini paylaşırlar ancak izole süreçler çalıştırırlar. Hafif, hızlı başlayan ve taşınabilirdirler.11~12Konteynerler taşınabilirlik sorununu çözdü ama başka bir sorun yarattı: üretim ortamında yüzlerce (veya binlerce) konteyneri nasıl yönetirsiniz? Her zaman çalıştıklarından, birbirleriyle iletişim kurabildiklerinden ve yüke göre ölçeklenebildiklerinden nasıl emin olursunuz?13~14İşte **Kubernetes** burada devreye girer.15~16## Kubernetes Nedir?17~18Kubernetes (genellikle **K8s** olarak kısaltılır) konteyner orkestrasyonu için açık kaynaklı bir platformdur. Basit ifadeyle, konteynerleştirilmiş uygulamaların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştirir. Google tarafından oluşturulan ve şu anda Cloud Native Computing Foundation (CNCF) tarafından bakımı yapılan Kubernetes, ölçekte mikroservislerle çalışan herkes için vazgeçilmez araç haline gelmiştir.19~20## Kubernetes Cluster Mimarisi21~22Bir Kubernetes ortamına **cluster** denir. Cluster, uygulamalarımızı çalıştıran **node** adı verilen makinelerden oluşur. Mimari iki ana bölüme ayrılır: Control Plane ve Worker Nodes.23~24```mermaid25graph TD26 subgraph "Control Plane (Master)"27 A["API Server"]28 B["etcd"]29 C["Scheduler"]30 D["Controller Manager"]31 end32~33 subgraph "Worker Node 1"34 E["Kubelet"] --- F["Container Runtime"]35 G["Kube-proxy"]36 F --- H["Pod"]37 F --- I["Pod"]38 end39~40 subgraph "Worker Node 2"41 J["Kubelet"] --- K["Container Runtime"]42 L["Kube-proxy"]43 K --- M["Pod"]44 end45~46 A -- "Communicates with" --> E47 A -- "Communicates with" --> J48 User -- "kubectl" --> A49 C -- "Assigns Pods to Nodes" --> E50 D -- "Maintains state" --> A51 A -- "Saves/Reads state" --> B52```53~54### Control Plane55~56Control Plane, cluster'ın "beynidir". Küresel kararlar alır (zamanlama gibi) ve cluster olaylarını algılar ve yanıt verir. Ana bileşenleri şunlardır:57~58- **API Server (`kube-apiserver`)**: Cluster'ın kapısıdır. Kullanıcılar (`kubectl` aracılığıyla), cluster bileşenleri ve harici araçlar tarafından iletişim kurmak için kullanılan Kubernetes API'sini sunar.59- **etcd**: Tutarlı ve yüksek erişilebilirlikli bir anahtar-değer veritabanıdır. Sistemin istenen ve mevcut durumunu temsil eden tüm cluster verilerini depolar.60- **Scheduler (`kube-scheduler`)**: Yeni oluşturulan Pods'ları kaynak gereksinimleri, politikalar ve diğer kısıtlamaları dikkate alarak uygun bir Worker Node'a atar.61- **Controller Manager (`kube-controller-manager`)**: Cluster'ın durumunu izleyen ve onu istenen duruma getirmek için çalışan kontrol döngüleri olan controller'ları çalıştırır. Örneğin, `Node Controller` node'ları yönetirken, `Replication Controller` doğru sayıda Pod'un çalıştığından emin olur.62~63### Worker Node64~65Worker Nodes, uygulamaların gerçekte çalıştığı makinelerdir (fiziksel veya sanal). Her node Control Plane tarafından yönetilir ve şu bileşenleri içerir:66~67- **Kubelet**: Her node'da çalışan bir ajandır. Pods'ta tanımlanan konteynerlerin çalıştığından ve sağlıklı olduğundan emin olur.68- **Kube-proxy**: Node'larda ağ kurallarını yöneten bir ağ proxy'sidir. Cluster içinden veya dışından Pods'a ağ iletişimini sağlar.69- **Container Runtime**: Konteynerleri çalıştırmaktan sorumlu yazılımdır. Docker en ünlüsüdür, ancak Kubernetes `containerd` ve `CRI-O` gibi diğer runtime'ları da destekler.70~71## Temel Kubernetes Nesneleri72~73Kubernetes'te her şey **nesneler** ile temsil edilir. Bu nesneler "niyet kayıtlarıdır": bir nesne oluşturduğunuzda, Kubernetes sürekli olarak onun var olduğundan ve istenen durumla eşleştiğinden emin olmak için çalışır.74~75İşte en önemlileri:76~77### Pod78~79**Pod**, Kubernetes'teki en küçük yürütme birimidir. Aynı node'da birlikte çalışan, ağ ve depolama gibi kaynakları paylaşan bir veya daha fazla konteyneri temsil eder.80~81Genellikle Pod başına yalnızca bir konteyner çalıştırırsınız, ancak gelişmiş senaryolarda (loglama veya izleme için "sidecar containers" gibi) daha fazlası olabilir.82~83Pod'ları neredeyse hiçbir zaman doğrudan oluşturmazsınız. Deployments gibi daha üst düzey soyutlamalar kullanırsınız.84~85### Deployment86~87**Deployment**, en sık kullanacağınız nesnedir. Bir grup özdeş Pod için istenen durumu tanımlar. Deployment controller şunlardan sorumludur:88~89- Bir **ReplicaSet** oluşturma ve yönetme (bir Pod'un belirli sayıda kopyasının her zaman çalışmasını sağlayan başka bir nesne).90- Pod sayısını artırma veya azaltma olarak **ölçekleme**.91- Uygulama **güncellemelerini** kontrollü bir şekilde yönetme (örneğin, *Rolling Update*), kesinti olmadan.92~933 NGINX sunucu kopyası çalıştıran bir Deployment için örnek YAML dosyası:94~95```yaml96# nginx-deployment.yaml97apiVersion: apps/v198kind: Deployment99metadata:100 name: nginx-deployment101spec:102 replicas: 3103 selector:104 matchLabels:105 app: nginx106 template:107 metadata:108 labels:109 app: nginx110 spec:111 containers:112 - name: nginx113 image: nginx:1.14.2114 ports:115 - containerPort: 80116```117~118### Service119~120Kubernetes'teki Pods geçicidir: herhangi bir zamanda oluşturulabilir ve yok edilebilir. Her Pod'un kendi IP adresi vardır, ancak bu IP kararlı değildir. Peki uygulamamızı güvenilir bir şekilde nasıl sunabiliriz?121~122Bir **Service** ile. Service, bir dizi Pod'un mantıksal kümesini ve erişim politikasını tanımlayan bir soyutlamadır. Bir Pod grubuna **kararlı bir erişim noktası** (sanal bir IP adresi ve bir DNS adı) sağlar.123~124```mermaid125graph TD126 subgraph "Service (nginx-service)"127 A["ClusterIP: 10.96.0.10"]128 end129~130 subgraph "Pods"131 B("Pod 1 - IP: 192.168.1.2")132 C("Pod 2 - IP: 192.168.1.3")133 D("Pod 3 - IP: 192.168.1.4")134 end135~136 A -- "Selector: app=nginx" --> B137 A -- "Selector: app=nginx" --> C138 A -- "Selector: app=nginx" --> D139~140 Client -- "Request to nginx-service" --> A141```142~143Service, trafiği yönlendirmesi gereken Pods'ları bulmak için `labels` tabanlı bir `selector` kullanır.144~145NGINX Deployment'ımız için nasıl bir Service oluşturulur:146~147```yaml148# nginx-service.yaml149apiVersion: v1150kind: Service151metadata:152 name: nginx-service153spec:154 selector:155 app: nginx156 ports:157 - protocol: TCP158 port: 80159 targetPort: 80160 type: ClusterIP # Default - exposes the service only within the cluster161```162~163Farklı Service türleri vardır:164- `ClusterIP`: Servisi cluster-içi bir IP'de sunar (varsayılan).165- `NodePort`: Servisi her Worker Node'da statik bir portta sunar.166- `LoadBalancer`: Bulut sağlayıcısında (örn. AWS, GCP) harici bir yük dengeleyici oluşturur ve servise genel bir IP atar.167~168### Ingress169~170Bir `LoadBalancer` Service harikadır, ancak her servis için bir tane oluşturmak pahalı olabilir. Birden fazla HTTP/HTTPS servisini dış dünyaya sunmak için bir **Ingress** kullanılır.171~172Ingress, harici trafik için "akıllı bir yönlendirici" görevi görür. Host'a (örn. `api.mysite.com`) veya yola (örn. `mysite.com/api`) dayalı yönlendirme kuralları tanımlamanıza olanak tanır.173~174```mermaid175graph LR176 User -- "mysite.com/api" --> Ingress177 User -- "mysite.com/ui" --> Ingress178~179 subgraph "Cluster"180 Ingress -- "/api" --> ServiceA("api-service")181 Ingress -- "/ui" --> ServiceB("ui-service")182~183 ServiceA --> PodA1("API Pod 1")184 ServiceA --> PodA2("API Pod 2")185~186 ServiceB --> PodB1("UI Pod 1")187 ServiceB --> PodB2("UI Pod 2")188 end189```190~191Bir Ingress örneği:192```yaml193# example-ingress.yaml194apiVersion: networking.k8s.io/v1195kind: Ingress196metadata:197 name: example-ingress198spec:199 rules:200 - host: mysite.com201 http:202 paths:203 - path: /api204 pathType: Prefix205 backend:206 service:207 name: api-service208 port:209 number: 8080210 - path: /ui211 pathType: Prefix212 backend:213 service:214 name: ui-service215 port:216 number: 3000217```218~219### Diğer Faydalı Nesneler220~221- **Namespace**: Fiziksel bir cluster içinde "sanal cluster'lar" oluşturmanıza olanak tanır. Ortamları (örn. `development`, `staging`, `production`) veya ekipleri izole etmek için faydalıdır.222- **ConfigMap ve Secret**: Konteyner imajından ayrılmış yapılandırma verilerini ve gizli bilgileri (şifreler veya API anahtarları gibi) yönetmek için.223- **StatefulSet**: Deployment'a benzer, ancak kararlı ağ kimlikleri ve kalıcı depolama gerektiren durum bilgili uygulamalar (veritabanları gibi) için özeldir.224- **PersistentVolume (PV) ve PersistentVolumeClaim (PVC)**: Cluster'daki kalıcı depolamayı yönetmek için.225~226## Sonuç227~228Kubernetes inanılmaz güçlü bir araçtır, ancak öğrenme eğrisi dik olabilir. Bu rehber yalnızca yüzeyi çizmiştir, ancak temel kavramlar hakkında sağlam bir anlayış sağladığını umuyoruz.229~230**Şimdi ne yapmalısınız?**231- **Yerel olarak deneyin**: Bilgisayarınızda bir Kubernetes cluster'ı oluşturmak için [Minikube](https://minikube.sigs.k8s.io/docs/start/) veya [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/) kurun.232- **`kubectl` kullanın**: Cluster ile etkileşim kurmanız için ana aracınız olan `kubectl` komutuyla tanışın. Bu makaledeki NGINX Deployment ve Service'i oluşturmayı deneyin.233- **Resmi öğreticileri keşfedin**: [Kubernetes belgeleri](https://kubernetes.io/docs/tutorials/) örneklerle dolu harika bir kaynaktır.234~235Konteyner orkestrasyonu cloud-native dünyasında temel bir beceridir ve Kubernetes'te ustalaşmak bir olasılıklar dünyası açacaktır. İyi eğlenceler!236~
NORMAL · introduction-to-kubernetes.md [readonly]236 lines · :q to close