deploying-a-flask-application-using-docker-and-kubernetes.html

Deploying a Flask Application Using Docker and Kubernetes

In today's rapidly evolving tech landscape, deploying applications efficiently and reliably is paramount. Flask, a popular micro web framework for Python, is often chosen for building web applications due to its simplicity and flexibility. In this article, we will explore how to deploy a Flask application using Docker and Kubernetes, two powerful tools that streamline the deployment process and enhance scalability.

What is Flask?

Flask is a lightweight web framework that allows developers to create web applications quickly and with minimal overhead. It provides the essentials needed to build web applications, such as routing and request handling, without imposing a strict structure. This flexibility makes Flask suitable for projects of various sizes, from small prototypes to large-scale applications.

Why Use Docker and Kubernetes?

Docker

Docker is a platform that simplifies the process of building, running, and managing applications in containers. Containers package software and its dependencies into a single executable unit, ensuring that your application runs consistently across different environments.

Benefits of Docker include:

  • Consistency: Run the same application on any platform.
  • Isolation: Containerized applications are isolated from each other.
  • Scalability: Easily scale your application to handle more traffic by running multiple containers.

Kubernetes

Kubernetes (K8s) is an open-source container orchestration platform that automates deploying, scaling, and managing containerized applications. It allows you to manage clusters of containers, ensuring that your application remains available and responsive.

Key features of Kubernetes:

  • Automated Scaling: Scale applications up or down based on demand.
  • Load Balancing: Distribute traffic among multiple containers.
  • Self-healing: Automatically restart or replace containers that fail.

Setting Up Your Flask Application

Step 1: Create a Basic Flask Application

Let’s start by creating a simple Flask application. Create a new directory for your project and add a file named app.py:

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Flask with Docker and Kubernetes!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Step 2: Create a Requirements File

Next, create a requirements.txt file that lists the dependencies:

Flask==2.0.1

Step 3: Create a Dockerfile

Now, let’s create a Dockerfile to define how our Flask application will be built into a Docker image:

# Dockerfile
FROM python:3.9-slim

# Set the working directory
WORKDIR /app

# Copy the requirements file
COPY requirements.txt .

# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy the application code
COPY app.py .

# Expose the port the app runs on
EXPOSE 5000

# Command to run the application
CMD ["python", "app.py"]

Step 4: Build Your Docker Image

Open your terminal, navigate to your project directory, and build your Docker image using the following command:

docker build -t flask-app .

Step 5: Run Your Docker Container

After building the image, run a container from it:

docker run -p 5000:5000 flask-app

You should now be able to access your Flask application at http://localhost:5000.

Deploying with Kubernetes

Step 6: Create a Kubernetes Deployment

To deploy your application on Kubernetes, you'll need to create a deployment configuration file, usually in YAML format. Create a file named deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: flask-app
  template:
    metadata:
      labels:
        app: flask-app
    spec:
      containers:
      - name: flask-app
        image: flask-app:latest
        ports:
        - containerPort: 5000

Step 7: Create a Kubernetes Service

To expose your Flask application, you’ll need a service configuration. Create a file named service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: flask-app
spec:
  type: NodePort
  ports:
    - port: 5000
      targetPort: 5000
      nodePort: 30001
  selector:
    app: flask-app

Step 8: Deploy to Kubernetes

Ensure you have access to a Kubernetes cluster. If you're using Minikube, start it with:

minikube start

Now, deploy your application using the following commands:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Step 9: Access Your Application

Once deployed, you can access your application using the NodePort specified in your service. If you are using Minikube, run the following command to get the URL:

minikube service flask-app --url

Troubleshooting Common Issues

  1. Container Fails to Start: Check logs for errors using: bash kubectl logs <pod-name>

  2. Service Not Accessible: Ensure the service type is set correctly (NodePort) and check the port mappings.

  3. Deployment Issues: Review the deployment status using: bash kubectl get deployments

Conclusion

Deploying a Flask application using Docker and Kubernetes is a robust solution that enhances the scalability and reliability of your applications. By leveraging the power of containers, you ensure that your app runs consistently across different environments, while Kubernetes provides the orchestration needed to manage and scale your application effectively.

With this guide, you now have a clear pathway to deploy your Flask applications using Docker and Kubernetes. Happy coding and deploying!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.