Kubernetes Deployments: Rolling vs Canary vs Blue-Green
Tags: kubernetes, tutorial, continuousdeployment, devops
Published: 2023-02-21 05:51:03

Deploying applications with Kubernetes has become increasingly popular due to its numerous benefits. Kubernetes enables easy management of containerized applications, providing a platform for application deployment, scaling, and management. With Kubernetes, applications can be deployed quickly and consistently across different environments, including on-premises and cloud platforms. 

While deploying applications with Kubernetes, many of us will have questions about what deployment type to use - Rolling, Blue-Green, Canary, etc. In this article, we will discuss these deployment types, Canary, Rolling and Blue-Green, how they work, and which one you should choose. 

## Canary Deployment
Kubernetes canary deployment is a technique for rolling out new features or changes to a small subset of users or servers before releasing the update to the entire system. This is done by creating a new replica set with the updated version of the software while keeping the original replica set running. A small percentage of traffic is then routed to the new replica set, while the majority of the traffic continues to be served by the original replica set. This allows for the new version to be tested in a live environment while minimizing the risk of issues affecting the entire system. If issues are detected during the canary deployment, it can be quickly rolled back to the original replica set. Canary deployments are a valuable tool for minimizing risk and ensuring high availability in complex distributed systems, by allowing for controlled testing of changes before they are released to the entire system.

Here is an example of a canary deployment YAML file in Kubernetes.

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
        ports:
        - containerPort: 8080
      readinessProbe:
        httpGet:
          path: /
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 5
      livenessProbe:
        httpGet:
          path: /
          port: 8080
        initialDelaySeconds: 10
        periodSeconds: 10
```
In this example, we are deploying a Kubernetes deployment that will create three replicas of our application. The deployment uses a selector to find the appropriate pods to manage based on the label **app: myapp**.

The template section specifies the configuration for the pods created by the deployment. In this case, we're running a single container in each pod, which is specified with the containers field. The container image used is **myapp:v1**, which is the first version of our application.

We've also added two probes to the container to check its health. The **readinessProbe** checks whether the container is ready to receive traffic, and the **livenessProbe** checks whether the container is still running. If either of these probes fails, the pod will be restarted.

To perform a canary deployment, we would create a second deployment YAML file that specifies the new version of the application, for example, **myapp:v2**. We would then update the original deployment to set up a canary test by scaling up the replicas of the new version to 1 while keeping the replicas of the old version at 2.

Once the new version is running, we can test it to ensure it's functioning correctly. If everything looks good, we can update the original deployment to scale up the replicas of the new version and gradually scale down the replicas of the old version.

This will cause a small percentage of traffic to gradually shift from the old version to the new version until all traffic goes to the new version. If any issues arise with the new version, we can quickly roll back to the old version by reversing the process.

## Rolling Deployment
Kubernetes rolling deployment is a strategy for updating and deploying new versions of software in a controlled and gradual manner. Instead of deploying updates all at once, Kubernetes rolls out changes incrementally, reducing the risk of downtime and allowing for easy rollbacks in case of errors. Rolling deployment involves creating a new replica set with the updated version of the software while gradually scaling down the old replica set. This allows for the new version to be deployed while the old version is still running, ensuring that there is no interruption to service. Once the new version is fully deployed, the old replica set is deleted, and the deployment is complete. Kubernetes rolling deployment is essential for ensuring high availability and reliability in complex distributed systems.

Here is an example of a rolling deployment YAML file in Kubernetes

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
        ports:
        - containerPort: 8080
```
In this example, we are deploying a Kubernetes deployment that will create three replicas of our application. The deployment uses a selector to find the appropriate pods to manage based on the label **app: myapp**.

The strategy section specifies the strategy that Kubernetes should use to update the deployment. In this case, we are using a RollingUpdate strategy. This means that Kubernetes will gradually update the deployment by replacing old replicas with new replicas.

The **maxSurge** and **maxUnavailable** fields control the rolling update process. **maxSurge** determines the maximum number of replicas that can be created above the desired number of replicas, and **maxUnavailable** determines the maximum number of replicas that can be unavailable during the update.

The template section specifies the configuration for the pods created by the deployment. In this case, we're running a single container in each pod, which is specified with the containers field. The container image used is **myapp:v1**, which is the first version of our application.

To update the deployment, we would create a new deployment YAML file that specifies the new version of the application, for example, **myapp:v2**. We would then update the original deployment to point to the new YAML file.

Once the update is started, Kubernetes will gradually replace old replicas with new ones until all replicas run the new version. The rolling update process allows for updates to be performed with minimal disruption to users, as it always ensures that at least one replica of the old version is running while the new version is being rolled out.

