Python Microservice: K8S deployment
Now It is time to change from docker-compose to deploy into Kubernetes.
As this is not new to me to deploy microservice into K8S, also I already have a running Kubernetes cluster in hand, so here I will just create docker images for the 3 services: API gateway, user and order, then push them into the docker hub repository, then create Kubernetes manifest for deployment and service.
# Folder structure
/07-with-k8s
.
├── api_gateway.py
├── depolyment.yaml
├── Dockerfile_apigateway
├── Dockerfile_order
├── Dockerfile_user
├── order_service.py
└── user_service.py
# Build, tag and push the docker images
docker login
docker build -t zackz001/python-user:latest -f Dockerfile_user .
docker build -t zackz001/python-order:latest -f Dockerfile_order .
docker build -t zackz001/python-apigateway:latest -f Dockerfile_apigateway .
docker push zackz001/python-apigateway:latest
docker push zackz001/python-user:latest
docker push zackz001/python-order:latest
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
zackz001/python-apigateway latest bc3db11f4be8 1 hours ago 138MB
zackz001/python-user latest c93973bece33 1 hours ago 136MB
zackz001/python-order latest e35d5de9254b 1 hours ago 136MB
prom/prometheus latest 1bd2b9635267 8 days ago 271MB
grafana/grafana latest c42c21cd0ebc 3 weeks ago 453MB
consul 1.15.4 686495461132 4 months ago 155MB
docker.elastic.co/elasticsearch/elasticsearch 7.13.2 11a830014f7c 3 years ago 1.02GB
docker.elastic.co/logstash/logstash 7.13.2 8dc1af4dd662 3 years ago 965MB
docker.elastic.co/kibana/kibana 7.13.2 6c4869a27be1 3 years ago 1.35GB
# k8s deployment Manifests
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
replicas: 1
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: zackz001/python-user:latest
ports:
- containerPort: 5001
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- protocol: TCP
port: 5001
targetPort: 5001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 1
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: zackz001/python-order:latest
ports:
- containerPort: 5002
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order-service
ports:
- protocol: TCP
port: 5002
targetPort: 5002
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
spec:
replicas: 1
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
spec:
containers:
- name: api-gateway
image: zackz001/python-apigateway:latest
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: api-gateway
spec:
type: NodePort
selector:
app: api-gateway
ports:
- protocol: TCP
port: 5000
targetPort: 5000
Now Run kubectl apply -f to bring all deployments and services up and running. Should see all services in the Rancher console.
kubectl create ns python kubectl apply -f depolyment.yaml -n python kubectl get all -n python NAME READY STATUS RESTARTS AGE pod/api-gateway-d664cf8c4-7l7q8 1/1 Running 2 (50m ago) 1h pod/order-service-856577f666-gk5gt 1/1 Running 2 (50m ago) 1h pod/user-service-5d8766d9cb-4rqnz 1/1 Running 2 (50m ago) 1h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/api-gateway NodePort 10.43.38.275000:32060/TCP 1h service/order-service ClusterIP 10.43.27.255 5002/TCP 1h service/user-service ClusterIP 10.43.160.232 5001/TCP 1h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/api-gateway 1/1 1 1 1h deployment.apps/order-service 1/1 1 1 1h deployment.apps/user-service 1/1 1 1 1h NAME DESIRED CURRENT READY AGE replicaset.apps/api-gateway-d664cf8c4 1 1 1 1h replicaset.apps/order-service-856577f666 1 1 1 1h replicaset.apps/user-service-5d8766d9cb 1 1 1 1h
Verify API gateway, user and order services
Access API gateway via http://NodeIP:NodePort/users and http://NodeIP:NodePort/orders
Conclusion
Now we complete all Python Flask sessions.
I have done this End-to-End Python Microservice application solution development, which enhanced my DevOps practices of Python programming, microservices architecture design and deployment with docker-compose, API Gateway implementation, service registery with Consul, logging and monitoring, and finally Kubernetes deployment.
- simple Python Flask app
- Microservice applications with user and order
- Create API gateway Flask app
- Service registery with Consul
- Logging with ELK
- Monitoring with Prometheus and Grafana
- K8S deployment