D1 — K8s Temel: Pod/Deployment/Service/Ingress (RBAC + NetworkPolicy İlk Günden)#
"K8s'i güvenliksiz öğretmek, reponun kendi eleştirdiği 'güvenliği sona bırakma' hatasını tekrarlamaktır. Bu modül onu tekrarlamaz."
Blok: D — Orkestrasyon · Süre: ~28 saat · Ön koşul: C1, C2
🎯 Bu modülü bitirdiğinde#
- C1'deki image'ı bir Pod/Deployment olarak çalıştırır, Service + Ingress ile dışarı açarsın.
- İlk günden RBAC ile en az yetki ve NetworkPolicy ile trafik kısıtı uygularsın.
- Bir Pod'un neden
Pending/CrashLoopolduğunu daraltıp açıklarsın.
🧠 Niye bu, niye şimdi#
C1'de image'ı paketledin, C2'de pipeline'la ürettin; şimdi o container'ı elle değil, bir orkestratörle çalıştırıyorsun. (Bu modül baştan sona yerelde kind ile çalışır — kind = Kubernetes-in-Docker: Docker konteynerlerinin içinde çalışan yerel tek-makine cluster, bulut/para gerekmez. C3/C4'ün bulut/Terraform'u burada ön koşul değil; istersen sonra bağlarsın.) RBAC ve NetworkPolicy bu modülün sonradan eklenen bölümü değil, ilk günüdür — çünkü güvenlik bir blok değil, bloklara dağılmış bir ipliktir.
🌉 Köprü: Pod → Deployment → Service → Ingress + RBAC + NetworkPolicy#
05-Kubernetes/ ve 08-Security/ dokümanları bu kavramları bildiğini varsayar. Kısa tanımlar — gerisi lab'da:
- Pod: K8s'in çalıştırdığı en küçük birim; içinde bir (bazen birkaç) container. Kısa ömürlüdür — ölür, yeni bir IP'yle yeniden doğar. Bu yüzden bir Pod'a doğrudan bağlanmazsın.
- Deployment: "Şu image'dan hep N kopya ayakta olsun" der. Pod ölürse yenisini açar; güncellemede eskiyi yenisiyle yavaşça değiştirir (rolling update).
- Service: Değişen Pod IP'lerinin önünde sabit bir iç adres. "Hangi Pod'a?" sorusunu
label selectorile çözer — bu yüzden yanlış label = trafik gitmez. - Ingress: Cluster dışından gelen HTTP(S) trafiğini bir Service'e yönlendiren kural; TLS sonlandırma genelde burada olur. Kural tek başına yetmez — trafiği fiilen karşılayan bir ingress controller (ör. ingress-nginx) cluster'da kurulu olmalı; yoksa kural yazılıdır ama kimse uygulamaz.
- RBAC (Role-Based Access Control): kim neyi yapabilir. Bir Role izinleri (kaynak + fiil, ör. "pod oku") tanımlar, RoleBinding onu bir kullanıcı/ServiceAccount'a bağlar. İlke: en az yetki — sadece işe yarayanı ver,
cluster-admindağıtma. - NetworkPolicy: Pod'lar arası ağ trafiği için güvenlik duvarı kuralı. Varsayılan olarak K8s'te her Pod her Pod'a erişir; default-deny ile önce hepsini kes, sonra yalnız gereken akışı açıkça aç.
Bu zincir kırılırsa (yanlış selector, eksik Ingress kuralı) uygulama "çalışıyor ama erişilemiyor" olur — K04 kırık lab'ının tam senaryosu.
📖 Önce oku#
| Kaynak | Ne için | Süre |
|---|---|---|
08-Security/Kubernetes-Hardening.md | RBAC, NetworkPolicy, PSS — ilk günden | ~40 dk |
05-Kubernetes/Debugging-Pods.md | Pod arızası daraltma | ~25 dk |
🔨 Lab#
👉 labs/build/L13-k8s-temel/ — yerel: kind/k3s.
💥 Kırık lab#
👉 labs/broken/K04-imagepullbackoff-rbac/ — Belirti: "Pod'lar ayağa kalkmıyor / erişilemiyor." (Gerçekçi sebep gizli: ImagePullBackOff / yanlış label selector / RBAC forbidden / NetworkPolicy engeli.)
✅ Kabul kriterleri#
Hepsi doğrulanmadan sonraki modüle geçme: - [ ] image bir Deployment olarak çalışıyor; Service + Ingress üzerinden dışarıdan erişiliyor — kubectl get / curl kanıtı - [ ] En az yetkili bir RBAC Role/RoleBinding + bir NetworkPolicy uygulanmış; yetkisiz erişimin reddedildiği gösteriliyor - [ ] bash labs/broken/K04-imagepullbackoff-rbac/verify.sh çözümden sonra sıfır hatayla geçiyor - [ ] Bir Pod'un Pending/CrashLoopBackOff olma sebebini üç komutla daraltabiliyorsun
🧪 Kendini test et#
- Bir Pod
Pendingdurumunda. Dokümana bakmadan ilk üç kontrolün ne? - Service var, Pod'lar ayakta ama trafik gitmiyor. En olası sebep ne?
- Yeni bir ekip üyesine cluster erişimi vereceksin. Niçin
cluster-adminyerine dar bir Role verirsin?
Cevaplar
1. (a) `kubectl describe pod🆘 Takıldıysan#
| Belirti | Muhtemel sebep | Ne yap |
|---|---|---|
ImagePullBackOff | Yanlış image adı/tag ya da registry auth | kubectl describe pod events; tag'i ve pull secret'ı doğrula |
Pod Pending kalıyor | Node kaynağı yok / scheduling kısıtı | describe events; node Allocatable; taint/toleration kontrol et (taint = node'un "beni seçme" işareti, toleration = Pod'un yine de seçilebilme izni — Glossary.md) |
| Service'e trafik gitmiyor | Selector Pod label'larıyla uyuşmuyor | kubectl get endpoints <svc> boş mu; label'ları eşitle |
kubectl "forbidden" | RBAC yetkisi yok | kubectl auth can-i ...; gereken fiil/kaynağı dar bir Role'e ekle |
| NetworkPolicy sonrası bağlantı koptu | Politika gereken trafiği de kesti | Önce default-deny, sonra gereken akışı açıkça izin ver |
💼 Portfolyo çıktısı#
kind/k3s üzerinde RBAC + NetworkPolicy ile çalışan bir uygulama manifest seti.
⏭️ Sırada#
"RBAC'siz ve NetworkPolicy'siz bir 'çalışan cluster', sadece henüz istismar edilmemiş bir cluster'dır."