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?
- 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.
- Testlerin Yapılması: Yeşil sürümün tüm testlerden geçtiğinden emin olun.
- 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.
- 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.
- 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.

