Kubernetes, container tabanlı bir dağıtım platformudur ve deployment stratejileri, container’ların nasıl dağıtılacağını ve yönetileceğini belirleyen yöntemlerdir. Bu makalede, Kubernetes üzerinde kullanılabilecek deployment stratejilerini anlatmaya çalışacağım.

deployment stratejileri

Deployment Stratejileri

Kubernetes üzerinde deployment stratejileri, container’ların dağıtılışını ve yönetimini belirleyen yöntemlerdir. Bu yöntemler, uygulamanın sağlıklı bir şekilde çalışmasını ve hata olması durumunda nasıl yönetileceğini belirler. Kubernetes, aşağıdaki deployment stratejilerini destekler:

  1. Rolling Update: Bu strateji, mevcut bir deployment’ı güncelleştirirken, yeni bir replika set oluşturularak eski replika set’leri adım adım kapatır. Bu strateji, uygulamanın çalışmayı sürdürmesini sağlar ve uygulamanın tüm replika setlerini aynı anda güncelleştirme riskini azaltır.
  2. Recreate: Bu strateji, mevcut bir deployment’ı güncelleştirirken, tüm replika setlerini kapatarak yeni bir replika set oluşturur. Bu strateji, uygulamanın tüm replika setlerini aynı anda güncelleştirmeyi amaçlar ve uygulamanın çalışmayı sürdürmemesi riskini alır.
  3. Blue/Green Deployment: Bu strateji, mevcut bir deployment’ı güncelleştirirken, yeni bir deployment oluşturularak uygulamanın iki farklı sürümünü aynı anda çalıştırır. Bu sayede, güncelleştirme esnasında uygulamanın çalışmayı sürdürmesi sağlanır ve güncelleştirme tamamlandıktan sonra, yeni sürümün çalışıp çalışmadığı test edilebilir.
  4. Canary Deployment: Bu strateji, mevcut bir deployment’ı güncelleştirirken, yeni bir deployment oluşturularak sadece birkaç replika set kullanılır. Bu sayede, güncelleştirme esnasında uygulamanın çalışmayı sürdürmesi sağlanır ve yeni sürümün performansı ve sağlığı test edilebilir. Eğer yeni sürüm düzgün çalışıyorsa, diğer replika setleri de yeni sürüme geçirilebilir. Bu strateji, güncelleştirme esnasında uygulamanın çalışmayı sürdürmesini sağlar ve aynı zamanda yeni sürümün performansını ve sağlığını test etme imkanı verir.

Deployment Örnekleri

Aşağıdaki YAML dosyaları, apiVersion, kind, metadata, spec, template, ve strategy gibi bölümlerden oluşur.

  • apiVersion: Bu bölümde, deployment için kullanılan API sürümü belirtilir.
  • kind: Bu bölümde, oluşturulan objenin türü belirtilir. Bu örnekte, deployment objesi oluşturulmaktadır.
  • metadata: Bu bölümde, deployment objesine ait metadatalar belirtilir. Bu örnekte, deployment objesinin adı nginx-deployment olarak belirtilmiştir.
  • spec: Bu bölümde, deployment objesi için gereken özellikler belirtilir. Örneğin, replika sayısı, container’ların özellikleri gibi.
  • template: Bu bölümde, deployment objesi için kullanılacak olan pod şablonu belirtilir.
  • strategy: Bu bölümde, deployment objesi için kullanılacak olan strateji belirtilir. Bu örnekte, rolling update stratejisi kullanılmıştır ve bu strateji ile birlikte, maxUnavailable ve maxSurge değerleri de belirtilmiştir. maxUnavailable, aynı anda kapatılabilecek replika set sayısını belirtir ve maxSurge, aynı anda açılabilecek replika set sayısını belirtir. Bu örnekte, rolling update esnasında aynı anda en fazla 1 replika set kapatılabilecek ve aynı anda en fazla 1 replika set açılabilecektir.

Bu yaml dosyalarını kullanarak, kubectl komutu ile deployment objesi oluşturulabilir. Örneğin:

kubectl apply -f deployment.yaml

