before proceeding i would suggest you to go through the setup of k3s in raspberry pi
now we will create a simple flask app and create a docker image out of it
note:- (all the below code is written in your local system and deployed to raspberrypi)
first we will create a project folder
mkdir flask-project cd flask-project
now inside the flask project lets create app.py
and paste the following code
app.py
# app.py from flask import Flask, render_template import os app = Flask(__name__) @app.route('/') def index(): return render_template("index.html"), 200 if __name__ == "__main__": app.run(host='0.0.0.0', port=os.environ.get("PORT", 8000))
templates/index.html
# templates/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Hello World</title> </head> <body> <h1>This is a sample flask project.</h1> </body> </html>
requirements.txt
flask
now lets create a Docker file for our project
FROM python:3-alpine WORKDIR /app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV PORT 80 CMD ["python", "app.py"]
this is a simple docker file which runs our flask application
now we will create a simple shell script to build and push our dockerfile to dockerhub
build.sh
docker build . -t flask-starter docker tag flask-starter:latest <username>/flask-starter docker push <username>/flask-starter
you can replace username
with the dockerhub username
once you create the shell script run it by the following command it will push the docker image to the docker hub
sh ./build.sh # [out]
in my case you can find the docker image at rohit20001221/flask-starter
pi@raspberrypi:~/starter-app-kubernetes-tutorial $ sudo sh build-docker.sh Sending build context to Docker daemon 72.19kB Step 1/7 : FROM python:3-alpine ... ... Successfully tagged flask-starter:latest Using default tag: latest The push refers to repository [docker.io/rohit20001221/flask-starter]
now lets start creating out config files for our kubernetes
create a folder called k8s in your project directory
inside the k8s
folder create flask-starter.yaml
flask-starter.yaml
--- apiVersion: apps/v1 kind: Deployment metadata: name: flask-starter labels: app: flask spec: replicas: 3 selector: matchLabels: app: flask template: metadata: labels: app: flask spec: containers: - name: flask-starter image: rohit20001221/flask-starter:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: flask-starter spec: selector: app: flask ports: - protocol: TCP port: 8080 targetPort: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: flask-starter-ingress spec: rules: - host: "raspberrypi.local" http: paths: - pathType: Prefix path: "/" backend: service: name: flask-starter port: number: 8080
the yaml file contains 3 parts
1. Deployment
the main purpose of deployments is to create pods and manage them
it has the following functionalities
1. creating replica set -> we can run multiple instances of our app
2. auto healing -> if any our our pod's go down the deployment will spin up new instances of our pod
as you can see in the above deployment we created 3 replica sets and assigned each replica set a label
and also we have mentioned the docker hub image name to tell the deployment from where it can find our application code
2. Service
In simple words we can think of Service as a discovery server with the help of which we can access our application pod's
as you can see above we need to specify the app label
which we created in the deployment in the service and also we have to specify the port number at which our application pods run
3. Ingress controller
Ingress controller exposes our application to the external world through a domain since the raspberry pi can be accessed through raspberrypi.local
we will assign it as the host name
and we will define the service which we want to expose along with the port number of that service
by path: /
we are telling the Ingress controller
that what ever requests come to the following url http://raspberrypi.local/
we must send that request to our service flask-starter
now its time to deploy the application cd into the k8s folder
cd ./k8s
and run the following command
kubectl apply -f flask-starter.yaml
now our flask app is deployed to the raspberry pi you can verify by SSH
'ing into the pi and running the following command
# inside raspberry pi pi@raspberrypi:~ $ sudo kubectl get pods NAME READY STATUS RESTARTS AGE flask-starter-5f5bf855dc-ljctk 1/1 Running 0 6s flask-starter-5f5bf855dc-tnzbt 1/1 Running 0 6s flask-starter-5f5bf855dc-5p86s 1/1 Running 0 6s
now open your browser and type http://raspberry.local
and you will see that our flask app has opened
Top comments (0)