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!