Azure Core Services: VMSS, AKS, Blob Storage

Navigate Azure's core services for DevOps—Virtual Machine Scale Sets, Azure Kubernetes Service, Blob Storage, and managed databases.

published: reading time: 15 min read

Azure Core Services: VMSS, AKS, Blob Storage

Azure is Microsoft’s cloud platform, and it has matured into a capable alternative to AWS and GCP. If your organization lives in the Microsoft ecosystem, Azure integrates naturally with Active Directory, Visual Studio, and other Microsoft tooling. This post covers the core services for deploying and operating workloads on Azure.

Azure organizes resources hierarchically under Management Groups, Subscriptions, and Resource Groups. Management groups let you apply policies and access controls across multiple subscriptions, useful for large enterprises with many teams or environments.

When to Use

VMSS Uniform vs. Flexible Orchestration

Choose VMSS uniform orchestration when all instances run the same workload and you want simple management. Uniform mode provisions identical VMs and is the traditional VMSS model.

Choose VMSS flexible orchestration when you need a mix of instance types in a single scale set, want explicit control over fault domain distribution, or need better availability guarantees for production workloads. Flexible mode is the newer model and recommended for new deployments.

AKS with Azure AD vs. Without

Choose AKS with Azure AD integration when your organization uses Microsoft Entra ID (formerly Azure Active Directory). Azure AD provides unified identity management, conditional access policies, and role-based access control tied to your existing directory.

Choose AKS without Azure AD integration when you need to support users outside your Microsoft tenant, or when you want to manage Kubernetes RBAC independently from Azure AD. You can always add Azure AD integration later.

Azure DevOps vs. GitHub Actions

Choose Azure DevOps when you need deep integration with Microsoft tooling—work items, test plans, Artifacts feed, and enterprise approval workflows. Azure DevOps has stronger governance features for large organizations.

Choose GitHub Actions when your team lives on GitHub, you have many open-source projects, or you prefer YAML-based pipelines that work across any cloud. GitHub Actions has a larger marketplace of community actions.

When Not to Use Azure

Avoid VMSS flexible orchestration when you want simple, identical VM management. Uniform mode has less operational complexity and works well for homogeneous workloads.

Avoid AKS without Azure AD integration if you are already deep in the Microsoft ecosystem. Without Entra ID integration, you lose unified identity management and conditional access policies.

Avoid Azure DevOps if your team is GitHub-centric or prefers working across multiple clouds. Azure DevOps has strong Microsoft integration but adds lock-in that becomes a burden for cross-platform teams.

Avoid Blob Storage Hot tier for infrequently accessed data. Storage costs are higher than Cool or Archive tiers, and egress costs for access from outside Azure add up quickly.

Azure Resource Hierarchy

Resource groups are logical containers for Azure resources. They hold related resources that share the same lifecycle—deploy and delete together. Resource groups live within subscriptions, which bill all contained resources under one account.

# Create a resource group
az group create \
  --name rg-production \
  --location eastus

# List resource groups
az group list --output table

# Show a specific resource group
az group show --name rg-production

Tags attach metadata to resources independent of resource group boundaries. Common tags include Environment, Team, CostCenter, and Application. Azure Policy can enforce required tags and restrict which resources can be created without them.

Azure subscriptions act as billing and access control boundaries. Many organizations use separate subscriptions per environment or per application domain. Management groups sit above subscriptions and let you apply governance across the entire Azure footprint from a single point.

flowchart TD
    A[Management Group] --> B[Subscription: Production]
    A --> C[Subscription: Development]
    B --> D[Resource Group: rg-prod-api]
    B --> E[Resource Group: rg-prod-web]
    C --> F[Resource Group: rg-dev-services]
    D --> G[AKS Cluster]
    D --> H[VMSS]
    D --> I[Blob Storage]
    E --> J[Azure SQL]
    G --> K[System Node Pool]
    G --> L[User Node Pool]
    K --> M[CoreDNS Pods]
    L --> N[App Pods]

VMSS for Scalable Compute

Virtual Machine Scale Sets (VMSS) provision and manage multiple VMs as a single set. They automatically balance across fault domains and update domains for high availability. VMSS is Azure’s equivalent to AWS Auto Scaling Groups.

# Create a VMSS
az vmss create \
  --name webapp-vmss \
  --resource-group rg-production \
  --image UbuntuLTS \
  --instance-count 2 \
  --vm-sku Standard_D2s_v3 \
  --load-balancer my-load-balancer \
  --upgrade-policy-mode automatic

