Belajar Istio Canary Deployment
Catatan singkat kali ini hasil belajar saya tentang Istio dan topicnya adalah Canary Deployment. Jadi canary deployment itu adalah proses dimana kita membagi traffic antara versi lama dan versi baru dari service kita. Jadi misalnya saya ada aplikasi nama gowi-proto dengan versi 1(v1), dikemudian hari saya buat versi 2 nya (v2). Nah, saya ingin menguji v2 nya, tapi saya tidak ingin langsung mengganti v1 nya dengan v2 nya tapi dengan membagi traffic antara v1 dan v2. Jadi misalnya 90% traffic ke v1 dan 10% traffic ke v2. Nah, ini prosesnya disebut canary deployment.
Persiapan Deployment
Jadi seperti narasi diatas bahwa saya punya dua versi aplikasi yang berbeda. Di versi 1(v1) ada endpoint /simple/hello yang akan mengembalikan response dengan http code 501, dan di versi 2 akan mengembalikan response 200.
Lalu saya akan deploy ke cluster kubernetes dengan konfigurasi sebagai berikut:
apiVersion: apps/v1
kind: Deployment
metadata:
name: gowi-proto
spec:
replicas: 1
selector:
matchLabels:
app: gowi-proto
version: v1
template:
metadata:
labels:
app: gowi-proto
version: v1
spec:
containers:
- image: docker.io/nipeharefa/gowi-local
imagePullPolicy: Always
name: gowi-proto
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
name: gowi-proto
labels:
app: gowi-proto
version: v1
spec:
ports:
- name: http
port: 8081
targetPort: 8081
selector:
app: gowi-proto
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- "xavi.nipeharefa.dev"
gateways:
- httpbin-gateway
http:
- match:
- uri:
prefix: "/simple/hello"
ignoreUriCase: true
route:
- destination:
host: gowi-proto
# gateway.yml
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
dan dilanjutkan dengan service (v2):
apiVersion: apps/v1
kind: Deployment
metadata:
name: gowi-proto-canary
spec:
replicas: 1
selector:
matchLabels:
app: gowi-proto-canary
version: v1
template:
metadata:
labels:
app: gowi-proto-canary
version: v1
spec:
containers:
- image: docker.io/nipeharefa/gowi-local:v1.0.1
imagePullPolicy: Always
name: gowi-proto-canary
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
name: gowi-proto-canary
labels:
app: gowi-proto-canary
service: gowi-proto-canary
spec:
ports:
- name: http
port: 8081
targetPort: 8081
selector:
app: gowi-proto-canary
Deploy Canary
Referensi: