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: