Blue-Green deployment is an application rollout model that progressively directs user traffic from the previous version of an application or service to a new version of it, while both versions are running in parallel for a limited amount of time.
The old version is usually named Blue, while the new version is name Green. Once the Green version is fully tested by the development team, user traffic can be redirected from Blue version to the Green. The Blue version can still run for quite some time making it fairly easy to rollback in case the Green version has issues.
Let’s see how we can do that in Kubernetes. Lets say we have the following Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: version1 template: metadata: labels: app: version1 spec: containers: - name: myapp image: myapp:version1 resources: limits: memory: "128Mi" cpu: "500m"
kubectl create -f deployment1.yml
That is our initial (blue) deployed version of the app. Our running container is exposed using a service
apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: version1 ports: - port: 8080 targetPort: 8080
kubectl create -f service.yml
In this service we have the
selector target the pods with label
To create a new (Green) version of our app, we can create a second deployment with different labels.
apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: version2 template: metadata: labels: app: version2 spec: containers: - name: myapp image: myapp:version2 resources: limits: memory: '128Mi' cpu: '500m'
kubectl create -f deployment2.yml
Once we are sure that these pods are ready and do not have any issue we can change the labels in our Service to direct traffic to the newly created (green) pods.
apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: version2 ports: - port: 8080 targetPort: 8080
And trigger the changes with
kubectl apply -f service.yml
Once we verify that we dont have to rollback we can delete the pods of the Deployment one.
kubectl delete -f deployment1.yml