Bu komut, deployment.yaml dosyasındaki yaml içeriğini kullanarak deployment objesi oluşturur. Daha sonra, bu objeyi güncellemek için aynı yaml dosyasını kullanarak tekrar kubectl apply komutunu çalıştırabilirsiniz. Bu sayede, rolling update stratejisi ile birlikte deployment objesi güncelleştirilebilir.

Rolling Update

Bu yaml örneğinde, rolling update stratejisi kullanılarak nginx adlı bir container içeren bir deployment objesi oluşturulmuştur. Bu deployment objesi, 2 replika set kullanılarak oluşturulmuş ve rolling update stratejisi ile birlikte maxUnavailable ve maxSurge değerleri de belirtilmiştir. maxUnavailable, aynı anda kapatılabilecek replika set sayısını belirtir ve maxSurge, aynı anda açılabilecek replika set sayısını belirtir. Bu örnekte, rolling update esnasında aynı anda en fazla 1 replika set kapatılabilecek ve aynı anda en fazla 1 replika set açılabilecektir.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1

Recreate

Bu yaml örneğinde, recreate stratejisi kullanılarak nginx adlı bir container içeren bir deployment objesi oluşturulmuştur. Bu deployment objesi, 2 replika set kullanılarak oluşturulmuş ve recreate stratejisi kullanılarak güncelleştirilebilir. Bu strateji, mevcut replika setlerini kapatarak yeni replika setler oluşturarak uygulamanın tüm replika setlerini aynı anda güncelleştirmeyi amaçlar.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  strategy:
    type: Recreate

Blue/Green Deployment

Bu yaml örneğinde, blue/green deployment stratejisi kullanılarak nginx adlı bir container içeren bir deployment objesi oluşturulmuştur. Bu deployment objesi, 2 replika set kullanılarak oluşturulmuş ve rolling update stratejisi ile birlikte updatePeriodSeconds, readinessPeriodSeconds, ve pauseTimeSeconds değerleri de belirtilmiştir. Bu değerler, blue/green deployment sırasında kullanılır ve uygulamanın çalışmayı sürdürmesini ve yeni sürümün test edilebilmesini sağlar.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
      updatePeriodSeconds: 1
      readinessPeriodSeconds: 1
      pauseTimeSeconds: 1

Canary Deployment

Bu yaml örneğinde, canary deployment stratejisi kullanılarak nginx adlı bir container içeren bir deployment objesi oluşturulmuştur. Bu deployment objesi, 2 replika set kullanılarak oluşturulmuş ve rolling update stratejisi ile birlikte updatePeriodSeconds, readinessPeriodSeconds, ve pauseTimeSeconds değerleri de belirtilmiştir. Bu değerler, canary deployment sırasında kullanılır ve uygulamanın çalışmayı sürdürmesini ve yeni sürümün test edilebilmesini sağlar. Ayrıca, canary bölümünde percent ve increment değerleri de belirtilmiştir. percent, yeni sürümün kullanılacağı replika set sayısını belirtir ve increment, yeni sürümün kullanılacağı replika set sayısının artırılacağı miktarı belirtir. Bu örnekte, yeni sürümün ilk aşamada yarısı kadar replika seti kullanılacak ve daha sonra increment değeri kadar replika seti daha fazla kullanılacaktır.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
      updatePeriodSeconds: 1
      readinessPeriodSeconds: 1
      pauseTimeSeconds: 1
      canary:
        percent: 50
        increment: 25

Sonuç

Bu makalede, Kubernetes üzerinde kullanılabilecek deployment stratejilerini ve bu stratejilerin nasıl kullanılabileceğini anlatmaya çalıştım. Rolling update, recreate, blue/green deployment, ve canary deployment gibi stratejiler arasından seçim yaparak, uygulamanızın dağıtımını ve yönetimini daha etkin bir şekilde yapabilirsiniz. Daha detaylı bir dökümantasyona kubernetes sayfasından ulaşabilirsiniz. Ayrıca CI-CD süreçlerini de merak ediyorsanız bu yazımı okumayı ihmal etmeyin.