Kubernetes Deployment Stratejisi Bölüm 3: A/B Testing

Kubernetes, uygulama dağıtımını ve güncellemelerini yönetmek için gelişmiş stratejiler sunar. Bu yazı dizisinin üçüncü bölümünde, “A/B Testing” adlı bir Deployment stratejisini inceleyeceğiz.

A/B Testi Nedir?

A/B testi, iki veya daha fazla versiyonu karşılaştırmak amacıyla kullanılan bir deney tasarımıdır. Genellikle, iki farklı sürüm (A ve B) karşılaştırılır ve kullanıcıların hangi sürümünü tercih ettiğini veya hangi sürümün daha etkili olduğunu belirlemek için istatistiksel analizler yapılır. Bu yöntem, kullanıcı deneyimini iyileştirmek veya uygulama hatalarını tespit etmek için kullanılır.

Kubernetes ile A/B Testi Nasıl Yapılır?

A/B testlerini Kubernetes üzerinde uygulamak için aşağıdaki temel adımları izleyebilirsiniz:

  1. Konteynerleri Hazırlayın: İlk adım, A ve B sürümlerini içeren konteyner görüntülerini oluşturmak veya kullanmaktır.
  2. Kubernetes Uygulama Yapılandırmalarını Hazırlayın: A ve B sürümleri için farklı yapılandırmalar oluşturun. Örneğin, farklı özelliklerin etkinleştirildiği yapılandırmalar olabilir.
  3. Kubernetes YAML Dosyalarını Oluşturun: A ve B sürümleri için ayrı ayrı Kubernetes Deployment veya StatefulSet YAML dosyaları oluşturun.
  4. Kubernetes’e Yükleyin: Oluşturduğunuz YAML dosyalarını Kubernetes kümenize yükleyin. Her iki sürümü de aynı anda çalıştırabilirsiniz.
  5. Traffic Yönlendirmeyi Ayarlayın: A/B testini yönlendirmek için Kubernetes Service veya Ingress gibi kaynakları kullanarak trafiği farklı sürümlere yönlendirin.
  6. Veri Toplama ve Analiz: Kullanıcıların davranışlarını ve tercihlerini izlemek için uygun veri analiz araçları kullanarak veri toplamalısınız. Bu verileri kullanarak istatistiksel analizler yapabilirsiniz.
  7. Sonuçları Değerlendirin ve Optimizasyon Yapın: Elde ettiğiniz sonuçları inceleyin ve hangi sürümün daha etkili olduğunu belirleyin. Sonuçlara göre iyileştirmeler yapın.

Şimdi sırasıyla A/B Testing adımlarını uygulayalım.

Master ve worker nodenuzu up duruma getirin.
İşlemlerin tümünü master node’da yapacağız.
ab-deployment-svc-v1.yaml adında bir yaml oluşturun.
nano ab-deployment-svc-v1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: version-1
  namespace: default
data:
  index.html: |
    sercancelenk.com
    ab deployment v1
---
##################################################
# A&B Testing Deployment V1 - Manifest
##################################################
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sercan-v1
  namespace: default
  labels:
    app: v1
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: v1
  template:
    metadata:
      labels:
        app: v1
    spec:
      volumes:
        - name: version-1
          configMap:
            name: version-1
      containers:
      - name: version-1
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
            memory: 500Mi
          requests:
            cpu: 50m
            memory: 100Mi
        readinessProbe:
          failureThreshold: 1
          periodSeconds: 5
          timeoutSeconds: 1
          successThreshold: 1
          tcpSocket:
            port: 80
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        startupProbe:
          failureThreshold: 10
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        volumeMounts:
          - name: version-1
            mountPath: /usr/share/nginx/html
---
##################################################
# A&B Testing Service V1 - Manifest
##################################################
apiVersion: v1
kind: Service
metadata:
  name: sercan-svc-v1
  namespace: default
  labels:
    app: v1
spec:
  type: ClusterIP
  selector:
    app: v1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


Yaml’da 80 portunda çalışan bir html index’i oluşturduk. İndex içinde;
sercancelenk.com
ab deployment v1   yazmaktadır.

