DEV Community

Cover image for Kubernetes vs Docker Swarm: Production AKS Setup, Ingress Routing & Auto-Scaling Guide
DevStackHub
DevStackHub

Posted on Originally published at devstackhub.tech

Kubernetes vs Docker Swarm: Production AKS Setup, Ingress Routing & Auto-Scaling Guide

Choosing the right container orchestration engine defines how your cloud workloads scale, recover from node failures, and handle production traffic. While Docker Swarm offers simplicity and near-zero setup overhead, Kubernetes (AKS) is the enterprise standard for high-availability cloud microservices.

Here is a technical comparison of the two platforms along with a production deployment blueprint for Azure Kubernetes Service.


Architectural Comparison: Swarm vs Kubernetes

Architectural Dimension Docker Swarm Kubernetes (AKS)
Learning Curve Minimal (Native Docker CLI commands) Moderate to High (Pods, Services, Ingress, CRDs)
Control Plane Management Self-managed Manager nodes Fully managed by cloud provider (Azure SLA)
Auto-Scaling Manual or custom script-based Native Horizontal Pod Autoscaler (HPA) & Cluster Autoscaler
Ingress & Networking Built-in routing mesh Ingress Controllers (NGINX, Traefik, Application Gateway)
Ecosystem & Tooling Basic Compose file orchestration Helm, GitOps (ArgoCD), Prometheus/Grafana, Service Meshes

When Should You Choose Each?

  • Choose Docker Swarm if: You are deploying simple, monolithic-to-microservice applications, have small engineering teams without dedicated DevOps engineers, or need to run internal staging environments with minimal operational overhead.
  • Choose Kubernetes (AKS) if: You run mission-critical production workloads requiring automated horizontal scaling, zero-downtime rolling updates, declarative infrastructure management, and deep integration with cloud identity and monitoring stacks.

Step 1: Provisioning a Production AKS Cluster via Azure CLI

To set up a resilient AKS cluster with Azure CNI networking and system-assigned managed identities:

#!/usr/bin/env bash
set -euo pipefail

# Configuration variables
RESOURCE_GROUP="rg-devstack-prod"
LOCATION="eastus"
CLUSTER_NAME="aks-production-cluster"

# 1. Create dedicated resource group
az group create --name "${RESOURCE_GROUP}" --location "${LOCATION}"

# 2. Provision AKS cluster with autoscaling enabled
az aks create \
  --resource-group "${RESOURCE_GROUP}" \
  --name "${CLUSTER_NAME}" \
  --node-count 3 \
  --enable-cluster-autoscaler \
  --min-count 3 \
  --max-count 6 \
  --node-vm-size Standard_D2s_v5 \
  --network-plugin azure \
  --enable-managed-identity \
  --generate-ssh-keys

# 3. Retrieve cluster credentials
az aks get-credentials --resource-group "${RESOURCE_GROUP}" --name "${CLUSTER_NAME}" --overwrite-existing
Enter fullscreen mode Exit fullscreen mode

Verify your cluster connectivity:

kubectl get nodes -o wide
Enter fullscreen mode Exit fullscreen mode

Step 2: Deploying Microservices with Health Checks
Deploying workloads on Kubernetes requires declarative resource limits and health probes (readiness and liveness) to prevent routing traffic to unhealthy pods.

Create deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-microservice
  labels:
    app: web-microservice
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: web-microservice
  template:
    metadata:
      labels:
        app: web-microservice
    spec:
      containers:
        - name: app
          image: [mcr.microsoft.com/oss/nginx/nginx:1.21.6](https://mcr.microsoft.com/oss/nginx/nginx:1.21.6)
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 15
            periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: web-microservice
Enter fullscreen mode Exit fullscreen mode

Apply the manifest:

kubectl apply -f deployment.yaml
Enter fullscreen mode Exit fullscreen mode

Advanced Setup: Ingress, SSL, and Autoscaling
To take this architecture to full enterprise readiness:

NGINX Ingress Routing & TLS: Configure Let's Encrypt certificates and routing rules to expose your internal ClusterIP services securely.

Horizontal Pod Autoscaling (HPA): Automate replica scaling based on real-time CPU and memory saturation metrics.

📖 Full Implementation Guide:

The step-by-step NGINX Ingress controller configuration, TLS cert-manager setup, and HPA autoscaler manifests are detailed in the comprehensive production guide on DevStackHub: Kubernetes vs Docker Swarm Full Production Guide.

Wrapping Up
Docker Swarm remains an effective solution for lightweight architectures, but Kubernetes provides the resilience, extensibility, and cloud-native integrations required for high-scale enterprise workloads.

If you found this guide helpful, follow for more weekly deep-dives covering Terraform, Kubernetes, CI/CD, and Cloud Architecture.

Top comments (1)

Collapse
 
devstackhubtech profile image
DevStackHub

Are you running Docker Swarm in production today, or have you fully transitioned your microservices to AKS? Let me know your experience and stack trade-offs in the comments below!