Istio basic canary deployment

Canary deployment adalah konsep dimana engineer membagi traffic ke beberapa layanan dengan versi yang berbeda.

Image result for canary deployment

Sebenarnya kubernetes juga mendukung konsep ini, tetapi pembagian traffic dilakukan berdasarkan jumlah pod/container yang melayani, misalkan kalau kita ingin membagi 90% traffic ke versi stable dan 10% traffic ke versi canary, didalam kubernetes, kita harus membuat 9 pod dengan versi stable dan 1 pod dengan versi canary (intinya adalah jumlah, berlaku kelipatan).

pada Istio, kita bisa membaginya berdasarkan weight yang diimplementasikan pada virtualservice, AFAIK. So lets start the lab, requirement yang dibutukan:

  • Kubernetes Cluster
  • Istio Enabled, see my article how to install istio in kubernetes.

hal yang pertama dilakukan adalah mengaktifkan automatic sidecar injection pada namespace tertentu:

kubectl label namespace default istio-injection=enabled

lalu buat deployment dan service, disini kita membuat 2 deployment dengan versi 1 dan versi 2:

apiVersion: v1
kind: Service
metadata:
  name: apache-apps-service
  labels:
    app: apache-apps
    service: apache-apps
spec:
  type: NodePort
  ports:
  - port: 80
    name: http
  selector:
    app: apache-apps
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: apache-apps-v1
  labels:
    app: apache-apps
    version: v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: apache-apps
        version: v1
    spec:
      containers:
      - name: apache-apps
        image: zufardhiyaulhaq/comet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: apache-apps-v2
  labels:
    app: apache-apps
    version: v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: apache-apps
        version: v2
    spec:
      containers:
      - name: apache-apps
        image: zufardhiyaulhaq/comet:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

Buat istio gateway, pada dasarnya, konsepnya hampir sama dengan ingress. konfigurasi ingress akan dimasukan pada pod istio-ingressgateway (namespace istio-system).

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: apache-apps-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "zufardhiyaulhaq.com"

Buat VirtualService, Its hard to explain virtualservice, virtualservice akan melisten host dari gateway, yaitu zufardhiyaulhaq.com, lalu ada traffic shifting berdasarkan subset (akan dibahas dibawah), dengan weight 10 & 90 (1:9)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: apache-apps-vs-out
spec:   
  hosts:
  - "zufardhiyaulhaq.com"
  gateways:
  - apache-apps-gateway
  http:   
  - route:
    - destination:
        host: apache-apps-service
        subset: v2
      weight: 10
    - destination:
        host: apache-apps-service
        subset: v1
      weight: 90
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: apache-apps-vs-in
spec:
  hosts:
  - apache-apps-service
  http:
  - route:
    - destination:
        host: apache-apps-service
        subset: v2
      weight: 10
    - destination:
        host: apache-apps-service
        subset: v1
      weight: 90

Buat destinationrule, host pada DR ini merujuk pada nama service yang kita buat, pada subset v1, ada key label dengan isi version: v1. ini menujukan jika ada traffic yang berpoint pada subset v1, maka alihkan traffic tersebut ke `pod` dengan label version: v1.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: apache-apps-dr
spec:
  host: apache-apps-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Testing

Mari kita cek service gateway yang bertipe loadbalancer, tetapi karena environment ini tidak mendukung loadbalancer, kita dapat menggunakan nodeportnya (karena loadbalancer adalah nodeport yang dimodifikasi).

ubuntu@master:~$ kubectl get svc -n istio-system | grep gateway
istio-ingressgateway     LoadBalancer   10.108.192.63    <pending>     80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31333/TCP,15030:30922/TCP,15031:30542/TCP,15032:30299/TCP,15443:32410/TCP,15020:32501/TCP   42h

mari kita berikan 10 traffic

ubuntu@master:~$ for ((i=1;i<=10;i++));do curl -HHost:zufardhiyaulhaq.com 10.200.200.10:31380; done;
v1
v1
v1
v1
v1
v1
v1
v2
v1
v1

hanya ada 1 traffic ke version 2, itu sesuai dengan weight yang kita berikan.

Comments are closed.