How to Deploy a Django Todo App on AWS EC2 Using Kubernetes

Urvish SuhagiyaUrvish Suhagiya
4 min read

In this article, I'll guide you step-by-step through the process of deploying a Django Todo application on AWS EC2 using a Kubeadm Kubernetes cluster. This guide is perfect for new learners who want to understand the basics of deploying applications in a scalable and resilient environment.

1. Introduction

Deploying applications in the cloud using Kubernetes provides several advantages, including auto-scaling and auto-healing capabilities. This means your application can handle varying loads and recover from failures without manual intervention. In this tutorial, we'll use a Django Todo app, AWS EC2, and Kubernetes to demonstrate these concepts.

2. Prerequisites

Before we start, make sure you have the following:

  • An AWS account

  • Basic knowledge of Django and Python

  • Familiarity with the command line interface

  • Git installed on your local machine

3. Getting the Django Full Stack Application from GitHub

First, we need to obtain a Django Todo application from GitHub. You can use any Django application, but for this tutorial, we’ll use a sample Django Todo app.

  1. Clone the Repository: Open your terminal and run the following command to clone the repository:

     git clone https://github.com/username/django-todo-app.git
     cd django-todo-app
    
  2. Set Up the Virtual Environment: Create and activate a virtual environment:

     python3 -m venv venv
     source venv/bin/activate  # On Windows use `venv\Scripts\activate`
    
  3. Install Dependencies: Install the required dependencies using pip:

     pip install -r requirements.txt
    
  4. Run the Application Locally: Ensure everything is working by running the application locally:

     shCopy codepython manage.py runserver
    

    Visit http://127.0.0.1:8000 in your browser to check if the application is running correctly.

4. Setting Up the Kubernetes Cluster Using Kubeadm

Next, we'll set up a Kubernetes cluster using Kubeadm. Kubernetes clusters can be set up on various platforms, but for this tutorial, we'll use AWS EC2 instances.

  1. Launch EC2 Instances:

    • Go to the AWS Management Console.

    • Launch a few EC2 instances (one master and at least two worker nodes) with a suitable Linux distribution (e.g., Ubuntu 20.04).

  2. Install Docker: On each instance, install Docker, which is required for Kubernetes:

     sudo apt-get update
     sudo apt-get install -y docker.io
    
  3. Install Kubeadm, Kubelet, and Kubectl: On each instance, install the necessary Kubernetes components:

     sudo apt-get update
     sudo apt-get install -y apt-transport-https ca-certificates curl
     sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
     sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
     sudo apt-get update
     sudo apt-get install -y kubelet kubeadm kubectl
     sudo apt-mark hold kubelet kubeadm kubectl
    
  4. Initialize the Kubernetes Master Node: On the master node, initialize the cluster:

     sudo kubeadm init
    

    Follow the instructions provided after initialization to set up kubectl for the current user:

     mkdir -p $HOME/.kube
     sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
     sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  5. Join Worker Nodes to the Cluster: On each worker node, run the command provided by kubeadm init on the master node to join them to the cluster. It looks something like this:

     sudo kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
    
  6. Deploy a Network Add-On: To enable communication between nodes, deploy a network add-on (e.g., Calico):

     kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    

5. Setting Up Deployment and Service for Kubernetes

Now, we need to create Kubernetes manifests to deploy and expose our Django application.

  1. Create a Docker Image: First, create a Docker image of your Django application.

     # Dockerfile
     FROM python:3.8-slim
    
     WORKDIR /app
     COPY . /app
    
     RUN pip install -r requirements.txt
    
     CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
    

    Build and push the Docker image to a container registry (e.g., Docker Hub).

     docker build -t <your-dockerhub-username>/django-todo-app .
     docker push <your-dockerhub-username>/django-todo-app
    
  2. Create Kubernetes Manifests: Create YAML files for Deployment and Service.

     # deployment.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: django-todo-app
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: django-todo-app
       template:
         metadata:
           labels:
             app: django-todo-app
         spec:
           containers:
           - name: django-todo-app
             image: <your-dockerhub-username>/django-todo-app
             ports:
             - containerPort: 8000
    
     # service.yaml
     apiVersion: v1
     kind: Service
     metadata:
       name: django-todo-app
     spec:
       type: LoadBalancer
       selector:
         app: django-todo-app
       ports:
       - protocol: TCP
         port: 80
         targetPort: 8000
    
  3. Apply the Manifests: Deploy the application to the Kubernetes cluster.

     kubectl apply -f deployment.yaml
     kubectl apply -f service.yaml
    
  4. Access the Application: Once the service is up, you can access your Django application through the external IP provided by the LoadBalancer service.

6. Conclusion

Congratulations! You have successfully deployed a Django Todo application on AWS EC2 using a Kubeadm Kubernetes cluster. This setup ensures that your application is scalable and resilient, thanks to Kubernetes' auto-scaling and auto-healing capabilities.

By following this guide, you’ve learned how to:

  • Set up a Kubernetes cluster

  • Deploy a Django application using Kubernetes

  • Configure a service to expose your application

3
Subscribe to my newsletter

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

Written by

Urvish Suhagiya
Urvish Suhagiya

Exploring the world of DevOps 🌐.