how-to-deploy-a-fastapi-application-using-docker-and-kubernetes.html

How to Deploy a FastAPI Application Using Docker and Kubernetes

In the world of modern web development, deploying applications efficiently and reliably is paramount. FastAPI, a modern, high-performance web framework for building APIs with Python 3.6+ based on standard Python type hints, pairs beautifully with containerization technologies like Docker and orchestration tools like Kubernetes. In this article, we’ll walk through the process of deploying a FastAPI application using Docker and Kubernetes, complete with code examples and actionable insights.

What is FastAPI?

FastAPI is an asynchronous web framework designed for building APIs quickly and with less code. Its automatic generation of OpenAPI and JSON Schema documentation makes it an excellent choice for developers looking to create RESTful APIs. The framework’s performance, which is comparable to Node.js and Go, makes it an attractive option for high-load applications.

Use Cases for FastAPI

  • Microservices Architecture: FastAPI is ideal for developing microservices due to its lightweight nature and fast performance.
  • Data Science and Machine Learning: FastAPI can serve machine learning models efficiently with its asynchronous capabilities.
  • Real-time Applications: With support for WebSockets, FastAPI is suitable for building real-time applications like chat apps or live notifications.

Prerequisites

Before we get started, ensure you have the following tools installed:

  • Python 3.6+
  • Docker
  • Kubernetes (Minikube or any other cluster)
  • kubectl (Kubernetes command-line tool)

Step 1: Create a Simple FastAPI Application

Let's begin by creating a simple FastAPI application. Create a new directory for your project:

mkdir fastapi-docker-k8s
cd fastapi-docker-k8s

Next, create a file named main.py and add the following code:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

Requirements File

Create a requirements.txt file to list the dependencies:

fastapi
uvicorn

Step 2: Dockerize the FastAPI Application

To deploy our FastAPI app using Docker, we need to create a Dockerfile. In the same directory, create a Dockerfile with the following content:

# Use the official Python image from the Docker Hub
FROM python:3.9

# Set the working directory
WORKDIR /app

# Copy requirements and install
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy the FastAPI app
COPY . .

# Expose the port that the app runs on
EXPOSE 8000

# Command to run the FastAPI app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

Build the Docker Image

Run the following command to build your Docker image:

docker build -t fastapi-app .

Run the Docker Container

You can test your application locally using Docker:

docker run -d -p 8000:8000 fastapi-app

Visit http://localhost:8000 in your browser, and you should see the JSON response {"Hello": "World"}.

Step 3: Prepare for Kubernetes Deployment

To deploy our FastAPI application to Kubernetes, we need to create a deployment YAML file. Create a file named deployment.yaml:

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

Create a Service

Next, we need to expose our FastAPI application using a service. Create a file named service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: fastapi-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8000
  selector:
    app: fastapi

Step 4: Deploy to Kubernetes

  1. Start Minikube (if using Minikube):

bash minikube start

  1. Deploy the FastAPI Application:

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

  1. Check the Pods:

You can check the status of your pods with:

bash kubectl get pods

  1. Access the Application:

If you are using Minikube, you can access your application with:

bash minikube service fastapi-service

This command will provide you with a URL that you can open in your browser to see your FastAPI application in action.

Troubleshooting Common Issues

  • Pod Fails to Start: Check the logs of the pod for errors using kubectl logs <pod-name>.
  • Service Not Accessible: Ensure that the service type is set correctly to LoadBalancer, and use the correct port mappings.

Conclusion

Deploying a FastAPI application using Docker and Kubernetes can significantly enhance your development workflow and deployment strategies. By leveraging the power of containerization and orchestration, you can ensure that your applications are scalable, maintainable, and resilient. With the steps outlined in this guide, you should now be equipped to deploy your own FastAPI applications efficiently. Happy coding!

SR
Syed
Rizwan

About the Author

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