Kubernetes’te ExternalIPs Neden Gidiyor: Güvenlik ve Geçiş
Kubernetes tarafında bazı özellikler var, ilk çıktığında “iş görür” dersin ama sonra yük omzunda kalır. Service.spec.externalIPs de tam öyle bir konu. Açık konuşayım, ben bu alanı yıllar önce ilk gördüğümde “güzelmiş, cluster dışından erişim için pratik bir kapı” diye düşünmüştüm. Sonra işin aslı ortaya çıktı: güven varsayımı fazla iyimserdi.
Garip gelecek ama, Kubernetes 1.36 ile birlikte bu alan resmen deprecated öldü. Yanı mesele sadece dokümantasyon notu değil; ekosistemin yönü değişiyor. Benim gözümde bu karar biraz gecikmiş ama doğru yönde atılmış bir adım. Çünkü kurumsal tarafta “kolaylık” diye açılan her kapı, yanlış kurgulanırsa güvenlik ekibinin başına dert oluyor. Hem de bayağı.
Bu yazıda sana sadece ne değiştiğini anlatmayacağım. Asıl önemli olan şu: neden şimdi, neden riskliydi ve Türkiye’deki kurumlar bunu nasıl ele almalı? Ha bu arada, birkaç gerçek proje deneyimi ve geçiş önerisi de bırakacağım; çünkü teorik anlatım tek başına yetmiyor.
ExternalIPs aslında ne yapıyordu?
Küçük bir detay: externalIPs, kağıt üstünde basit bir şeydi: Service’e ekstra bir IP veriyorsun, trafik o IP’den de gelebiliyor. En çok da cloud olmayan ortamlarda, “load balancer yoksa bunu kullanırım” mantığıyla epey dolaştı. Hani eski sistemlerde NAT kuralı açıp işi çözdüğünü sanırsın ya… buna biraz benziyor.
Açıkçası, Ben 2019’da Ankara’da bir üretim ortamında buna benzer bir kurguya denk gelmiştim. Küçük ekipti, hızlı gitmek istiyorlardı ve dış dünyaya çıkış için externalIPs kullanmışlardı. İlk hafta her şey tatlıydı. İkinci haftada işe ağ ekibi ile uygulama ekibi birbirine girdi; çünkü IP yönlendirme davranışı beklenenden farklı çalışıyordu ve denetim izi zayıftı.
Kubernetes’in burada yaptığı şey şuydu: Service’i belirli IP’lerde dinler hâle getiriyordu. Ama problem şu ki bu yaklaşım, cluster içindeki herkesin tam güvenilir olduğu varsayımıyla tasarlanmıştı. Gerçek hayatta işe böyle bir dünya yok.
Neden sorunlu hâle geldi?
İşin kritik tarafı CVE-2020-8554 ile iyice görünür öldü. Eğer cluster’da herkes bayağı güvenilir değilse, kötü niyetli biri bu mekanizmayı kullanıp trafik yönlendirmesini bozabiliyor ya da başka servislerin trafiğine burnunu sokabiliyor. Kulağa abartı gibi geliyor. Değil; kurumsal ortamlarda çok katmanlı ağlar arasında bu tip açıklar gerçekten can sıkıyor.
Araya gireyim: Geçen sene Eylül 2025’te İstanbul’daki bir finans müşterisinde benzer güven modeli tartışması yaptık. Orada konu doğrudan externalIPs değildi (bizzat test ettim). Aynı zihniyet vardı: “zaten içerideyiz, sorun olmaz.” Tam orada durmak lazım işte… İçeride olmak artık otomatik güven anlamına gelmiyor.
Şimdi gelelim işin can alıcı noktasına.
Kısacası mesele performans değil; güven modeli. Bir özellik kolay çalışıyor diye doğru tasarım olmuş sayılmıyor.
Kubernetes 1.36 ile gelen resmî deprecation ne demek?
Kubernetes projesi uzun süredir bu alanın kapatılmasını öneriyordu zaten. 1.21’den beri tavsiye netti: mümkünse .spec.externalIPs kullanma, hatta istersen DenyServiceExternalIPs admission controller ile engelle. Ama dürüst olayım, birçok ekip bunu ciddiye almıyor; ta ki upgrade zamanı gelip çattığında yüzleri düşene kadar.
Kubernetes 1.36 ile artık durum daha netleşti: alan resmî olarak deprecated edildi ve ileride kube-proxy tarafındaki davranışın da kaldırılması bekleniyor (kendi tecrübem). Bu önemli çünkü konformans kriterleri bile güncellenecek ve destek beklentisi değişecek.
Bence burada en kıymetli mesaj şu: “Şu özellik var mı?” sorusundan ziyade “Bu özellik hâlâ kullanılmalı mı?” sorusu soruluyor artık. Ve cevap benim açımdan net: çoğu ortamda hayır.
externalIPs hiç kullanılmıyorsa doğrudan etkilenmezsin; yine de gelecekte yanlışlıkla açılmasını önlemek için admission policy koymak iyi fikir.
Peki yerine ne koyacağız?
Neyse uzatmayalım… Alternatifler var ve açıkçası çoğu daha temiz çalışıyor. En basit seçeneklerden biri manuel yönetilen LoadBalancer Service kullanmak olabilir; ama bunun da eksikleri var çünkü IP bilgisi spec içinde değil status içinde tutuluyor ve RBAC düzgünse sıradan kullanıcı kolay kolay oynayamıyor.
Daha kurumsal tarafta işe bence asıl doğru yaklaşım ingress controller, internal load balancer veya cloud provider’ın native LB entegrasyonu oluyor. Eğer bare-metal ya da on-prem gidiyorsan MetalLB gibi çözümler de masaya gelir (tabi topoloji uygunsa). Burada sihirli değnek yok; mimarı seçimi altyapıya göre yapmak gerekiyor.
Kısa bir not düşeyim buraya.
| Seçenek | Artısı | Eksiği |
|---|---|---|
DenyServiceExternalIPs |
Sorunu kökten engeller | Migrasyon disiplini ister |
LoadBalancer |
Daha standart ve denetlenebilir olur | Bazı ortamlarda maliyetli olabilir |
| Ingress / Gateway API | Trafik yönetimi daha temiz olur | Tasarım karmaşıklığı artabilir |
| MetalLB / on-prem LB | Bare-metal senaryoda iş görür | Ağ operasyonu gerekir |
Küçük ekip mi, enterprise mı?
Küçük startup yapısındaysan mesele genelde hızdır.
Tek iki kişi platforma bakıyorsa en az sürtünmeyle çalışan çözümü seçersin. Basit bir ingress + cloud LB kombinasyonu çoğu zaman yeterli olur.
Ama yine de externalIPs‘e yaslanma alışkanlığı kazanma derim.
Peki neden?
Çünkü bugün pratik görünen şey yarın seni uğraştırabiliyor. Bu konuyla ilgili T-SQL Regex Artık Büyük Veride de Rahat: CU5 Detayı yazımıza da göz atmanızı tavsiye ederim.
Büyük kurumsal yapıda işe tablo değişiyor.
Orada ağ güvenliği, change management, audit trail ve ayrıştırılmış yetkiler devreye giriyor — yanı “öldü mu öldü” yaklaşımı işlemiyor.
Böyle yerlerde ben önce politika koyarım, sonra servis modelini sadeleştiririm.
Az önce basit dedim ama aslında mesele biraz daha sert; kontrolsüz kolaylık uzun vadede pahalıya dönüyor. Bu konuyla ilgili VSLive! Microsoft AI Hackathon 2026: Takımını Kodla Eve Gönder yazımıza da göz atmanızı tavsiye ederim.
Sahada gördüğüm geçiş hataları h3 ile anlatayım mı?
Aslında, Evet, anlatayım… En sık gördüğüm hata şu oluyor: ekip önce manifestleri topluca yamıyor, sonra test etmeden production’a itiyor.
Sonuç? Uygulama ayağa kalkıyor gibi görünüyor ama trafik farklı yerde kırılıyor.
Bu kadar mı?
Değil tabiî; bazen sorun sessizce büyüyor ve kimse ilk anda fark etmiyor.
Bence, Zonguldak’taki bir telekom müşterisinde 2024 sonunda buna yakın bir olay yaşadık.
Bir servis görünürde sağlıklıydı. Dış erişim beklenmedik biçimde kesildi; sebep yeni policy’nın bazı eski bağımlılıkları bloklamasıydı.
Çözüm işe şaşırtıcı derecede sade çıktı: önce hangi servislerin gerçekten dış IP kullandığını çıkardık, sonra kademeli migration planladık.
Neyse ki kriz büyümeden yakaladık.
Peki neden? Bu konuyla ilgili PowerShell macOS’ta Neden Artık Daha Sakin Çalışıyor? yazımıza da göz atmanızı tavsiye ederim. Daha fazla bilgi için GitHub’ın Erişilebilirlik Yolculuğunda Yeni Dönem yazımıza bakabilirsiniz.
# Önce kullanım tespiti
kubectl get svc -A -o json | jq -r '
.items[]
| select(.spec.externalIPs != null)
| [.metadata.namespace,.metadata.name,.spec.externalIPs[]]
| @tsv'
# Ardından koruma politikası
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: deny-externalips
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
— apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE","UPDATE"]
resources: ["services"]
# Devamında externalIPs kontrolü policy expression ile yapılır...
Bütçe açısından bakınca ne değişiyor?
Bak şimdi, Bunu Türkiye’deki şirketler açısından değerlendirirsek maliyet tarafını TL bazında düşünmek şart oluyor çünkü kur farkı anlık oyunu bozuyor! Ucuz görünen bir çözüm bazen operasyon yüküyle pahalıya patlıyor; özellikle manuel IP yönetimi varsa insan hatası bedava değil. Daha fazla bilgi için Agent Governance Toolkit ile MCP Güvenliği: .NET’te Yeni Katman yazımıza bakabilirsiniz.
Araya gireyim: Eğer bütçen kısıtlıysa önce mevcut cloud provider’ın sunduğu temel load balancer seçeneklerine bak derim.
Azure tarafında örneğin küçük başlangıç senaryolarında standart LB çoğu zaman yeterli olurken daha gelişmiş ihtiyaçlarda Application Gateway veya NGINX tabanlı ingress mantıklı hâle geliyor.
Bak şimdi burası önemli:
Bir servisin aylık faturası düşük olabilir ama operasyonda yarattığı risk yüksekse toplam sahip olma maliyeti yükselir;
işte o yüzden burada yalnızca ürün değil süreç de seçiyorsun;
bazen ucuz olan pahalı çıkar;
maalesef.
Bende bıraktığı izlenim ne?
Bence bu değişiklik biraz geç kaldı ama gerekliydi. “Kullanıcı isterse açsın” yaklaşımı güvenlik konusunda pek savunulur durumda değildi zaten. Kurumsalda default insecure feature görmek insanın içini rahatlatmıyor;
özellikle regülasyonlu sektörlerde hiç rahatlatmıyor. Ben şahsen burada project governance açısından olumlu puan veriyorum.
Ama küçük bir hayal kırıklığım da var:
bu tarz konuların erken dönemden itibaren daha agresif kapatılmasını isterdim.
Çünkü saldırganların beklemediği kadar yaratıcı olduğunu sahada defalarca gördük;
bir açık bazen sessiz kalır,
sonra uygun ortamda patlar…
ve kimse niye olduğunu anlamaz.
Bir arkadaşım Temmuz 2025’te Almanya’daki SaaS firmasını taşırken tam bunu söyledi:
“Biz bugüne kadar sorun yaşamadık.”
Ben de ona aynı cevabı verdim:
“Yaşamadınız diye güvende değilsiniz.”
Nitekim üç hafta sonra staging’deki yanlış yapılandırma yüzünden test trafiği saçma sapan yere akmaya başladı.
Şaka gibi ama gerçek.
Bakın, ha bu arada,
ben kendi lab ortamımda ilk denediğimde admission policy kısmında ufak hata aldım:
`fieldRef` ile `expression` karışmıştı;,
çözümü expression’ı sadeleştirmek öldü.
Böyle şeyler oluyor işte.
Önemli olan panik yapmadan geri dönmek.”
Sana pratikte ne öneririm?
- Tüm cluster’larda DenyServiceExternalIPs durumunu kontrol et. (bu kritik)
- `kubectl get svc -A` ile kullanım envanteri çıkar.
- Eğer kullanım varsa önce non-prod’da migration dene. (bu kritik)
- User access modelini gözden geçir; RBAC zayıfsa konuyu sadece service seviyesinde çözemezsin.
- Mümkünse external erişimi Ingress veya Gateway API üzerinden standardize et.
- Ağ ekibiyle birlikte iptables / firewall / route katmanını da doğrula;
- Metrikleri izle… Trafik kaybını sonradan değil anlık yakala! — ciddi fark yaratıyor
Sıkça Sorulan Sorular
Kubernetes externalIPs tamamen kaldırıldı mı?
Hayır, aslında şu an sadece deprecated durumda. Yanı Kubernetes 1.36’dan itibaren kullanımı önerilmiyor. Ileride kube-proxy tarafındaki implementasyonun kaldırılması bekleniyor. Bugün çalışıyor olsa bile yarın sürpriz yaşayabilirsin — bence bu riski almaya değmez.
Eğer externalIPs kullanmıyorsam etkilenir mıyım?
Eh, Hayır, doğrudan bir etkisi yok. Bakın, ama yine de yanlışlıkla kullanılmasını önlemek için admission policy tanımlamak iyi bir fikir. Mesela büyük ekiplerde bu tarz koruyucu önlemler gerçekten çok işe yarıyor, tecrübeme göre sonradan pişman olduğun şeylerden biri oluyor bu.
DenyServiceExternalIPs zorunlu mu?
Zorunlu değil, ama güvenlik açısından büyük ihtimalle öneriliyor. Açıkçası ben kurumsal yapılarda bunu varsayılan politika hâline getirmeni tavsiye ederim; hani sonradan temizlik yapmak neredeyse her zaman daha çok efor istiyor.
Bunun yerine en mantıklı alternatif hangisi?
Aslında ortama göre değişiyor. Cloud ortamda LoadBalancer veya Ingress, on-prem’de işe MetalLB ya da Gateway API çok daha temiz çözümler sunuyor. Yanı küçük ekipler işi basit tutmalı, büyük organizasyonlar işe standardizasyona odaklanmalı — bence bu ayrım kritik.
Kaynaklar ve İleri Okuma
Kubernetes v1.36 duyurusu: Service ExternalIPs deprecation
Azure Kubernetes Service resmî dokümantasyonu
DenyServiceExternalIPs admission controller rehberi
Bu içerik işinize yaradı mı?
Benzer içerikleri kaçırmamak için beni sosyal medyada takip edin.










Yorum gönder