Kubernetes Deployment Stratejisi Bölüm 4: Blue/Green

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

Blue/Green 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 Blue/Green Deployment Nasıl Yapılır?

  1. Green Sürümün Hazırlanması: Yeni sürüm (Green) hazırlanır ve Kubernetes cluster’ınıza dağıtılır, ancak hala trafiği almayan bir şekilde (Ingress veya Service objeleri üzerinden) konfigüre edilir.
  2. Testlerin Yapılması: Yeşil sürümün tüm testlerden geçtiğinden emin olun.
  3. Trafik Yönlendirmesi: Kubernetes Ingress veya Service objeleri üzerinden trafiği yönlendirebileceğiniz bir yöntem kullanarak trafiği Blue sürümden Green sürüme yönlendirin.
  4. Trafik Kontrolü: Yeşil sürümün sorunsuz çalıştığından emin olun. Eğer sorunlar çıkarsa, trafik hızla Mavi sürüme yönlendirilebilir.
  5. Blue Sürümün Temizlenmesi: Green sürüm başarılı bir şekilde çalıştığında, Blue sürümü kapatın ve kaynakları serbest bırakın.

Şimdi sırasıyla A/B Testing adımlarını uygulayalım.
nano bluegreen-deployment-blue.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sercan-app-1
  namespace: default
  labels:
    app: sercan-app
spec:
  selector:
    matchLabels:
      app: sercan-app
      strategies: blue
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: sercan-app
        strategies: blue
    spec:
      containers:
      - name: sercan-app
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 1024Mi
          limits:
            cpu: 1000m
            memory: 2048Mi
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 10
        ports:
        - containerPort: 80
          name: sercan-app
      restartPolicy: Always

Oluşturulan yaml’ı kubernetes’a gönderin.
kubectl apply -f bluegreen-deployment-blue.yaml

Oluşturulan podları izleyin.
watch kubectl get pods

Pod oluşturulmuştur. Port-forward yapın.
kubectl port-forward pods/sercan-app-1-79956c745d-f8tm9 8080:80 --address='0.0.0.0'
Burada cluster ip’sinin 8080 portuna gelenler, içeride 80 portuna yönlendiriliyor.

Cluster IP’nizin 8080 portuna gidin. İlk image’ımız(Blue) Nginx olduğu için onun çıktısını almanız gerekiyor.

Şimdi ingress yaml’ı oluşturun.
nano bluegreen-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: blue-green
  namespace: default
  labels:
    app: sercan-app
    strategies: blue
spec:
  ingressClassName: nginx
  rules:
  - host: sercan.bluegreen.com
    http:
      paths:
      - backend:
          service:
            name: sercan-svc
            port:
              number: 80
        path: /
        pathType: Prefix

Ingress’i kubernetes’ gönderin.
kubectl apply -f bluegreen-ingress.yaml

Sıra Green yaml’ın oluşturulmasında.
nano bluegreen-deployment-green.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sercan-app-2
  namespace: default
  labels:
    app: sercan-app
spec:
  selector:
    matchLabels:
      app: sercan-app
      strategies: green
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: sercan-app
        strategies: green
    spec:
      containers:
      - name: sercan-app
        image: jc21/nginx-proxy-manager
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 1024Mi
          limits:
            cpu: 1000m
            memory: 2048Mi
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 10
        ports:
        - containerPort: 80
          name: sercan-app
      restartPolicy: Always

Sıra servis objesini oluşturmada.
bluegreen-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: sercan-svc
  namespace: default
spec:
  selector:
    app: sercan-app
    strategies: blue
  type: ClusterIP
  ports:
  - name: sercan-svc
    protocol: TCP
    port: 80
    targetPort: 80

Servisi kubernetes’e gönderin.
kubectl apply -f bluegreen-service.yaml
Servis objelerini izleyin.
watch kubectl get svc

Servis objesi oluşturulmuş. Servise verilen cluster-ip’sine curl isteği gönderin. 2.(Green) image’ımız Nginx Proxy Manager idi. Onun çıktısını almanız gerekiyor.
curl http://10.104.225.105

Servisin verdiği cluster-ip’yi host dosyasına ekleyin.
nano /etc/hosts

İlk curl isteğini gönderin.
İlk image yani blue olan NGINX çıktısını almanız gerekiyor.
curl sercan.bluegreen.com

Servisin içinden blue’yu green’e çevirin.
nano kubectl edit svc sercan-svc

Tekrardan curl isteği gönderdiğinizde tüm isteklerin 2.image yani green olan Nginx Proxy Manager’a yönlendirildiğini göreceksiniz.