Oluşturduğunuz yaml’ı kubernetes’a gönderin.
kubectl apply -f ab-deployment-svc-v1.yaml

Pod, ReplicaSet ve Servisleri izleme modunda açın.
watch kubectl get pods
watch kubectl get rs
watch kubectl get svc

Kubernetes servisine baktığınızda sercan-svc-1 adında bir servis oluşturulduğunu ve cluster-ip aldığını göreceksiniz. Bu cluster-ip’yi kopyalayıp 80 portuna curl isteği adın.
curl http://CLUSTER-IP:80
curl http://10.107.251.95:80
Görüldüğü üzere sercancelenk.com ab deploymen v1 çıktısını response aldık.

ab-deployment-svc-v2.yaml adında yeni bir yaml oluşturun.
nano ab-deployment-svc-v2.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: version-2
  namespace: default
data:
  index.html: |
    sercancelenk.com
    ab deployment v2
---
##################################################
# A&B Testing Deployment V2 - Manifest
##################################################
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sercan-v2
  namespace: default
  labels:
    app: v2
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: v2
  template:
    metadata:
      labels:
        app: v2
    spec:
      volumes:
        - name: version-2
          configMap:
            name: version-2
      containers:
      - name: version-2
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
            memory: 500Mi
          requests:
            cpu: 50m
            memory: 100Mi
        readinessProbe:
          failureThreshold: 1
          periodSeconds: 5
          timeoutSeconds: 1
          successThreshold: 1
          tcpSocket:
            port: 80
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        startupProbe:
          failureThreshold: 10
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        volumeMounts:
          - name: version-2
            mountPath: /usr/share/nginx/html
---
##################################################
# A&B Testing Service V2 - Manifest
##################################################
apiVersion: v1
kind: Service
metadata:
  name: sercan-svc-v2
  namespace: default
  labels:
    app: v2
spec:
  type: ClusterIP
  selector:
    app: v2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


Yaml’da 80 portunda çalışan bir html index’i oluşturduk. İndex içinde;
sercancelenk.com
ab deployment v2 yazmaktadır.

Oluşturduğunuz yaml’ı kubernetes’a gönderin.
kubectl apply -f ab-deployment-svc-v2.yaml

Pod, ReplicaSet ve Servisleri izleme modunda açın.
watch kubectl get pods
watch kubectl get rs
watch kubectl get svc

Servislere bakıldığında sercan-svc-v2 adında yeni bir servis oluşturulduğunu göreceksiniz.

sercan-svc-v2 servisinin aldığı Cluster-IP’yi kopyalayıp curl isteği atın.
curl http://CLUSTER-IP:80
curl http://10.101.8.5:80
Görüldüğü üzere sercancelenk.com ab deployment v2 çıktısını aldık.

Sıra ingress oluştur işleminde.
ab-ingress-v1.yaml adında bir yaml oluşturun.
nano ab-ingress-v1.yaml

Yaml’ı kubernetese gönderin.

Eğer webhook hatası alırsanız aşağıdaki kodu yazın.
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

Ingress için nginx-controller’ı deploy edin.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.5/deploy/static/provider/cloud/deploy.yaml

Ingress’ı kontrol edin. Host ve IP adresi sorunsuz oluşturulmuş.
kubectl get ingress

Host ve ip adresini /etc/hosts dosyasının içine kaydedin.
nano /etc/hosts

Curl isteği atıp, host kaydının sorunsuz çalıştığını doğrulayın.
curl http://ingress1.sercancelenk.com:80
Curl isteği sorunsuz çalışıyor.

v2 deploymentı için ab-ingress-v2.yaml adında bir yaml oluşturun.
nano ab-ingress-v2.yaml

Yaml’ı kubernetese gönderin.
kubectl apply -f ab-ingress-v2.yaml

Ingress’i kontrol edin.
v2 ingress sorunsuz çalışmaktadır.
kubectl get ingress

curl isteği ile kontrol edin. v2 deployment response sorunsuz olarak dönmektedir.
curl http://ingress1.sercancelenk.com:80