# Scale out manually
az vmss scale \
  --name webapp-vmss \
  --resource-group rg-production \
  --new-capacity 5

# Configure autoscaling
az monitor autoscale create \
  --resource-group rg-production \
  --resource webapp-vmss \
  --resource-type Microsoft.Compute/virtualMachineScaleSets \
  --name webapp-autoscale \
  --min-count 2 \
  --max-count 10 \
  --count 2

VMSS supports both uniform scaling (all instances identical) and flexible orchestration (mixtures of instance types). Flexible orchestration mode is newer and provides better availability guarantees with explicit control over fault domain distribution.

AKS Cluster Configuration

Azure Kubernetes Service (AKS) provides managed Kubernetes clusters. Microsoft handles the control plane, including upgrades and availability. You manage worker nodes through node pools.

# Create an AKS cluster
az aks create \
  --resource-group rg-production \
  --name aks-cluster \
  --node-count 3 \
  --vm-set-type VirtualMachineScaleSets \
  --load-balancer-sku standard \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 5

# Get credentials for kubectl
az aks get-credentials \
  --resource-group rg-production \
  --name aks-cluster

# Check cluster status
az aks show --resource-group rg-production --name aks-cluster

AKS integrates with Azure Active Directory for authentication, Azure Monitor for logging and monitoring, and Azure Policy for governance enforcement. The Azure Policy add-on validates cluster configurations against organizational standards.

# node-pool addition via az CLI
az aks nodepool add \
  --resource-group rg-production \
  --cluster-name aks-cluster \
  --name systempool \
  --node-count 1 \
  --node-vm-size Standard_D2s_v3 \
  --mode System

# User node pool for workloads
az aks nodepool add \
  --resource-group rg-production \
  --cluster-name aks-cluster \
  --name userpool \
  --node-count 2 \
  --node-vm-size Standard_D4s_v3 \
  --mode User

System node pools run critical system pods like CoreDNS and metrics-server. User node pools run application workloads. This separation ensures system services get guaranteed resources even when user workloads consume capacity.

Blob Storage Lifecycle Policies

Azure Blob Storage holds unstructured data—images, logs, backups, and artifacts. Azure uses containers (similar to S3 buckets) and blobs (the objects themselves).

# Create a storage account
az storage account create \
  --name mystorageaccount \
  --resource-group rg-production \
  --sku Standard_LRS

# Create a container
az storage container create \
  --name artifacts \
  --account-name mystorageaccount

# Upload a blob
az storage blob upload \
  --file ./app.tar.gz \
  --name prod/app.tar.gz \
  --container-name artifacts \
  --account-name mystorageaccount

# List blobs in container
az storage blob list \
  --container-name artifacts \
  --account-name mystorageaccount

Lifecycle management policies automate data transitions between access tiers and cleanup of old data.

{
  "rules": [
    {
      "name": "artifact-lifecycle",
      "enabled": true,
      "type": "Lifecycle",
      "definition": {
        "filters": {
          "blobTypes": ["blockBlob"],
          "prefixMatch": ["artifacts/prod/"]
        },
        "actions": {
          "baseBlob": {
            "tierToCool": {
              "daysAfterModificationGreaterThan": 30
            },
            "delete": {
              "daysAfterModificationGreaterThan": 365
            }
          }
        }
      }
    }
  ]
}
# Apply lifecycle policy
az storage account management-policy create \
  --account-name mystorageaccount \
  --policy @policy.json

Azure SQL and Managed Identity

Azure SQL Database is a fully managed PostgreSQL, MySQL, or SQL Server offering. Azure handles backups, patching, and high availability. Your applications connect via connection strings, and managed identities eliminate the need to manage database credentials.

# Create an Azure SQL Database server
az sql server create \
  --name sqlserver-production \
  --resource-group rg-production \
  --admin-user dbadmin \
  --admin-password 'YourPassword123!'

# Create a database
az sql db create \
  --resource-group rg-production \
  --server sqlserver-production \
  --name webappdb \
  --service-objective S0

# Configure a managed identity on an App Service
az webapp identity assign \
  --resource-group rg-production \
  --name webapp

Managed identities let your applications authenticate to Azure resources without storing secrets. The identity is attached to the compute resource—App Service, VM, or AKS pod—and Azure handles token issuance.

// .NET - connecting with managed identity
var connection = new SqlConnection(
    "Server=tcp:sqlserver-production.database.windows.net;Database=webappdb;Authentication=Active Directory Managed Identity;"
);

