Everything You Need to Know About Kubernetes Deployment Strategies

Jyothi RamJyothi Ram
6 min read

Introduction

Hey everyone! ๐Ÿ‘‹ If you're diving into the world of Kubernetes, you know that deploying applications can be both exciting and challenging. I'll guide you through the different deployment strategies you can use to roll out updates smoothly with multiple versions of an app. Whether you're aiming for zero downtime or safe rollbacks, there's a strategy here for you!

In Kubernetes, there are several deployment strategies to manage how your applications are updated. Each strategy has its own use cases and benefits. Here are the main deployment strategies:

  1. Recreate Deployment Strategy

  2. Rolling Update Deployment Strategy

  3. Canary Deployment Strategy

  4. Blue-Green Deployment Strategy

  5. A/B Testing Deployment Strategy

1.Recreate

The Recreate strategy involves stopping all existing pods before creating new ones. This ensures a clean slate but results in downtime during the deployment process. This strategy is simpler and often used when downtime is acceptable or during major updates that require a fresh start.

Advantages:

  • Simplicity: Easy to understand and implement.

  • Clean state: Ensures no old state or data persists.

Disadvantages:

  • Downtime: The application will be unavailable during the update.

  • Not suitable for critical apps: Downtime can impact users negatively.

    Real-Time Demonstration: Switching app-blue from v1 to v2 using the recreate strategy.

  • Create a deployment and service manifest YAML file (assuming you have a Kubernetes cluster).

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: app-blue
      spec:
        replicas: 5
        selector:
          matchLabels:
            app: app-blue
        strategy:
          type: RollingUpdate
          rollingUpdate:
            maxUnavailable: 1
            maxSurge: 1
        template:
          metadata:
            labels:
              app: app-blue
          spec:
            containers:
            - name: app-blue
              image: jyothiram266/app-blue:v1
              ports:
              - containerPort: 80
    
      apiVersion: v1
      kind: Service
      metadata:
        name: app-blue-service
      spec:
        type: NodePort
        selector:
          app: app-blue
        ports:
          - protocol: TCP
            port: 80
            targetPort: 80
            nodePort: 30007
    

    Apply these manifest YAML files using the kubectl apply command.

    After deploying the service, access the web page using the node's IP address and the NodePort (e.g., http://<NodeIP>:30007).

    Edit the above deployment file by changing the image tag from v1 to v2 using the following command:

  •   kubectl edit deployment <Depolyment-Name>
    

    Kubernetes will stop all old pods and start new ones, resulting in a brief downtime.

    2.Rolling Update

    Rolling Update is the default deployment strategy in Kubernetes. It allows you to update your application without any downtime by gradually replacing old pods with new ones. This is particularly useful for applications that require high availability.

    Advantages:

    • Zero downtime: Ensures users always have access.

    • Gradual rollout: Allows monitoring and quick rollback if issues are detected.

Disadvantages:

  • Longer deployment times: Especially with large updates.

  • Resource usage: Requires extra resources during the update process.

Real-Time Demonstration: Imagine you have app-blue:v1 running and want to update to app-blue:v2.

    yamlCopy codeapiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-blue
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: app-blue
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 1
          maxSurge: 1
      template:
        metadata:
          labels:
            app: app-blue
        spec:
          containers:
          - name: app-blue
            image: jyothiram266/app-blue:v1
            ports:
            - containerPort: 80
    yamlCopy codeapiVersion: v1
    kind: Service
    metadata:
      name: app-blue-service
    spec:
      type: NodePort
      selector:
        app: app-blue
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30007

Apply these manifest YAML files using the kubectl apply command.

After deploying the service, access the web page using the node's IP address and the NodePort (e.g., http://<NodeIP>:30007).

Edit the above deployment file by changing the image tag from v1 to v2 using the following command:

  •   kubectl edit deployment <Depolyment-Name>
    

    Kubernetes will replace old pods with new ones gradually, ensuring zero downtime.

    3.Blue/Green Deployment

    Blue/Green Deployment involves running two identical environments (blue and green) but only one is live at a time. During the deployment, you switch traffic from the old version (blue) to the new version (green). This strategy makes rollbacks easy and ensures no downtime during the switch.

    Advantages:

    • Easy rollback: Switch back to the previous version if something goes wrong.

    • No downtime: Traffic is smoothly switched from blue to green.

