Skip to content

AlvaroRaul7/kubernetes-fastapi-traefik

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

kubernetes-fastapi-traefik

Backend API (Python) in FastApi in a Kubernetes Cluster using Traefik as an API Gateway and Ansible as a configuration management tool.

Description of the directories

  • ansible : Folder with the resources to deploy the traefik pods using Ansible
  • kubernetes: Folder with the YAML files to deploy the API and the Postgres Database
  • sa-service-2: Folder with the source code of the API

Requirements for installing the project

To install python libraries run Eg: pip install openshift

  • Helm V3 (Kubernetes Package Manager) To install run brew install helm

1.- Steps to start the K8s cluster

After installing everything above and running Docker Desktop in your PC Run in your terminal:

2.- Steps to deploy Traefik using Ansible

The Traefik Service is managed by using Ansible, so you can open the file ansible/templates/traefik_values_default.yml.j2 where you can check that the type of deployment is a DaemonSet

  • Traefik listens on port 80 on all interfaces of the host for incoming HTTP requests
  • Traefik listens on port 443 on all interfaces of the host for incoming HTTPS request
  • Traefik dashboard is enabled and is not exposed to the public internet.

Ports exposed:

  
  # To access the dashboard you can use "kubectl port-forward" e.g.:
  # kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
  # Opening http://localhost:9000/dashboard/ should show the dashboard.
  traefik:
    port: 9000
    expose: true
    protocol: TCP

Resources:

# reasonable values in case of a memory leak e.g.
resources:
  requests:
    cpu: "100m"
    memory: "50Mi"
  limits:
    cpu: "300m"
    memory: "150Mi"

In the ansible/defaults/main.yml, you can change the namespace for the deployment (Traefik) , name for the ingress controller,etc.

The ansible playbook will detect these settings and apply them to the cluster when it runs the playbook.

In the ansible/k8s.yml you can look that the host is traefik. to recognize this dns we need to edit the /etc/ansible/hosts file. ** If you don’t have the file or folder, please create it using sudo mkdir /etc/ansible and sudo touch hosts then edit it: and paste this:

[traefik]
localhost

We are telling Ansible that the traefik dns will translate to localhost

After doing this we are ready to deploy:

To deploy the Traefik Service in the traefik namespace:

  • cd ansible
  • ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml

One of the final tasks is called TASK [githubixx.traefik-kubernetes : Output rendered template]. This allows to check the YAML file before Traefik gets deployed If everything is OK , run kubectl -n traefik get pods -o wide and you will see a pod with the traefik initials.

To forward the ports to check the traefik dashboard, run: kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000

Open: http://localhost:9000/dashboard/#/http/services to check that everything is working correctly.

Steps to deploy the Postgres Database

To deploy the database in the K8s cluster, we are going to use diferent YAML files.

  • cd kubernetes

In this folder, there are 4 YAML files for the Postgres Deployment.

  • postgres-configmap.yaml A K8s ConfigMap allows me to save important variables like the name of the db, POSTGRES_USER, POSTGRES_PASSWORD.
  • postgres-storage.yaml 2 different kinds of volume: PersistentVolume and PersistentVolumeClaim used to preserve the data if a pod is deleted.
  • postgres-service.yaml A K8s Service that allows me to connect to the Postgres DB and with other pods in the same cluster.
  • postgres-deployment.yaml A K8s Deployment with a Postgres 10.1 image.

In the kubernetes folder:

Run:

  • kubectl apply -f postgres-configmap.yaml

  • kubectl apply -f postgres-storage.yaml

  • kubectl apply -f postgres-deployment.yaml

  • kubectl apply -f postgres-service.yaml

  • If you run kubectl get all you can check that everything is deployed.

  • Run kubectl port-forward --namespace default svc/postgres-ip-service 5432:5432 to port forwarding and access the database using localhost:5432

  • Connect to the database using your favorite DB client like Datagrip, DBeaver,etc.

Inside the users database, run this query:

CREATE TABLE rappiuser (
	user_id serial PRIMARY KEY,
	name VARCHAR ( 50 ) UNIQUE NOT NULL,
	lastname VARCHAR ( 50 ) NOT NULL,
	address VARCHAR ( 250 ) NOT NULL,
	phone INTEGER NOT NULL,
	age  INTEGER NOT NULL,
	hire_date DATE,
	fire_date DATE


);

That’s all for the db configuration.

Steps to deploy the FastApi Backend

Finally, the last step is deploying the API.

  • cd sa-service-2

Inside the app folder you can check that is structured in models, schemas, services and utils with a main.py file that contains the routes.

Inside the sa-service-2 folder, run:

  • minikube image build -t sa-service-2 .

This command upload the backend image to the minikube local registry, to use it for the deployment.

  • cd .. return to the previous dir.
  • kubectl apply -f resource-manifests/service-two.yml Apply a Deployment, Service and an Ingress Controller.

Deployment:

Define the name for the deployment, and the image that will be used sa-service-2.

Service:

Define the port that will be exposed in this case is the Port 80

Ingress:

The Ingress Controller will be handled by Traefik and will listen in the port 80

Now you can go to http://localhost/docs and start testing the API :)

In the http://localhost:9000/dashboard/#/http/services you can check there is a new ingress controller that handles 2 pods

About

Backend API (Python) in FastApi in a Kubernetes Cluster using Traefik as an API Gateway and Ansible as a configuration management tool.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published