Skip to content

Kubernetes Deployment

Directory Structure

k8s/
├── config.yaml              # Namespace, ConfigMap, Secrets, ServiceAccount, RBAC
├── services.yaml            # postgres-service, redis-service, Ingress (TLS + cert-manager)
├── deployment.yaml          # slozy-web Deployment (2 replicas, RollingUpdate)
├── deployment-v2.yaml       # Blue-green/canary Deployment (1 replica, version: v2)
└── cert-manager/
    └── issuer.yaml          # ClusterIssuer (Let's Encrypt production)

Deploy

bash
kubectl apply -f k8s/config.yaml
kubectl apply -f k8s/services.yaml
kubectl apply -f k8s/deployment.yaml

Verify:

bash
kubectl get pods -n slozy
kubectl get svc -n slozy
kubectl logs -f deployment/slozy-web -n slozy

Blue-Green Deployments

Deploy v2 alongside the existing v1, then switch the Ingress:

bash
kubectl apply -f k8s/deployment-v2.yaml
kubectl rollout status deployment/slozy-web-v2 -n slozy
# Switch traffic: patch ingress to point to slozy-web-service-v2

Auto-Scaling (HPA)

The k8s/hpa.yaml configures Horizontal Pod Autoscaler based on CPU and memory utilization. Apply with:

bash
kubectl apply -f k8s/hpa.yaml

TLS with cert-manager

bash
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml
kubectl apply -f k8s/cert-manager/issuer.yaml

The ClusterIssuer uses HTTP-01 challenge (letsencrypt-prod). The Ingress annotation cert-manager.io/cluster-issuer: letsencrypt-prod triggers automatic certificate provisioning. TLS secret slozy-tls serves the api.slozy.net host.