This repository contains code that deploys two microservices, i.e:-
- Deploys a Flask API to add, delete and modify users in the MySQL database
- Deploys a MySQL server on kubernetes cluster
- Attaches a persistent volume to it, so the data remains contained if pods are restarting
- Have
Docker
andKubernetes CLI (kubectl)
installed together withMinikube
.
- Clone the repository
- Configure
Docker
to use theDocker daemon
in your kubernetes cluster via your terminal:eval $(minikube docker-env)
- Pull the latest mysql image from Dockerhub:
Docker pull mysql
- Build a kubernetes-api image with the Dockerfile in this repo:
Docker build . -t flask-api
Kubernetes Secrets can store and manage sensitive information. For this example we will define a password for the root
user of the MySQL
server using the Opaque
secret type.
- Encode your password in your terminal:
echo -n super-secret-password | base64
- Add the output to the
flask-secrets.yml
file at thedb_root_password
field
- Add the secrets to your
kubernetes cluster: kubectl apply -f flask-secrets.yml
- Create the
persistent volume
andpersistent volume claim
for the database:kubectl apply -f mysql-pv.yml
- Create the MySQL deployment:
kubectl apply -f mysql-deployment.yml
- Create the Flask API deployment:
kubectl apply -f flaskapp-deployment.yml
- Connect to your
MySQL database
by setting up a temporary pod as a mysql-client:kubectl run -it --rm --image=mysql --restart=Never mysql-client -- mysql --host mysql --password=<super-secret-password>
- Create the database and table
CREATE DATABASE flaskapi;
USE flaskapi;
USE flaskapi;
CREATE TABLE users(user_id PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(255), user_email VARCHAR(255), user_password VARCHAR(255));
The Flask API can be exposed and accessed by using: minikube service flask-service
command. This returns a URL which you
can paste in the browser and see a Welcome to my Flask Api
message. You can use this service_URL
to make requests to
the API
You can use the API to perform create, read, update and delete
operations to your database. You can use postman or curl
- Add a user:
curl -H "Content-Type: application/json" -d '{"name": "<user_name>", "email": "<user_email>", "password": "<user_password>"}' <service_URL>/add_user
- Get all users:
curl <service_URL>/get_users
- Get details of a specific user:
curl <service_URL>/get_user/<user_id>
- Delete a user by user_id:
curl -H "Content-Type: application/json" <service_URL>/delete_user/<user_id>
- update a user's information:
curl -H "Content-Type: application/json" -d {"name": "<user_name>", "email": "<user_email>", "password": "<user_password>", "user_id": <user_id>} <service_URL>/update_user