Kubernetes'te uygulama dağıtma

Bu pratik rehberle ilk uygulamanızı Kubernetes üzerinde dağıtın: Deployment ve Service oluşturmaktan, uygulamayı NodePort ve Ingress ile dışarıya açmaya kadar.

6 dk Güncellendi 24 Sep 2026

Kubernetes Dağıtımı: Sıfırdan İlk Canlı Uygulamaya

Uygulamanızı daha önce bir sanal sunucuda veya VPS'te çalıştırdıysanız, ölçek yönetiminin, güncellemelerin ve hataların ne kadar yıpratıcı olabileceğini bilirsiniz. Kubernetes (Kubernetes) bu denklemi değiştirir: siz uygulamanızın nasıl görünmesi gerektiğini tanımlarsınız ve Kubernetes sistemi bu duruma getirme ve orada tutma sorumluluğunu üstlenir. Ancak birçok geliştirici için başlangıç noktası belirsizdir: tam olarak nereden başlamalı? Bu makalede, ilk uygulamanızın Kubernetes dağıtımı için pratik ve detaysız bir yol çiziyoruz — Deployment oluşturmaktan servisi küme dışına açmaya kadar.

Kullanılabilir bir Kubernetes kümeniz olduğunu varsayıyoruz (Minikube ile yerel veya bir bulut kümesi) ve kubectl aracının sisteminize kurulu ve kümeye bağlı olduğunu varsayıyoruz. Kümeniz yoksa, minikube start başlamak için en hızlı yoldur. Bu makaledeki tüm örnekler, konunun özüne odaklanmanız için basit bir Nginx uygulamasıyla çalışır.

Adım Bir: Deployment Oluşturma — Kubernetes Dağıtımının Kalbi

Kubernetes'te doğrudan konteyner çalıştırmazsınız; bunun yerine uygulamanızın istenen durumunu tanımlayan bir Deployment tanımlarsınız. Deployment otomatik olarak belirli sayıda Pod'u canlı tutan bir ReplicaSet oluşturur. Bir Pod ölürse, ReplicaSet hemen yeni bir Pod ile değiştirir.

deployment.yaml adında bir dosya oluşturun:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"

Bu dosyanın temel noktaları:

  • replicas: 3 — yani uygulamanın her zaman üç kopyası çalışıyor olmalı.
  • selector.matchLabels — Deployment'ın hangi Pod'ları yöneteceğini belirler. Bu etiket, Pod şablonunun (template) etiketiyle aynı olmalıdır.
  • resources — minimum ve maksimum kaynakları belirlemek, Kubernetes'in Pod'ları düğümler üzerinde daha akıllıca dağıtmasına yardımcı olur. 100m sayısı 0.1 CPU çekirdeği anlamına gelir.

Bu dosyayı kümeye uygulamak için:

kubectl apply -f deployment.yaml

Durumu kontrol edin:

kubectl get deployments
kubectl get pods

Birkaç saniye sonra, Running durumunda üç Pod görmelisiniz. Pod'lardan birini kasıtlı olarak silerseniz (kubectl delete pod <pod-adı>), Kubernetes hemen yeni bir Pod oluşturur — bu kendi kendini iyileştirmenin gücüdür.

Yaygın Hata: selector'ı Unutmak

Kubernetes dağıtımında en yaygın hatalardan biri, selector.matchLabels ile Pod şablonunun etiketleri arasındaki uyumsuzluktur. Bu ikisi eşleşmezse, Deployment oluşturulur ancak hiçbir Pod'u yönetmez. Hataları her zaman kubectl describe deployment nginx-deployment ile kontrol edin.

Adım İki: Service Oluşturma — Pod'lara Açılan Kapı

Kubernetes'te Pod'lar geçicidir ve IP'leri her oluşturulduklarında değişir. Uygulamanızın sabit bir adrese sahip olması için bir Service'e ihtiyacınız vardır. Service, trafiği bir dizi Pod arasında dağıtan soyut bir katmandır.