For AKS workloads, the Azure AD pod-managed-identity addon attaches a managed identity to each pod. Pods use that identity to authenticate to Azure services without embedding credentials in code or configuration.

Azure DevOps vs GitHub Actions

Azure DevOps and GitHub Actions are the two main CI/CD options for Azure workloads. Azure DevOps has deep integration with Microsoft tooling and enterprise features like work item tracking. GitHub Actions integrates naturally with GitHub repositories and open-source projects.

# GitHub Actions workflow for Azure
name: Deploy to Azure

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Azure Login
        uses: azure/login@v2
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Deploy to App Service
        uses: azure/webapps-deploy@v3
        with:
          app-name: my-webapp
          slot-name: production
          package: ./dist
# Azure DevOps pipeline
trigger:
  - main

pool:
  vmImage: ubuntu-latest

stages:
  - stage: Build
    jobs:
      - job: BuildJob
        steps:
          - task: UseDotNet@2
          - script: dotnet build
  - stage: Deploy
    jobs:
      - deployment: DeployJob
        environment: production
        strategy:
          runOnce:
            deploy:
              steps:
                - task: AzureWebApp@1
                  inputs:
                    azureSubscription: "my-subscription"
                    appName: "my-webapp"

Both integrate with Azure resources through service connections. The choice often comes down to where your code lives and which tool your team already uses.

For more on managing Azure costs, see our post on Cost Optimization.

Compute Service Trade-offs

ScenarioVMSS UniformVMSS FlexibleAKSAzure App Service
Mixed instance typesNoYesYesNo
Kubernetes ecosystemNoNoYesNo
Platform-managed upgradesYesLimitedYes (control plane)Yes
Scale to zeroNoNoNoYes
Pay-per-second billingNoNoNo (per node)Yes (Consumption plan)
Max scale1000 VMs1000 VMs1000 nodes30-100 instances

Blob Storage Access Tiers

TierUse casePricing
HotActive logs, media, frequent accessHighest storage, lowest access
CoolBackups, temp data, accessed monthlyLower storage, higher access
ColdArchival, rarely accessedLower storage, higher access
ArchiveCompliance, decade-old dataLowest storage, highest access latency

Production Failure Scenarios

FailureImpactMitigation
VMSS flexible orchestration zone spread failureInstances cannot spread across fault domains, availability reducedPlan zone distribution before deploying, test failure domain behavior
AKS node pool out-of-capacity errorsPods unschedulable, deployments failMonitor quota in each region, request increases proactively
Azure SQL connection pooling exhaustionApplications cannot get connections, requests queue and failSet appropriate pool size, monitor active connections, implement retry logic
Blob storage lifecycle policy misconfiguration causing data lossOld data deleted prematurely or hot storage bills spikeTest lifecycle policies on non-production buckets first, set up alerts on storage costs
Azure AD pod identity misconfiguration locking out AKS podsPods cannot authenticate to Azure resources, services failTest identity bindings in dev first, keep a fallback service principal

Azure Observability Hooks

VMSS and AKS monitoring:

# Check VMSS instance health
az vmss list-instance-connection-info \
  --resource-group rg-production \
  --name webapp-vmss

# Get AKS cluster health and node status
az aks show \
  --resource-group rg-production \
  --name aks-cluster \
  --query '{status:provisioningState,version:kubernetesVersion}'

# List nodes and their status
kubectl get nodes -o wide

Azure Monitor for containers:

# Enable monitoring on AKS
az aks enable-addons \
  --resource-group rg-production \
  --name aks-cluster \
  --addons monitoring

# View container logs
az aks show \
  --resource-group rg-production \
  --name aks-cluster \
  --query addonProfiles.omsagent.config.loganalyticsworkspacerresourceid

Key Azure Monitor metrics to alert on:

ServiceMetricAlert Threshold
VMSSCPU utilization> 80% for 5 minutes
VMSSAvailable memory< 20% for 3 minutes
AKSPod unschedulable time> 1 minute
AKSNode pressure evictionsany evictions
Azure SQLDTU utilization> 80% for 5 minutes
Azure SQLConnection failures> 5 in 5 minutes
Blob StorageTransactionserror rate > 1%
Blob StorageUsed capacity> 80% of quota

Common Anti-Patterns

Not using managed identities. Embedding connection strings or API keys in configuration files is a security risk and a rotation nightmare. Azure managed identities eliminate credentials from code entirely.

Using admin passwords instead of key-based authentication. For VMs and databases, key-based authentication with Azure Key Vault integration is more secure and easier to rotate than passwords.

