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.