7.4 KiB
Kubernetes Deployment Guide
This guide provides detailed instructions for deploying the Active Directory Management application on Kubernetes.
Prerequisites
- Kubernetes cluster (v1.19+)
- kubectl configured to communicate with your cluster
- Kustomize (v4.0+) or kubectl v1.14+ which includes kustomize
- Optional: Ingress controller (e.g., NGINX Ingress Controller)
- Optional: cert-manager for TLS certificates
Deployment Architecture
The Kubernetes deployment consists of:
- Application Deployment: The main application with multiple replicas
- PostgreSQL StatefulSet: Database with persistent storage
- Redis StatefulSet: Cache and session storage with persistent storage
- Services: For internal communication between components
- Ingress: For external access to the application
- ConfigMap and Secrets: For configuration and sensitive data
All Kubernetes manifests are located in the iac/kubernetes/ directory.
Step-by-Step Deployment
1. Customize Configuration
Before deploying, customize the configuration files in the iac/kubernetes/ directory:
ConfigMap (iac/kubernetes/configmap.yaml)
Update environment variables according to your environment:
apiVersion: v1
kind: ConfigMap
metadata:
name: ad-management-config
namespace: ad-management
data:
NODE_ENV: "production"
PORT: "5000"
BASE_URL: "https://your-domain.com" # Update this
DEFAULT_ADMIN_USERNAME: "admin"
DEFAULT_ADMIN_FULLNAME: "System Administrator"
DISABLE_REGISTRATION: "false"
POSTGRES_DB: "admgr"
POSTGRES_USER: "postgres"
Secrets (kubernetes/secrets.yaml)
Update the secrets with your own base64-encoded values:
# Generate base64-encoded secrets
echo -n "your-jwt-secret" | base64
echo -n "your-session-secret" | base64
echo -n "your-admin-password" | base64
echo -n "admin@your-domain.com" | base64
echo -n "your-postgres-password" | base64
Then update iac/kubernetes/secrets.yaml:
apiVersion: v1
kind: Secret
metadata:
name: ad-management-secrets
namespace: ad-management
type: Opaque
data:
JWT_SECRET: "base64-encoded-jwt-secret"
SESSION_SECRET: "base64-encoded-session-secret"
DEFAULT_ADMIN_PASSWORD: "base64-encoded-admin-password"
DEFAULT_ADMIN_EMAIL: "base64-encoded-admin-email"
POSTGRES_PASSWORD: "base64-encoded-postgres-password"
Ingress (iac/kubernetes/ingress.yaml)
Update the hostname and TLS configuration:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ad-management-ingress
namespace: ad-management
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- your-domain.com # Update this
secretName: ad-management-tls
rules:
- host: your-domain.com # Update this
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ad-management
port:
name: http
2. Deploy the Application
Deploy all resources using Kustomize:
# Navigate to the iac/kubernetes directory
cd iac/kubernetes
# Apply all resources
kubectl apply -k .
# Or from anywhere in the project
kubectl apply -k iac/kubernetes
3. Verify Deployment
Check that all resources are created and running:
# Check namespace
kubectl get namespace ad-management
# Check pods
kubectl get pods -n ad-management
# Check services
kubectl get services -n ad-management
# Check deployments and statefulsets
kubectl get deployment,statefulset -n ad-management
# Check ingress
kubectl get ingress -n ad-management
4. Access the Application
If you've configured the Ingress, the application will be available at your specified domain.
Without Ingress, use port-forwarding:
kubectl port-forward -n ad-management svc/ad-management 5000:80
Then access the application at http://localhost:5000.
Common Operations
Scaling the Application
To scale the application horizontally:
kubectl scale -n ad-management deployment/ad-management --replicas=3
Updating the Application
To update the application to a new version:
# Update the image
kubectl set image -n ad-management deployment/ad-management ad-management=ad-management:new-tag
# Check rollout status
kubectl rollout status -n ad-management deployment/ad-management
Viewing Logs
To view application logs:
# View logs from all pods
kubectl logs -n ad-management -l app=ad-management
# View logs from a specific pod
kubectl logs -n ad-management pod/ad-management-xxxx-yyyy
Restarting Components
To restart the application:
kubectl rollout restart -n ad-management deployment/ad-management
To restart PostgreSQL or Redis:
kubectl rollout restart -n ad-management statefulset/postgres
kubectl rollout restart -n ad-management statefulset/redis
Troubleshooting
Pod Startup Issues
If pods are not starting:
# Check pod status
kubectl get pods -n ad-management
# Describe the pod for more details
kubectl describe pod -n ad-management pod/ad-management-xxxx-yyyy
# Check container logs
kubectl logs -n ad-management pod/ad-management-xxxx-yyyy
Database Connection Issues
If the application can't connect to the database:
-
Check if the PostgreSQL pod is running:
kubectl get pods -n ad-management -l app=postgres -
Check PostgreSQL logs:
kubectl logs -n ad-management pod/postgres-0 -
Verify the connection from the application pod:
kubectl exec -it -n ad-management pod/ad-management-xxxx-yyyy -- nc -zv postgres 5432
Ingress Issues
If the Ingress is not working:
-
Check the Ingress status:
kubectl describe ingress -n ad-management ad-management-ingress -
Check the Ingress controller logs:
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller
Examples
Example: Setting Up TLS with cert-manager
-
Install cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml -
Create a ClusterIssuer for Let's Encrypt:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx -
Apply the ClusterIssuer:
kubectl apply -f cluster-issuer.yaml
Example: Setting Up Monitoring with Prometheus and Grafana
-
Install Prometheus Operator:
kubectl apply -f https://github.com/prometheus-operator/kube-prometheus/releases/download/v0.10.0/manifests-0.10.0.tar.gz -
Create a ServiceMonitor for the application:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: ad-management namespace: monitoring spec: selector: matchLabels: app: ad-management namespaceSelector: matchNames: - ad-management endpoints: - port: http path: /metrics interval: 15s -
Apply the ServiceMonitor:
kubectl apply -f service-monitor.yaml