Disadvantages:

  • Double resources: Requires twice the resources during deployment.

  • Complexity: More complex to set up and manage.

Real-Time Demonstration: Deploying app-blue with blue/green strategy.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-blue-blue
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: app-blue
          version: v1
      template:
        metadata:
          labels:
            app: app-blue
            version: v1
        spec:
          containers:
          - name: app-blue
            image: jyothiram266/app-blue:v1
            ports:
            - containerPort: 80
    yamlCopy codeapiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-blue-green
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: app-blue
          version: v2
      template:
        metadata:
          labels:
            app: app-blue
            version: v2
        spec:
          containers:
          - name: app-blue
            image: jyothiram266/app-blue:v2
            ports:
            - containerPort: 80
    yamlCopy codeapiVersion: v1
    kind: Service
    metadata:
      name: app-blue-service
    spec:
      type: NodePort
      selector:
        app: app-blue
        version: v1 
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30007

Apply these manifest YAML files using the kubectl apply command.

After deploying the service, access the web page using the node's IP address and the NodePort (e.g., http://<NodeIP>:30007).

Edit the above service file by changing the selector version field from v1 to v2 using the following command:

  •   kubectl edit service <Service-Name>
    

    Now all incoming traffic goes to version v2 of the app.

    4.Canary Deployment

    Canary Deployment is a strategy where you release a new version of your application to a small subset of users before rolling it out to the entire infrastructure. This allows you to test new features in production and get early feedback without affecting all users.

    Advantages:

    • Gradual rollout: Limits exposure to new changes.

    • Quick feedback: Detect issues early with a small user base.

Disadvantages:

  • Complexity: Requires more sophisticated monitoring.

  • Resource usage: Needs additional resources during the canary phase.

Real-Time Demonstration: Deploying app-blue with canary strategy.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-blue-v1
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: app-blue
          version: v1
      template:
        metadata:
          labels:
            app: app-blue
            version: v1
        spec:
          containers:
          - name: app-blue
            image: jyothiram266/app-blue:v1
            ports:
            - containerPort: 80
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-blue-v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: app-blue
          version: v2
      template:
        metadata:
          labels:
            app: app-blue
            version: v2
        spec:
          containers:
          - name: app-blue
            image: jyothiram266/app-blue:v2
            ports:
            - containerPort: 80
    apiVersion: v1
    kind: Service
    metadata:
      name: app-blue-service
    spec:
      type: NodePort
      selector:
        app: app-blue
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30007

Apply these manifest YAML files using the kubectl apply command.

After deploying the service, access the web page using the node's IP address and the NodePort (e.g., http://<NodeIP>:30007).

A small percentage of users will be directed to the canary version, which is version v2 in this case. Monitor the performance and gradually increase traffic if it remains stable.

  • 5.A/B Testing

    A/B Testing is similar to Canary Deployment but is primarily used for performance comparison between different versions. You run multiple versions of your application simultaneously and split traffic between them to see which performs better. This is particularly useful for making data-driven decisions based on user behavior.

    Advantages:

    • Performance comparison: Directly compare different versions in production.

    • Data-driven decisions: Make informed choices based on user feedback.

Disadvantages:

  • Complexity: Requires managing multiple versions simultaneously.

  • Resource usage: Higher resource consumption due to running multiple versions.

Similar to canary deployment, split traffic between version v1 and version v2. After deployment, monitor user feedback and performance metrics to determine the best version.

Conclusion

Choosing the right deployment strategy in Kubernetes is crucial, as each method offers its own benefits and drawbacks. Your decision should hinge on your application's specific needs, your team's expertise with Kubernetes, and the resources at your disposal. Whether you prioritize seamless updates with zero downtime using Rolling Updates, straightforward deployments with Recreate, reliable rollbacks with Blue/Green, gradual feature releases with Canary deployments, or data-driven insights from A/B Testing, Kubernetes provides versatile tools to suit every scenario.

Mastering these deployment strategies empowers you to effectively manage your applications in Kubernetes, ensuring smooth operations and quick responses to changes. So, dive in, experiment, and find the strategy that best fits your deployment needs. Happy deploying! ๐Ÿš€

0
Subscribe to my newsletter

Read articles from Jyothi Ram directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Jyothi Ram
Jyothi Ram