Deployment Overview
Kratos services can be deployed in various environments:- Docker containers - Containerized deployment
- Kubernetes - Orchestrated container deployment
- Traditional VMs - Binary deployment on virtual machines
- Serverless - Function-as-a-Service platforms
Docker Deployment
# Build stage
FROM golang:1.21-alpine AS builder
WORKDIR /src
# Copy go mod files
COPY go.mod go.sum ./
RUN go mod download
# Copy source code
COPY . .
# Build binary
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo \
-ldflags '-extldflags "-static" -w -s' \
-o /app/server ./cmd/server
# Runtime stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app
# Copy binary from builder
COPY --from=builder /app/server .
COPY --from=builder /src/configs ./configs
# Create non-root user
RUN addgroup -g 1000 app && \
adduser -D -u 1000 -G app app && \
chown -R app:app /app
USER app
EXPOSE 8000 9000
ENTRYPOINT ["./server"]
CMD ["-conf", "./configs"]
# Build image
docker build -t myservice:latest .
# Tag for registry
docker tag myservice:latest registry.example.com/myservice:v1.0.0
# Push to registry
docker push registry.example.com/myservice:v1.0.0
version: '3.8'
services:
app:
build: .
ports:
- "8000:8000"
- "9000:9000"
environment:
- KRATOS_SERVER_HTTP_ADDR=:8000
- KRATOS_SERVER_GRPC_ADDR=:9000
- KRATOS_DATA_DATABASE_SOURCE=root:root@tcp(mysql:3306)/mydb
- KRATOS_DATA_REDIS_ADDR=redis:6379
depends_on:
- mysql
- redis
networks:
- app-network
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=mydb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:7-alpine
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
Kubernetes Deployment
Deployment Manifest
Create a Kubernetes deployment:k8s/deployment.yaml
Service Manifest
Expose your deployment:k8s/service.yaml
ConfigMap
Store configuration in ConfigMaps:k8s/configmap.yaml
Secrets
Store sensitive data in Secrets:k8s/secret.yaml
Ingress
Expose HTTP service externally:k8s/ingress.yaml
Deploy to Kubernetes
Apply manifests:Helm Charts
Create Helm Chart
Package your deployment as a Helm chart:helm/myservice/Chart.yaml
helm/myservice/values.yaml
Auto-Scaling
Horizontal Pod Autoscaler
k8s/hpa.yaml
Health Checks
Implement Health Endpoints
internal/server/http.go
Monitoring and Observability
Prometheus Metrics
Expose Prometheus metrics:ServiceMonitor
k8s/servicemonitor.yaml
CI/CD Pipeline
GitHub Actions
.github/workflows/deploy.yml
Best Practices
Immutable Infrastructure
Use immutable container images with version tags
Resource Limits
Always set resource requests and limits
Health Checks
Implement proper liveness and readiness probes
Graceful Shutdown
Handle SIGTERM signals for graceful shutdown
Configuration
Use ConfigMaps and Secrets for configuration
Observability
Add logging, metrics, and tracing
Graceful Shutdown
Implement graceful shutdown:- SIGINT and SIGTERM signals
- Server graceful shutdown
- Service deregistration
- Resource cleanup
Next Steps
Monitoring
Set up monitoring and alerting
Production Checklist
Review production readiness checklist