04-07-2026, 04:04 AM
NGINX Ingress + cert-manager + Let's Encrypt Setup on AKS Cluster
Overview
This guide covers installing NGINX Ingress Controller, cert-manager and Let's Encrypt ClusterIssuer on Azure Kubernetes Service (AKS). This is specifically configured for AKS single-node clusters with CriticalAddonsOnly=true taint.
Environment
Prerequisites
Step 1 - Add Helm Repositories
Run on: Local machine or CI/CD pipeline
Add required Helm repos:
Verify repos added:
Step 2 - Install NGINX Ingress Controller
Run on: Local machine with kubectl access
Create namespace:
Install NGINX Ingress with tolerations for CriticalAddonsOnly taint:
Check Ingress Controller status:
Expected output:
Important: Copy the EXTERNAL-IP and point your domain DNS records to it.
Example: yourdomain.com -> YOUR_EXTERNAL_IP
Step 3 - Install cert-manager
Run on: Local machine with kubectl access
Create namespace:
Install cert-manager with CRDs and tolerations:
Verify all cert-manager pods are running:
Expected outpu
Overview
This guide covers installing NGINX Ingress Controller, cert-manager and Let's Encrypt ClusterIssuer on Azure Kubernetes Service (AKS). This is specifically configured for AKS single-node clusters with CriticalAddonsOnly=true taint.
Environment
- Platform: Azure Kubernetes Service (AKS)
- Ingress: NGINX Ingress Controller
- TLS: cert-manager with Let's Encrypt
- Node Taint: CriticalAddonsOnly=true
- OS: Linux nodes
Prerequisites
- kubectl installed and configured
- Helm v3 installed
- AKS cluster running and accessible
- Domain names pointed to cluster external IP
- Valid email address for Let's Encrypt notifications
Step 1 - Add Helm Repositories
Run on: Local machine or CI/CD pipeline
Add required Helm repos:
Code:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add jetstack https://charts.jetstack.io
helm repo updateVerify repos added:
Code:
helm repo listStep 2 - Install NGINX Ingress Controller
Run on: Local machine with kubectl access
Create namespace:
Code:
kubectl create namespace ingress-basicInstall NGINX Ingress with tolerations for CriticalAddonsOnly taint:
Code:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-basic \
--set controller.nodeSelector."kubernetes\.io/os"=linux \
--set controller.tolerations[0].key="CriticalAddonsOnly" \
--set controller.tolerations[0].operator="Exists" \
--set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
--set controller.admissionWebhooks.patch.tolerations[0].key="CriticalAddonsOnly" \
--set controller.admissionWebhooks.patch.tolerations[0].operator="Exists"Check Ingress Controller status:
Code:
kubectl get svc -n ingress-basic
kubectl get pods -n ingress-basicExpected output:
Code:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
ingress-nginx-controller LoadBalancer 10.0.x.x YOUR_EXTERNAL_IP 80:xxx/TCP,443:xxx/TCPImportant: Copy the EXTERNAL-IP and point your domain DNS records to it.
Example: yourdomain.com -> YOUR_EXTERNAL_IP
Step 3 - Install cert-manager
Run on: Local machine with kubectl access
Create namespace:
Code:
kubectl create namespace cert-managerInstall cert-manager with CRDs and tolerations:
Code:
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--set installCRDs=true \
--set nodeSelector."kubernetes\.io/os"=linux \
--set tolerations[0].key="CriticalAddonsOnly" \
--set tolerations[0].operator="Exists" \
--set cainjector.nodeSelector."kubernetes\.io/os"=linux \
--set cainjector.tolerations[0].key="CriticalAddonsOnly" \
--set cainjector.tolerations[0].operator="Exists" \
--set webhook.nodeSelector."kubernetes\.io/os"=linux \
--set webhook.tolerations[0].key="CriticalAddonsOnly" \
--set webhook.tolerations[0].operator="Exists" \
--set startupapicheck.tolerations[0].key="CriticalAddonsOnly" \
--set startupapicheck.tolerations[0].operator="Exists" \
--set startupapicheck.nodeSelector."kubernetes\.io/os"=linuxVerify all cert-manager pods are running:
Code:
kubectl get pods -n cert-managerExpected outpu

