# Azure Kubernetes Service (AKS) Deployment with Managed Services ## Overview This guide covers deploying ERPNext on Azure Kubernetes Service (AKS) using Azure Database for PostgreSQL and Azure Cache for Redis as managed services. ## Prerequisites - Completed all steps in `00-prerequisites-managed.md` - Azure CLI installed and configured - kubectl and Helm installed - Environment variables from prerequisites exported ## 🚀 AKS Cluster Setup ### 1. Create AKS Cluster ```bash # Source environment variables source ~/erpnext-azure-env.sh # Create AKS cluster az aks create \ --name erpnext-aks \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --node-count 3 \ --node-vm-size Standard_D4s_v3 \ --enable-managed-identity \ --assign-identity $IDENTITY_ID \ --network-plugin azure \ --vnet-subnet-id /subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/erpnext-vnet/subnets/aks-subnet \ --docker-bridge-address 172.17.0.1/16 \ --dns-service-ip 10.0.10.10 \ --service-cidr 10.0.10.0/24 \ --enable-cluster-autoscaler \ --min-count 3 \ --max-count 10 \ --enable-addons monitoring,azure-keyvault-secrets-provider \ --workspace-resource-id /subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.OperationalInsights/workspaces/erpnext-logs \ --enable-ahub \ --generate-ssh-keys # Get AKS credentials az aks get-credentials \ --name erpnext-aks \ --resource-group $RESOURCE_GROUP \ --overwrite-existing # Verify cluster connection kubectl get nodes ``` ### 2. Configure Cluster Autoscaler ```bash # Update autoscaler configuration az aks update \ --name erpnext-aks \ --resource-group $RESOURCE_GROUP \ --cluster-autoscaler-profile \ scale-down-delay-after-add=10m \ scale-down-unneeded-time=10m \ scale-down-utilization-threshold=0.5 \ skip-nodes-with-local-storage=false \ max-graceful-termination-sec=600 ``` ### 3. Install NGINX Ingress Controller ```bash # Add Helm repo for ingress-nginx helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # Install NGINX ingress controller helm install nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.type=LoadBalancer \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \ --set controller.service.externalTrafficPolicy=Local # Wait for external IP kubectl get service -n ingress-nginx nginx-ingress-ingress-nginx-controller -w ``` ### 4. Install Cert-Manager (for SSL) ```bash # Install cert-manager for Let's Encrypt SSL helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.12.0 \ --set installCRDs=true # Create ClusterIssuer for Let's Encrypt cat < 80" \ --window-size 5m \ --evaluation-frequency 1m # Create alert for pod failures az monitor metrics alert create \ --name erpnext-pod-failures \ --resource-group $RESOURCE_GROUP \ --scopes /subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.ContainerService/managedClusters/erpnext-aks \ --condition "sum kube_pod_status_phase{phase='Failed'} > 0" \ --window-size 5m \ --evaluation-frequency 1m ``` ### 3. View Logs ```bash # View backend logs kubectl logs -f deployment/erpnext-backend -n erpnext # View all pods in namespace kubectl get pods -n erpnext -w # Check pod events kubectl describe pod -n erpnext ``` ## 🔧 Troubleshooting ### Database Connection Issues ```bash # Test database connection from pod kubectl run pg-test --rm -i --tty --image=postgres:13 -n erpnext -- \ psql -h $DB_SERVER_NAME.postgres.database.azure.com -U $DB_ADMIN_USER -d erpnext # Check secret mounting kubectl exec -it deployment/erpnext-backend -n erpnext -- ls -la /mnt/secrets-store/ ``` ### Redis Connection Issues ```bash # Test Redis connection kubectl run redis-test --rm -i --tty --image=redis:alpine -n erpnext -- \ redis-cli -h $REDIS_HOST -a $REDIS_KEY ping ``` ### Storage Issues ```bash # Check PVC status kubectl get pvc -n erpnext # Check storage class kubectl get storageclass # Describe PVC for events kubectl describe pvc erpnext-sites -n erpnext ``` ## 🚀 Production Optimizations ### 1. Enable Pod Disruption Budgets ```bash cat <