Microservices on Kubernetes with Docker Desktop
2 min readMar 21, 2024
Scenario: Publish 4 microservices on Kubernetes with Docker Desktop
Tech stack: .NET Core, Visual Studio, Kubernetes on Docker Desktop (on Windows)
GitHub: Ecommerce — Kubernetes Run
(1) Docker desktop includes standalone Kubernetes server and client.
(2) Services and data flow example are similar to explanation in Microservices on Docker Desktop.
- CustomerService
- OrderService
- ProductService
- SearchService
(3) Kubernetes YAML files
- searchservice-deploy.yml
## Includes endpoints for customerservice, orderservice and productservice
## searchservice docker image is loaded from Local registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: searchservice
spec:
replicas: 1
template:
metadata:
labels:
app: searchservice
spec:
containers:
- name: searchservice
image: localhost:5000/searchservice:latest
imagePullPolicy: Always
ports:
- containerPort: 30003
env:
- name: ASPNETCORE_URLS
value: http://*:30003
- name: CustomersUrl
value: http://customerservice
- name: ProductsUrl
value: http://productservice
- name: OrdersUrl
value: http://orderservice
selector:
matchLabels:
app: searchservice
---
apiVersion: v1
kind: Service
metadata:
name: searchservice
spec:
type: LoadBalancer
ports:
- port: 30003
selector:
app: searchservice
- customerservice-deploy.yml
## customerservice docker image is loaded from Local registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: customerservice #default dns name
spec:
replicas: 1
template:
metadata:
labels:
app: customerservice
spec:
containers:
- name: customerservice
image: localhost:5000/customerservice:latest
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: ASPNETCORE_URLS
value: http://*:80
selector:
matchLabels:
app: customerservice
---
apiVersion: v1
kind: Service
metadata:
name: customerservice
spec:
ports:
- port: 80
type: LoadBalancer
selector:
app: customerservice
- orderservice-deploy.yml
## orderservice docker image is loaded from Local registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: orderservice #default dns name
spec:
replicas: 1
template:
metadata:
labels:
app: orderservice
spec:
containers:
- name: orderservice
image: localhost:5000/orderservice:latest
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: ASPNETCORE_URLS
value: http://*:80
selector:
matchLabels:
app: orderservice
---
apiVersion: v1
kind: Service
metadata:
name: orderservice
spec:
ports:
- port: 80
type: ClusterIP
selector:
app: orderservice
- productservice-deploy.yml
## productservice docker image is loaded from Local registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productservice #default dns name
spec:
replicas: 1
template:
metadata:
labels:
app: productservice
spec:
containers:
- name: productservice
image: localhost:5000/productservice:latest
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: ASPNETCORE_URLS
value: http://*:80
selector:
matchLabels:
app: productservice
---
apiVersion: v1
kind: Service
metadata:
name: productservice
spec:
ports:
- port: 80
type: ClusterIP
selector:
(3) Local registry setup
- Creating local registry in Docker Desktop provides a store for docker images.
- Kubernetes YAML files are setup to load docker images from the local registry.
## create registry
docker run -d -p 5000:5000 --restart=always --name registry registry:2
## build and push docker images to registry
docker build -t productservice .
docker tag productservice localhost:5000/productservice
docker push localhost:5000/productservice
docker build -t customerservice .
docker tag customerservice localhost:5000/customerservice
docker push localhost:5000/customerservice
docker build -t orderservice .
docker tag orderservice localhost:5000/orderservice
docker push localhost:5000/orderservice
docker build -t searchservice .
docker tag searchservice localhost:5000/searchservice
docker push localhost:5000/searchservice
(4) Deploy services to Kubernetes on Docker Desktop (after registry is setup)
kubectl apply -f customerservice-deploy.yml
kubectl apply -f productservice-deploy.yml
kubectl apply -f orderservice-deploy.yml
kubectl apply -f searchservice-deploy.yml
(5) Call SearchService
Post HTTP: http://localhost/api/search
Body:
{
"customerId": 1
}