Kubernetes Namespace ile Multi-Tenant Ortam Yönetimi

Kubernetes Namespace ile Multi-Tenant Ortam Yönetimi

Tek bir Kubernetes cluster'ını birden fazla ekip, proje veya müşteri arasında paylaştırmak maliyet avantajı sağlar ancak izolasyon olmadan güvenlik ve kaynak çakışmaları kaçınılmazdır. Namespace'ler mantıksal bölümleme sunar; ResourceQuota, LimitRange, NetworkPolicy ve RBAC ile bu bölümleri güvenli

Tek bir Kubernetes cluster'ını birden fazla ekip, proje veya müşteri arasında paylaştırmak maliyet avantajı sağlar ancak izolasyon olmadan güvenlik ve kaynak çakışmaları kaçınılmazdır. Namespace'ler mantıksal bölümleme sunar; ResourceQuota, LimitRange, NetworkPolicy ve RBAC ile bu bölümleri güvenli ve kontrollü hale getirirsiniz. Bu rehberde multi-tenant Kubernetes ortamını adım adım kuruyoruz.

Namespace Temelleri

Namespace, cluster kaynaklarını mantıksal gruplara ayırır. Her namespace kendi Pod, Service, ConfigMap ve Secret nesnelerine sahiptir. Varsayılan olarak Kubernetes dört namespace ile gelir: default, kube-system, kube-public ve kube-node-lease.

namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: team-frontend
  labels:
    team: frontend
    environment: production
---
apiVersion: v1
kind: Namespace
metadata:
  name: team-backend
  labels:
    team: backend
    environment: production

ResourceQuota ile Kaynak Sınırlama

ResourceQuota, bir namespace'in tüketebileceği toplam CPU, bellek ve nesne sayısını sınırlar. Bir ekibin cluster kaynaklarını tüketmesini engelleyerek diğer ekiplerin etkilenmesini önler.

resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-frontend-quota
  namespace: team-frontend
spec:
  hard:
    requests.cpu: "8"
    requests.memory: 16Gi
    limits.cpu: "16"
    limits.memory: 32Gi
    pods: "50"
    services: "20"
    persistentvolumeclaims: "10"

LimitRange ile Pod Bazlı Sınırlar

ResourceQuota namespace toplamını sınırlarken, LimitRange tek bir Pod veya container'ın kullanabileceği kaynakları sınırlar. Ayrıca resource request/limit belirtmeyen container'lara varsayılan değerler atar.

limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: container-limits
  namespace: team-frontend
spec:
  limits:
  - type: Container
    default:
      cpu: "500m"
      memory: "256Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "50m"
      memory: "64Mi"

NetworkPolicy ile Ağ İzolasyonu

Varsayılan olarak tüm namespace'ler birbirleriyle iletişim kurabilir. NetworkPolicy ile namespace'ler arası trafiği kısıtlayarak gerçek izolasyon sağlarsınız.

network-policy.yaml
# Yalnizca ayni namespace icinden trafige izin ver
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-namespace
  namespace: team-frontend
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          team: frontend

⚠️ Önemli: NetworkPolicy'nin çalışması için cluster'da Calico, Cilium veya Weave gibi NetworkPolicy destekleyen bir CNI eklentisi kurulu olmalıdır. Flannel varsayılan olarak NetworkPolicy desteklemez.

RBAC ile Erişim Kontrolü

Role ve RoleBinding ile her ekibin yalnızca kendi namespace'indeki kaynaklara erişmesini sağlarsınız.

rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
  namespace: team-frontend
rules:
- apiGroups: ["", "apps"]
  resources: ["pods", "deployments", "services", "configmaps"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: frontend-developers
  namespace: team-frontend
subjects:
- kind: Group
  name: frontend-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

Kubernetes temel kavramları için Kubernetes Giriş rehberimizi, otomatik ölçekleme için HPA rehberimizi inceleyin. Ağ güvenliği için Zero Trust rehberimize göz atın. Kubernetes multi-tenancy dokümantasyonu ve ResourceQuota rehberi ek kaynak olarak faydalıdır.

Sıkça Sorulan Sorular

Namespace gerçek izolasyon sağlar mı?

Namespace tek başına yalnızca mantıksal ayrım sağlar. Gerçek izolasyon için ResourceQuota, LimitRange, NetworkPolicy ve RBAC birlikte uygulanmalıdır. Tam izolasyon gerekiyorsa ayrı cluster'lar veya vCluster gibi sanal cluster çözümleri değerlendirin.

Kaç namespace oluşturmalıyım?

Ekip veya proje başına bir namespace yaygın bir yaklaşımdır. Ortam bazlı (dev/staging/prod) ayrım da eklenebilir. Çok fazla namespace yönetim karmaşıklığı yaratır; 10-50 arası çoğu organizasyon için yeterlidir.

Namespace'ler arası iletişim nasıl sağlanır?

Farklı namespace'lerdeki servisler service-name.namespace.svc.cluster.local DNS adresiyle erişilebilir. NetworkPolicy ile hangi namespace'lerin iletişim kurabileceğini kontrol edin.

ResourceQuota aşılırsa ne olur?

Kota aşıldığında yeni Pod oluşturma istekleri reddedilir. Mevcut Pod'lar etkilenmez. Kota kullanımını kubectl describe quota -n namespace ile izleyin ve gerektiğinde artırın.

Sonuç

Kubernetes Namespace ile multi-tenant ortam kurmak mantıksal ayrımla başlar, ResourceQuota ile kaynak sınırlama, NetworkPolicy ile ağ izolasyonu ve RBAC ile erişim kontrolü ile tamamlanır. Her katmanı birlikte uygulayarak güvenli ve kontrollü bir paylaşımlı cluster ortamı oluşturun.

Multi-Tenant Kubernetes Altyapısı

Hosted Cloud bulut sunucuları ile güvenli ve izole Kubernetes ortamınızı kurun.

Bulut Sunucu Planlarını İncele →
M

Merve Arslan

WordPress & Hosting Uzmanı

WordPress performans optimizasyonu, hosting seçimi ve e-ticaret altyapıları üzerine rehber içerikler hazırlamaktadır.

Yorumlar yakında