Expert coverage of Azure Kubernetes Service (AKS): node pools, workload identity, Azure CNI options, AKS Automatic, NAP (Karpenter), add-ons, and hybrid scenarios. Use for \"AKS\", \"Azure Kubernetes\", \"Azure CNI\", \"AKS Automatic\", \"workload identity Azure\", \"az aks\", \"Node Auto Provisioning AKS\".
Pro scans all 2 files and shows the line behind each finding
Scanned 9/24/2026
npx -y skills add chrishuffman5/domain-expert --skill aks --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Aks?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/chrishuffman5-aks)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: aks
description: "Expert coverage of Azure Kubernetes Service (AKS): node pools, workload identity, Azure CNI options, AKS Automatic, NAP (Karpenter), add-ons, and hybrid scenarios. Use for \"AKS\", \"Azure Kubernetes\", \"Azure CNI\", \"AKS Automatic\", \"workload identity Azure\", \"az aks\", \"Node Auto Provisioning AKS\"."
license: MIT
---
# Azure AKS
This skill covers Azure Kubernetes Service (AKS), including:
- AKS managed control plane (free and paid tiers, SLA)
- Node pools (system vs user, VM sizes, autoscaling, taints)
- AKS Automatic (fully managed, GA since 2026)
- Node Auto Provisioning (Karpenter on AKS, GA 2026)
- Networking (Azure CNI, kubenet, Azure CNI Overlay, Cilium-powered CNI)
- Workload Identity (replacing AAD Pod Identity)
- AKS add-ons (monitoring, policy, Istio, secrets CSI, Defender)
- Storage (Azure Disk CSI, Azure Files CSI, Blob CSI)
- Security (Defender for Containers, Azure Policy, managed identity)
- Hybrid and multi-cloud (Azure Arc-enabled Kubernetes)
## How to Approach Tasks
1. **Classify** the request:
- **Architecture** -- Load `references/architecture.md` for control plane, networking, compute, identity
- **Node management** -- Node pool design, autoscaling, AKS Automatic, NAP
- **Networking** -- CNI selection, ingress, load balancing, DNS
- **Security** -- Workload identity, Defender, Azure Policy, managed identity
- **Troubleshooting** -- Node issues, networking, identity errors, upgrade failures
2. **Identify context** -- Which tier (free/standard/premium)? Which CNI? AKS Automatic or standard? Ask if unclear.
3. **Load context** -- Read the reference file for deep technical detail.
4. **Apply** -- Provide Azure CLI (`az aks`), Bicep, Terraform, or kubectl examples as appropriate.
5. **Validate** -- Suggest `az aks show`, `kubectl get nodes`, Azure Monitor queries.
## AKS Control Plane
- Managed by Azure: API server and etcd run in Azure-managed infrastructure
- **Free tier**: no SLA, no uptime guarantee (dev/test only)
- **Standard tier**: 99.95% SLA (or 99.99% with Availability Zones), Cluster Autoscaler, multiple node pools
- **Premium tier**: Standard + long-term support (LTS), Microsoft-backed patch SLA
- Upgrade: one minor version at a time; automatic upgrades available (patch, stable, rapid, node image channels)
```bash
# Create AKS cluster
az aks create \
--resource-group myRG \
--name myAKS \
--node-count 3 \
--node-vm-size Standard_D4s_v5 \
--network-plugin azure \
--network-plugin-mode overlay \
--tier standard \
--enable-managed-identity \
--enable-oidc-issuer \
--enable-workload-identity \
--zones 1 2 3
```
## Node Pools
### System vs User Node Pools
```bash
# System pool (runs kube-system, CoreDNS, metrics-server)
az aks nodepool add \
--resource-group myRG \
--cluster-name myAKS \
--name system \
--node-count 3 \
--node-vm-size Standard_D4s_v5 \
--mode System \
--node-taints CriticalAddonsOnly=true:NoSchedule
# User pool (application workloads)
az aks nodepool add \
--resource-group myRG \
--cluster-name myAKS \
--name workers \
--node-count 3 \
--node-vm-size Standard_D8s_v5 \
--mode User \
--enable-cluster-autoscaler \
--min-count 2 \
--max-count 20 \
--zones 1 2 3
```
**Best practice**: separate system and user node pools. Taint system pool with `CriticalAddonsOnly=true:NoSchedule` to prevent application pods from landing on system nodes.
### Specialized Node Pools
```bash
# GPU node pool
az aks nodepool add \
--resource-group myRG \
--cluster-name myAKS \
--name gpu \
--node-vm-size Standard_NC6s_v3 \
--node-count 1 \
--node-taints sku=gpu:NoSchedule \
--labels workload=gpu
# Spot VM pool (cost optimization)
az aks nodepool add \
--resource-group myRG \
--cluster-name myAKS \
--name spot \
--priority Spot \
--spot-max-price -1 \
--eviction-policy Delete \
--node-vm-size Standard_D4s_v5 \
--enable-cluster-autoscaler \
--min-count 0 \
--max-count 10
```
## AKS Automatic
GA since 2026. Removes infrastructure decisions -- Azure manages node pools, autoscaling, OS patching, and security hardening automatically. Comparable to GKE Autopilot.
```bash
az aks create \
--resource-group myRG \
--name myAKS-auto \
--sku automatic
```
**What AKS Automatic manages**:
- Node pool creation and sizing based on workload requirements
- OS patching and security updates
- Default security hardening (Pod Security Standards enforced)
- Network policy enforcement
- Built-in monitoring and logging
**When NOT to use AKS Automatic**:
- Custom node configurations needed (kernel tuning, custom kubelet settings)
- Specific VM SKUs required (GPU, high-memory, confidential computing)
- Windows containers
- Need for SSH access to nodes
## Node Auto Provisioning (NAP)
Karpenter-based node provisioning for AKS (GA early 2026):
```bash
az aks update --resource-group myRG --name myAKS --enable-node-auto-provisioning
```
NAP dynamically creates nodes matching pending pod requirements, similar to Karpenter on EKS. Selects optimal VM sizes and consolidates underutilized nodes.
## Networking
### CNI Options
| CNI | Pod IP Source | Performance | Use Case |
|-----|-------------|-------------|----------|
| kubenet | Non-VNet IPs (NAT) | Lower (NAT overhead) | Simple, IP conservation |
| Azure CNI | VNet IPs per pod | High (direct routing) | VNet integration needed |
| Azure CNI Overlay | Overlay IPs, node VNet IPs | High | Scale + VNet integration |
| Azure CNI + Cilium | eBPF dataplane | Highest | Best performance + observability |
**Azure CNI Overlay** (recommended for most new clusters): pods get IPs from a private overlay CIDR (e.g., 10.244.0.0/16), nodes get VNet IPs. Eliminates IP exhaustion issues while maintaining VNet integration for node-level communication.
**Azure CNI powered by Cilium**: eBPF-based dataplane for service load balancing, NetworkPolicy enforcement, and observability (Hubble). Replaces kube-proxy.
```bash
az aks create \
--resource-group myRG \
--name myAKS \
--network-plugin azure \
--network-plugin-mode overlay \
--network-dataplane cilium
```
### Ingress Options
| Option | Type | Managed By |
|--------|------|-----------|
| Application Gateway Ingress Controller (AGIC) | L7 | Azure (add-on) |
| NGINX Ingress | L7 | Self-managed |
| Azure Service Mesh (Istio) | L7 + mTLS | Azure (add-on) |
| Internal Load Balancer | L4 | Azure (annotation) |
```yaml
# Internal load balancer annotation
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
```
## Workload Identity
Replaces the deprecated AAD Pod Identity. Federated credentials between Azure AD and Kubernetes ServiceAccounts:
```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: storage-reader
namespace: production
annotations:
azure.workload.identity/client-id: "CLIENT_ID_GUID"
labels:
azure.workload.identity/use: "true"
```
```bash
# Enable on cluster
az aks update --resource-group myRG --name myAKS \
--enable-oidc-issuer --enable-workload-identity
# Create federated credential
az identity federated-credential create \
--name aks-fed-cred \
--identity-name myManagedIdentity \
--resource-group myRG \
--issuer "$(az aks show -g myRG -n myAKS --query oidcIssuerProfile.issuerUrl -o tsv)" \
--subject "system:serviceaccount:production:storage-reader"
```
**Pod must have the label**: `azure.workload.identity/use: "true"` on the pod (not just the ServiceAccount) for the webhook to inject the AZURE_CLIENT_ID, AZURE_TENANT_ID, and AZURE_FEDERATED_TOKEN_FILE environment variables.
## AKS Add-ons
| Add-on | Purpose |
|--------|---------|
| Azure Monitor (Container Insights) | Metrics, logs, Live View |
| Azure Policy | OPA/Gatekeeper-based policy enforcement |
| Istio Service Mesh | mTLS, traffic management |
| Secrets Store CSI (Key Vault) | Mount Key Vault secrets as volumes |
| Defender for Containers | Runtime threat detection |
| Blob CSI Driver | Azure Blob storage volumes |
| Web App Routing | Managed NGINX ingress + cert management |
## Common Patterns
### Multi-Region HA
```bash
# Cluster per region
az aks create -g myRG-eastus -n aks-eastus --location eastus ...
az aks create -g myRG-westus -n aks-westus --location westus ...
# Azure Front Door for global load balancing
# Azure Traffic Manager for DNS-based failover
```
### Hybrid with Azure Arc
```bash
# Connect non-AKS cluster to Azure
az connectedk8s connect --name on-prem-cluster --resource-group myRG
# Deploy configurations via GitOps (Flux)
az k8s-configuration flux create \
--name app-config \
--cluster-name on-prem-cluster \
--resource-group myRG \
--cluster-type connectedClusters \
--url https://github.com/myorg/k8s-config \
--branch main
```
## Reference Files
- `references/architecture.md` -- Node pool internals, CNI deep dive, workload identity mechanics, AKS Automatic architecture, storage options, security model. Read for architecture and design questions.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!