project/
├── customer-service/
│ ├── main.go
│ └── Dockerfile
├── order-service/
│ ├── main.go
│ └── Dockerfile
├── k8s/
│ ├── customer-deployment.yaml
│ ├── customer-service.yaml
│ ├── order-deployment.yaml
│ ├── order-service.yaml
│ ├── ingress.yaml
│ ├── tls-secret.yaml
│ └── monitoring/
│ ├── prometheus-config.yaml
│ ├── prometheus-deployment.yaml
│ ├── grafana-deployment.yaml
│ └── grafana-service.yaml
# customer-service/main.go
package main
import (
"encoding/json"
"net/http"
)
type Customer struct {
ID string `json:"id"`
Name string `json:"name"`
}
func handler(w http.ResponseWriter, r *http.Request) {
customer := Customer{ID: "1", Name: "John Doe"}
json.NewEncoder(w).Encode(customer)
}
func main() {
http.HandleFunc("/customer", handler)
http.ListenAndServe(":8080", nil)
}
# order-service/main.go
package main
import (
"encoding/json"
"net/http"
)
type Order struct {
ID string `json:"id"`
CustomerID string `json:"customerId"`
Amount int `json:"amount"`
}
func handler(w http.ResponseWriter, r *http.Request) {
order := Order{ID: "100", CustomerID: "1", Amount: 250}
json.NewEncoder(w).Encode(order)
}
func main() {
http.HandleFunc("/order", handler)
http.ListenAndServe(":8080", nil)
}
# customer-service/Dockerfile
FROM golang:1.20
WORKDIR /app
COPY . .
RUN go build -o customer-service
CMD ["./customer-service"]
# order-service/Dockerfile
FROM golang:1.20
WORKDIR /app
COPY . .
RUN go build -o order-service
CMD ["./order-service"]
# k8s/customer-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: customer-deployment
spec:
replicas: 1
selector:
matchLabels:
app: customer
template:
metadata:
labels:
app: customer
spec:
containers:
- name: customer
image: your-dockerhub-username/customer-service:latest
ports:
- containerPort: 8080
# k8s/customer-service.yaml
apiVersion: v1
kind: Service
metadata:
name: customer-service
spec:
selector:
app: customer
ports:
- protocol: TCP
port: 80
targetPort: 8080
# k8s/order-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-deployment
spec:
replicas: 1
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
containers:
- name: order
image: your-dockerhub-username/order-service:latest
ports:
- containerPort: 8080
# k8s/order-service.yaml
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order
ports:
- protocol: TCP
port: 80
targetPort: 8080
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservices-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- your-domain.com
secretName: tls-secret
rules:
- host: your-domain.com
http:
paths:
- path: /customer
pathType: Prefix
backend:
service:
name: customer-service
port:
number: 80
- path: /order
pathType: Prefix
backend:
service:
name: order-service
port:
number: 80
# k8s/tls-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
type: kubernetes.io/tls
data:
tls.crt: <base64-encoded-cert>
tls.key: <base64-encoded-key>
# k8s/monitoring/prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
labels:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'customer-service'
static_configs:
- targets: ['customer-service:8080']
- job_name: 'order-service'
static_configs:
- targets: ['order-service:8080']
# k8s/monitoring/prometheus-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus
ports:
- containerPort: 9090
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus/
volumes:
- name: config-volume
configMap:
name: prometheus-config
# k8s/monitoring/grafana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana
ports:
- containerPort: 3000
# k8s/monitoring/grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
selector:
app: grafana
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
No comments:
Post a Comment