## Blue-Green Deployment Strategy
The Blue-Green Kubernetes deployment strategy is a technique for releasing new versions of an application to minimise downtime and risk. It involves running two identical environments, one serving as the active production environment (blue) and the other as a new release candidate (green). The new release candidate is thoroughly tested before being switched with the production environment, allowing for a smooth transition without any downtime or errors.

Here is an example YAML file for a Blue-Green deployment on Kubernetes:

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        version: blue
    spec:
      containers:
        - name: my-app
          image: myregistry/my-app:blue
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
```
In this example, we define a deployment for an application called "**my-app**" with two replicas. The deployment has a label selector of "**app: my-app**", which will match the corresponding service that routes traffic to the deployment.

The first template defines the "**blue**" version of the application. It is defined with the label "**version: blue**", which allows for easy identification of the version currently in production. The container image for this version is pulled from the Docker registry at "**myregistry/my-app:blue**".
When a new version is ready, a new template is added with the label "**version: green**". This new template will have an updated container image with the new version of the application. Once this new template has been created and is ready to be released, the Kubernetes service can be updated to route traffic to the new "**green**" deployment.

This Blue-Green deployment strategy ensures that the new version of the application can be fully tested before it is released, with no downtime or errors.

## Automate Your Kubernetes Deployments with Harness
![Kubernetes deployments](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0k72bkzhgrn1w9zj9gjp.png)

No matter which deployment type you choose, Harness can easily automate your deployment with just a few clicks. You can select whether you want Rolling, Blue-Green or Canary, etc., while creating your pipeline, and that is it. The Harness is will take care of the rest. 

Create a [free Harness cloud account](https://app.harness.io/auth/#/signup/?module=cd&utm_source=internal&utm_medium=social&utm_campaign=devadvocacy&utm_content=pavan_kubernetes_deploy_article&utm_term=get-started) and select the continuous delivery (CD) module.  

Go to the module and start your CD free plan.
![continuous delivery module](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qbnmez481sc692iowc0s.png)

Start with your deployment journey.
![Start your deployment](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eornm03xj7pfvgkhbz9c.png)

All the steps are pretty straightforward as you go along. Once you create your CD pipeline, you can return to your pipeline studio and select the CD stage, click on the ‘Execution’ tab, and you should see that the deployment type is considered to be ‘Rolling’ by default. 
![Default deployment type](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5w5zblup5346hhxje7si.png)

You can edit the deployment type and add the one that you want.
![deployment strategies](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmostusd0gd7cbu7vwfn.png)

As you can see from the above list, you can use any of the strategies listed to deploy your application. 

In the Harness deployment pipeline, we can choose the Canary deployment strategy.
![deployment pipeline](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/itf0269tu193f47mlid7.png)

Add Step and choose Canary from the options available.
![canary deployment](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h9zvrc41qg212n5cxsux.png)

Click on ‘Canary Deployment’ and add the details such as Name, Timeout and the desired instances. 
![canary deployment settings](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l3jrbdbxg3g627vpjdnk.png)

You can apply changes, save and run the pipeline.
![successful pipeline](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwul1ltvbb1i2ydq654c.png)

You can see a successful Canary deployment. 
Similarly, you can select the Blue-Green deployment strategy and deploy your application. 

That’s how Harness can help you deploy applications seamlessly with whatever deployment strategy you want in just a few clicks. 
{% embed https://youtu.be/l15JdIr3PEU %}

### Which One Should You Choose? 
The choice of Kubernetes deployment strategy depends on the specific needs and requirements of the application or service being deployed.

A **Canary deployment strategy** is typically used when deploying new features or updates to a subset of users or servers to test them in a live environment and is often used for applications that require frequent updates. This strategy allows for the testing of new features with minimal impact on the production environment and can help to identify issues before they affect the entire system.

A **Rolling deployment strategy** is ideal for applications that require zero downtime during deployment. It involves incrementally rolling out new versions of an application while ensuring that the old version is still running, reducing the risk of downtime and allowing for easy rollbacks in case of issues.

A **Blue-Green deployment strategy** is useful for applications where downtime is acceptable but must be minimized. It involves running two identical environments, one serving as the active production environment and the other as a new release candidate. The new release candidate is tested before being switched with the production environment, allowing for a smooth transition without any downtime or errors.

In summary, the choice of deployment strategy depends on the specific needs and requirements of the application or service being deployed. Canary deployments are ideal for frequent updates and testing, Rolling deployments are ideal for zero-downtime deployments, and Blue-Green deployments are ideal for minimizing downtime during deployments.