Using Traffic Shifting on Istio to make Blue/Green Deployments on Kubernetes
In this post i’ll show how to do blue/green deployements on Kubernetes using Istio.
After installation we should create our namespace and set istio sidecar injection. Im using namespace label with automated injection using
kubectl create ns webischia && kubectl label namespace webischia istio-injection=enabled
Our test yaml:
apiVersion: v1 kind: Service metadata: name: webischia labels: app: webischia spec: ports: - port: 80 name: http selector: app: webischia --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: webischia-v1 spec: replicas: 1 template: metadata: labels: app: webischia version: v1 spec: containers: - name: webischia image: ffahri/bluedep imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: webischia-v2 spec: replicas: 1 template: metadata: labels: app: webischia version: v2 spec: containers: - name: webischia image: ffahri/greendep imagePullPolicy: IfNotPresent ports: - containerPort: 80 ---
Applying this yaml using
kubectl apply -f webischia.yaml -n webischia
root@frankfurt-kubeadm1-ub2g:~/# kubectl apply -f blue-green.yaml -n webischia service/webischia created deployment.extensions/webischia-v1 created deployment.extensions/webischia-v2 created
Now we need to create istio gateway for our service and define route rules
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: webischia spec: host: webischia subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: webischia-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: webischia spec: hosts: - "*" gateways: - webischia-gateway http: - match: - uri: exact: / route: - destination: host: webischia subset: v1 port: number: 80
kubectl apply -f gateway.yaml -n webischia gateway.networking.istio.io/webischia-gateway created virtualservice.networking.istio.io/webischia created
These create gateway and virtualservice for our app.
After that we can use istio-ingressgateway to test our system.
We select v1 for all traffic we should always see blue webischia.
for i in {0..999} ; do curl http://159.89.3**.***/;echo ; done <h1 style='color:blue'>Blue WebIschia</h1> <h1 style='color:blue'>Blue WebIschia</h1> <h1 style='color:blue'>Blue WebIschia</h1> <h1 style='color:blue'>Blue WebIschia</h1> <h1 style='color:blue'>Blue WebIschia</h1>
Monitoring of these services(thanks istio for taking care of all 🙂 )
And lets say we created new versino and want to publish but split traffic by %80 to %20.
- route: - destination: host: webischia subset: v1 weight: 80 - destination: host: webischia subset: v2 weight: 20
As you can see our graphics shows traffic shifting is applied.
This happen without any server or client side errors.
Now lets our weights 80 green 20 blue.
- route: - destination: host: webischia subset: v1 weight: 20 - destination: host: webischia subset: v2 weight: 80
And finally we can fully shift to green.
- route: - destination: host: webischia subset: v1 weight: 0 - destination: host: webischia subset: v2 weight: 100
Conclusion:
Istio shows us we can do traffic shifting so much easy. Observabilty is also a big deal and super easy with istio.