Leaving resources in the wrong resource group. Resource groups determine lifecycle—resources in the same group are deployed and deleted together. Mixing production and development resources in one group means a delete operation wipes the wrong environment.

Not using Azure Policy to enforce tagging. Without Azure Policy, resources get created without required tags, making cost attribution and automation harder. Set policy enforcement before creating resources at scale.

Deploying to the default subscription. The default subscription has low limits and no governance. Use Management Groups to organize subscriptions by environment and team from day one.

Quick Recap

Key Takeaways

  • Azure resource hierarchy flows Management Groups → Subscriptions → Resource Groups
  • VMSS flexible orchestration mode is recommended for new production deployments
  • AKS with Azure AD integration provides unified identity management across the Microsoft ecosystem
  • Managed identities replace connection strings for Azure SQL, Blob Storage, and other Azure resources
  • Azure Policy enforces tagging and resource governance at the subscription level

Azure Onboarding Checklist

# 1. Set up a Management Group for your organization
az account management-group create --name my-org --display-name "My Organization"

# 2. Create a subscription for production
az account management-group subscription add \
  --name my-org \
  --subscription my-subscription-id

# 3. Create a resource group
az group create --name rg-production --location eastus

# 4. Create an AKS cluster with Azure AD
az aks create \
  --resource-group rg-production \
  --name aks-cluster \
  --node-count 3 \
  --enable-azure-ad

# 5. Enable Azure Policy on the cluster
az aks enable-addons \
  --resource-group rg-production \
  --name aks-cluster \
  --addons azure-policy

# 6. Create a storage account with lifecycle policy
az storage account create \
  --name mystorageaccount \
  --resource-group rg-production \
  --sku Standard_LRS

Capacity Estimation and Benchmark Data

Use these numbers for initial capacity planning. Actual performance varies by workload characteristics.

VMSS Instance Types

SeriesBest ForSizesMax InstancesNetwork Performance
BBurstable workloads, dev/testB1s → B20s1000Up to 1 Gbps
DGeneral purpose, productionD2s_v3 → D64s_v31000Up to 30 Gbps
EMemory optimizedE2s_v3 → E64s_v31000Up to 30 Gbps
FCompute optimizedF2s_v2 → F72s_v21000Up to 30 Gbps
LStorage optimizedL8s_v2 → L48s_v21000Up to 30 Gbps

AKS Node Pool Performance

ParameterValueNotes
Max nodes per cluster5,000 (standard tier)1,000 default
Max pods per node250 (default) / 110 (kubenet)Configure at cluster creation
Max node pools per cluster100Each pool can have different VM size
API server latency50-200ms p99SLA: 99.95% uptime with standard tier

Blob Storage Performance Targets

MetricValue
PUT/LIST/DELETE latency10-50ms (p99)
GET latency5-15ms (p99)
Max requests per account20,000 IOPS (standard)
Throughput per account60 Gbps (standard)
Blob typesBlock, Page, Append

Azure SQL Instance Tiers

TiervCPUsMemoryMax ConnectionsTypical Use
Basic5 DTU2 GB30Small dev/test
S010 DTU2.25 GB60Small production
S120 DTU3 GB90Medium production
S250 DTU7 GB200Medium production
S3100 DTU28 GB500Large production
P12 vCores5.1 GB1,500General purpose
P24 vCores20.4 GB2,500General purpose
P48 vCores40.4 GB5,000Business critical

Conclusion

Azure provides a complete platform for cloud workloads with strong integration into the Microsoft ecosystem. VMSS handles scalable compute, AKS manages Kubernetes, Blob Storage holds artifacts and data, and Azure SQL provides managed databases with managed identity support.

The choice between Azure DevOps and GitHub Actions depends on your existing tooling and team preferences. Both can deploy to Azure effectively.

Category

Related Posts

Azure Data Services: Data Factory, Synapse, and Event Hubs

Build data pipelines on Azure with Data Factory, Synapse Analytics, and Event Hubs. Learn integration patterns, streaming setup, and data architecture.

#data-engineering #azure #data-factory

Data Migration: Strategies and Patterns for Moving Data

Learn proven strategies for migrating data between systems with minimal downtime. Covers bulk migration, CDC patterns, validation, and rollback.

#data-engineering #data-migration #cdc

AWS Core Services for DevOps: EC2, ECS, EKS, S3, Lambda

Navigate essential AWS services for DevOps workloads—compute (EC2, ECS, EKS), storage (S3), serverless (Lambda), and foundational networking.

#aws #cloud #devops