ARGO Rollouts Kubernetes Canary Deployment

H. Alperen Selcuk
4 min readJan 25, 2022

ArgoCD den sonra incelemek istediğim diğer konuya geldik Argo Rollouts

Argo Rollouts progressive deployment da size çok yardımcı olan bir tool ne demek istiyorum yani blue-green ve canary gibi çıkacağınız bir deploymentını öncelikle test aşamasına sokup başarılı ise proda çıkmamıza yardım eder. bunu kendi operatorü ile size iş bırakmadan hallediyor.

Yapısal olarak anlatırsam, deploymentlarınız rollout olarak giriyorsunuz. yeni versiyonu çıktığınız an %20 trafiğini bu yeni versiyona yönlendiriyor. bu sırada prometheus tarzı bir metric toplama sistemi ile yeni versiyonunuz kontrol edilir. Eğer başarılı devam ederse trafiği bu sefer %40 a çıkarıyor ve başarılı olmaya devam ettikçe burada steplerin aralığını ve trafik miktarını belirliyorsunuz. en son %100 olup yeni servisiniz başarılı ile çıkmış olurdu.

Eğer ilk versiyonunuzda herhangi bir sıkıntı olursa argo rollouts bu deploymenti çıkmanıza izin vermiyor ve terminate ediyor. işte bu süreci CI/CD ye dahil ettiğinizde prod a çıkma aşamasında test tarafını argo rollouts hallediyor ve kesintisiz bir release yapılmış oluyor.

ARGO ROLLOUTS INSTALLATION

kubernetes clusterı olarak Kind kullanacağım, KinD size docker üzerinde cluster oluşturmanıza yarar.

yazıma buradan ulaşabilirsiniz.

öncelikle argo-rollouts operatorunu kuralım.

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

ve command line üzerinde kullanabilceğiniz plugin yükleyeceğiz,

curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-darwin-amd64chmod +x ./kubectl-argo-rollouts-darwin-amd64sudo mv ./kubectl-argo-rollouts-darwin-amd64 /usr/bin/kubectl-argo-rollouts

“kubectl argo rollouts version” diyerek kontrol edebiliriz.

virtualization olarak argocd nin kendisini kullanabiliriz, kurulum için bir önceki yazıma bakabilirsiniz.

DEPLOYMENT — ROLLOUT

argo rollouts kullanabilmek için yapmamız gerekenler:

mevcut deployment fileımızda apiversion ve kind i değiştirmek.

apiVersion: argoproj.io/v1alpha1
kind: Rollout

daha sonra da spec de strategy adımında kuralımızı belirlemek.

apiVersion: argoproj.io/v1alpha1
kind: Rollout

metadata:
creationTimestamp: null
labels:
app: argo-deployment
name: argo-deployment
spec:
replicas: 4
selector:
matchLabels:
app: argo-deployment
template:
metadata:
creationTimestamp: null
labels:
app: argo-deployment
spec:
containers:
- image: iad.ocir.io/natdcshjumpstartprod/argo:v1
name: argo
env:
- name: COLOR
value: "RED"
ports:
- containerPort: 5000
resources: {}
strategy:
canary:
steps:
- setWeight: 10
# Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
- pause: {duration: 30}
- setWeight: 50
- pause: { duration: 30 }

strategy adımı trafiği çevirmenin kurallarını belirtiyor

yapıyı anlatırken de belirttiğim gibi bunu prometheus metricleri sayesinde de yapabiliriz o zaman da anaylsis adımı kullanmamız gerekiyor. sonraki yazımda bahsedeceğim şuan basit olması açısından belli bir süre bekleyip sonra traffic değiştirme yapan bir yapı kurdum.

burada basit bir bekleme statü oluşturup ele alındı. 30 saniye bekleyip sırasıyla önce traffiğin %10 u daha sonra %50 si daha sonra da %100 olarak verecek.

service imizi de deployment a göre ayarlayalım. 5000 portundan çalışacak.

apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: argo-svc
name: argo-svc
spec:
ports:
- name: 5000-80
port: 80
protocol: TCP
targetPort: 5000
selector:
app: argo-deployment
type: LoadBalancer
status:
loadBalancer: {}

application olarak bir python flash kullanacağız env verdiğiniz rengi çeviren bir kod.

from flask_cors import CORS
from flask import Flask, jsonify
import os

app = Flask(__name__)
CORS(app)


@app.route('/')
def response():
return jsonify({
'color': os.environ.get('COLOR')
}), 200


if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

requirement.txt

flask==2.0.1
flask-cors==3.0.8

öncelikle applikasyondan bir image alalım.

“docker build -t hasanalperen/test-app:v1 .” daha sonra da dockerhub a pushlayalım “ docker push hasanalperen/test-app:v1”

imageimiz hazır ve deployment ve service manifestlerimiz de hazır.

şimdi clusterımıza ilk deploymentı yapalım ve daha sonra deployment fileımızda bir değişiklik yaparak yeni versiyonu göndereceğiz.

curl çektiğimizde nodeport olarak service env de verdiğimiz rengi döndüğünü görebilirsiniz.

root@docker-host:~/argo-rollout-oke# curl http://172.19.0.3:32202
{ “color”: “RED”}
root@docker-host:~/argo-rollout-oke#

şimdi env i değiştirelim ve curl i bir loop a alalım.

gördüğünüz gibi rollouts otomatik olarak trafiği artırdı. bir sonraki yazımda bu rollouts u prometheus e bağlayacağız ve bir analysis template yardımı ile yeni releaseden metric toplayacağız. bu metriclerde herhangi istemediğimiz durum olursa argo rollouts deploymentı durduracak böylece trafiğin hepsinde kesinti değil belli bir kısmında sorun göreceğiz. hızlıca eski haline gelecek.

umarım yararlı olmuştur.

sağlıklı günler dilerim.

h.a.s.

Sign up to discover human stories that deepen your understanding of the world.

No responses yet

Write a response