Canary Release With Istio

Service Mesh

Sebelum masuk ke hal teknis, kita akan membahas tentang apa itu service mesh sendiri. Service mesh merupakan metode yang menyediakan sebuah policy-based tentang bagaimana cara microservices berkomunikasi berdasarkan pola perilaku yang diinginkan pada microservices tersebut. Secara gampangnya adalah services mesh memudahkan kita untuk mengatur manajemen dari microservices yang kita punya.

Beberapa fitur yang dimiliki service mesh adalah:

Untuk lanjutan tetang beberapa dokumentasi dan penjelasan lebih silahkan cek link dibawah ini

Oke, setelah dari penjelasan ringan tentang service mesh, untuk Canary release ini akan menggunakan salah satu tool service mesh yaitu Istio.

Canary Release

Canary release atau beberapa orang menyebutnya juga dengan Canary Deployment adalah suatu metode strategi untuk mengurangi resiko dalam melakukan release suatu aplikasi secara perlahan meluncurkan perubahan ke sebagian kecil pengguna sebelum meluncurkanya sampai ke tahap full release. Maksud dari ke sebagian kecil penggunakan adalah sample set untuk uji coba release aplikasi yang sudah direncanakan.

Beberapa contoh sample set

Some Example

Tool service mesh seperti Istio ini berjalan diatas infrastruktur Kubernetes. Pertama siapkan objek konfigurasi Deployment dan minimal ada dua macam deployment untuk menentukan subset version pada Canary Release.

# First Deployment
apiVersion: extensions/v1beta1
kind: Deployment
---
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backsite
        version: v1 # Untuk versi pertama
    spec:
      containers:
---
# Second Deployment
apiVersion: extensions/v1beta1
kind: Deployment
---
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backsite
        version: v2 # Untuk versi kedua
    spec:
      containers:
---

Kemudian apply deployment dan objek konfigurasi service.

Istio berkomunikasi dengan API Server Kubernetes menggunakan CRD (Custom Resource Definitions) sehingga Istio dapat membuat objek konfigurasinya sendiri pada klaster kubernetes. Dibawah ini merupakan objek konfigurasi Gateway yang digunakan untuk membuka akses traffic masuk pada lingkungan service mesh Istio yang bersifat isolation.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: backsite-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

Langkah selanjutnya adalah menentukan traffic routing dari traffic yang masuk / ingress ke dalam deployment pod dan service yang sudah diterapkan. Fungsi tersebut dapat diatasi dengan objek konfigurasi Virtual Service pada Istio.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
---
spec:
  hosts:
  - "*"
  gateways:
  - backsite-gateway
  http:
    - route:
      - destination:
          host: backsite-svc
          subset: v1
        weight: 90
      - destination:
          host: backsite-svc
          subset: v2
        weight: 10

Pada section weight Virtual Service diatas, deployment atau pod pertama akan memberikan load sebesar 90% dan deployment kedua hanya 10%. Jadi ketika ada traffic masuk request ke dalam service yang sama maka besar kemungkinan akan dilayani oleh deployment pertama. Setelah mengimplementasikan Virtual Service untuk traffic routing, selanjutnya adalah menerapkan aturan traffic yang digunakan pada Virtual Service dan objek konfigurasi Istio tersebut dimiliki oleh Destination Rule. Berikut contoh potongan YAML file untuk Destination Rule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
---
spec:
  host: backsite-svc
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Aturan dari yaml diatas adalah untuk subset pertama harus dimiliki oleh label deployment pertama dan begitu selanjutnya untuk subset kedua harus dimiliki oleh label deployment kedua.

Lakukan pengujian dengan cara melakukan request ke Istio-ingressgateway dan ketika ingin melakukan perubahan nilai weight edit saja objek konfigurasi Virtual Service.

Berikut contoh kasus Canary Release hanya untuk pengguna mobile dan traffic diarahkan ke deployment pertama saja

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-header
---
  http:
  - match:
    - headers:
        user-agent:
          regex: '^.*(Android|iPhone).*$'
    route:
    - destination:
        host: somesite-svc
        subset: v1

Thanks

Full code : github