service.yaml dosyasını oluşturun:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Bu tanımda:

  • selector — Service'in hangi Pod'lara trafik göndereceğini belirtir (burada app: nginx etiketine sahip tüm Pod'lar).
  • port — Service'in erişilebilir olduğu port.
  • targetPort — konteynerin gerçekten dinlediği port.
  • type: ClusterIP — Service'in yalnızca küme içinden erişilebilir olduğu anlamına gelir. Bu varsayılan ve en güvenli seçenektir.

Uygulayın:

kubectl apply -f service.yaml
kubectl get services

Artık küme içinden nginx-service adresiyle uygulamaya erişebilirsiniz. Hızlı bir test için geçici bir Pod kullanın:

kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://nginx-service

Nginx'ten HTML yanıtı alırsanız, Service doğru çalışıyor demektir.

Yaygın Hata: targetPort'ta Yanlışlık

Uygulamanız 8080 portunda dinliyorsa ancak targetPort'u 80 yaptıysanız, Service oluşturulur ancak hiçbir yanıt alamazsınız. targetPort'u her zaman konteynerin gerçek portuna göre ayarlayın, isteğe bağlı bir porta değil.

Adım Üç: Uygulamayı Küme Dışına Açma

Şu ana kadar uygulama yalnızca küme içinden erişilebilir. Dış kullanıcıların bağlanabilmesi için üç ana seçeneğiniz var:

Seçenek 1: NodePort — Test İçin Hızlı

Service türünü NodePort olarak değiştirerek, Kubernetes her düğümde 30000-32767 aralığında bir port açar ve bu porttaki trafiği Service'e yönlendirir.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service-nodeport
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080
  type: NodePort

Uyguladıktan sonra, dışarıdan http://<düğüm-IP>:30080 adresiyle erişilebilir. Bu yöntem hızlı testler için harikadır ancak üretim (Production) için uygun değildir, çünkü portlar sınırlıdır ve yönetimi zordur.

Seçenek 2: LoadBalancer — Bulut İçin Uygun

Bulut kümelerinde (GKE, EKS veya AKS gibi), türü LoadBalancer olarak değiştirmek, bulut sağlayıcısının genel IP'ye sahip gerçek bir Load Balancer oluşturmasını sağlar:

spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80

Birkaç dakika sonra, kubectl get svc doğrudan tarayıcıdan erişebileceğiniz bir EXTERNAL-IP gösterir. Bu yöntem basit genel servisler için uygundur.

Seçenek 3: Ingress — Akıllı Yönlendirme

Birden fazla servisiniz varsa ve trafiği alan adı veya yol bazında yönlendirmek istiyorsanız, Ingress en iyi seçimdir. Ingress, HTTP yönlendirme kurallarını yöneten küme düzeyinde bir giriş katmanıdır. Önce bir Ingress Controller kurmanız gerekir (NGINX Ingress Controller veya Traefik gibi). Ardından bir Ingress kaynağı tanımlarsınız:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

Bu tanımla, app.example.com'a gelen tüm trafik nginx-service'e yönlendirilir. Ingress ayrıca spec içinde tls tanımlayarak SSL/TLS yönetimini de üstlenir.

Yaygın Hata: Ingress Controller'ı Unutmak

Birçok yeni geliştirici Ingress kaynağını tanımlar ancak Ingress Controller kurmayı unutur. Controller olmadan Ingress kaynağının hiçbir etkisi yoktur. Ingress tanımlamadan önce mutlaka Controller'ı kurun ve çalıştırın.

Adım Dört: Güncelleme ve Önceki Sürüme Dönüş

Kubernetes dağıtımının ana avantajlarından biri kesintisiz güncellemedir (Rolling Update). Nginx sürümünü güncellemek için image'ı değiştirmeniz yeterlidir:

kubectl set image deployment/nginx-deployment nginx=nginx:1.28

Kubernetes eski Pod'ları kademeli olarak yenileriyle değiştirir. Bir sorun olursa, aşağıdaki komutla önceki sürüme dönebilirsiniz:

kubectl rollout undo deployment/nginx-deployment

Sürüm geçmişini de görebilirsiniz:

kubectl rollout history deployment/nginx-deployment

Özet ve Sonraki Adımlar

Bu makalede, basit bir uygulama için Kubernetes dağıtımının tam döngüsünü tamamladık: Pod'ları yönetmek için Deployment oluşturma, kalıcı erişim için Service tanımlama ve NodePort, LoadBalancer ve Ingress olmak üzere üç yöntemle dışarıya açma. Bu ana temeldir; buradan yapılandırma yönetimi için ConfigMap ve Secret, kalıcı veriler için PersistentVolume ve otomatik ölçekleme için HorizontalPodAutoscaler gibi daha ileri konulara geçebilirsiniz.

Kubernetes çalıştırmanın sorunsuz ve stressiz olduğu bir altyapı arıyorsanız, ServerNet'in bulut servisleri kümenizi barındırmak için uygun bir zemin sağlayabilir. Ancak en önemli adım pratik yapmaktır: hemen bir test kümesi oluşturun ve ilk Deployment'ınızı çalıştırın. Birkaç tekrardan sonra bu süreç ikinci doğanız haline gelecektir.

Bu sayfa yardımcı oldu mu?