Skip to content

aks

get-credentials

# Get the credentials (kubeconfig) of the cluster
az aks get-credentials \
  --resource-group "aks-rg" \
  --name "aks-cluster" \
  --overwrite-existing \
  --admin # log as standard k8s admin (no AD)

get-versions

# Ger available kubernetes versions
az aks get-versions --location "southcentralus" -o table

show

# Show the RG in which external cloud resources (PVs, Public IPs, etc) are created
az aks show \
  --resource-group "demo-rg" \
  --name "aksdemo" \
  --query "nodeResourceGroup" \
  -o tsv

# Addon info
az aks show \
  --resource-group "demo-rg" \
  --name "aksdemo" \
  --query "addonProfiles.httpapplicationrouting.config.HTTPApplicationRoutingZoneName" \
  -o table

create

# Create Kubernetes Cluster
az aks create \
  --resource-group "demo-rg" \
  --name "demo-k8s" \
  --node-count "1" \
  --enable-addons "monitoring" \
  --enable-managed-identity \ # always prefer!
  --generate-ssh-keys \ # create id_rsa in ~/.ssh to access the nodepool machines
  --enable-cluster-autoscaler \
  --min-count "1" \
  --max-count "5"

update

# Allow AKS cluster to pull images without username/password
az aks update \
  --resource-group "demo-rg" \
  -n "akscluster" \
  --attach-acr "hvitoi" # hvtoi.azurecr.io

# Detach
az aks update \
  --resource-group "demo-rg" \
  -n "akscluster" \
  --detach-acr "hvitoi"

delete

# Delete Cluster
az aks delete \
  --resource-group "aks-rg" \
  --name "aks-cluster"

nodepool

# List nodepools
az aks nodepool list \
  --resource-group "aks-rg" \
  --cluster-name "aks-cluster" \
  --output "table"

# Create linux user nodepool
az aks nodepool add \
  --resource-group "aks-rg" \
  --cluster-name "aks-cluster" \
  --name "linuxpool" \
  --mode "User" \
  --node-count "1" \
  --enable-cluster-autoscaler \
  --max-count "5" \
  --min-count "1" \
  --node-vm-size "Standard_DS2_v2" \
  --os-type "Linux" \
  --labels "nodepool-type=user" "environment=production" "nodepoolos=linux" "app=java-apps" \
  --tags "nodepool-type=user" "environment=production" "nodepoolos=linux" "app=java-apps" \
  --zones {1,2,3}

# Create windows user nodepool
az aks nodepool add \
  --resource-group "aks-rg" \
  --cluster-name "aks-cluster" \
  --name "win" \
  --mode "User" \
  --node-count "1" \
  --enable-cluster-autoscaler \
  --max-count "5" \
  --min-count "1" \
  --node-vm-size "Standard_DS2_v2" \
  --os-type "Windows" \
  --labels "nodepool-type=user" "environment=production" "nodepoolos=windows" "app=dotnet-apps" \
  --tags "nodepool-type=user" "environment=production" "nodepoolos=windows" "app=dotnet-apps" \
  --zones {1,2,3}

enable-addons

# http_application_routing
az aks enable-addons \
  --resource-group "aks-rg" \
  --name "aks" \
  --addons "http_application_routing"

# virtual-node
az aks enable-addons \
    --resource-group "aks-rg" \
    --name "aks-cluster" \
    --addons "virtual-node" \
    --subnet-name "aks-subnet-vnodes" # aks-cluster must have access to this subnet

Connection with ACR

  • It must be given permissions to the Kubernetes Cluster to access ACR

  • With Secrets & Service Principal

# Create service principal
az ad sp create-for-rbac \
  --name "http://my-service-principal-name" \
  --scopes "/subscriptions/acr-registry-id/..." \
  --role "acrpull" \
  --query "password" \
  --output "tsv" # outputs the autogenerated password

# Show service principal
az ad sp show \
  --id "http://my-service-principal-name" \
  --query "appId" \
  --output "tsv" # outsputs the id of newly created principal
# Get clientId of the AKS "Service Principal"
SERVICE_PRINCIPAL_NAME=$(az aks show --resource-group "demo-rg" --name "demo-k8s" --query "servicePrincipalProfile.clientId" --output tsv)

# Get ACR resource Id
ACR_ID=$(az acr show --resource-group "demo-rg" --name "hvitoi" --query "id" --output tsv)

# Assign role to an existing "Service Principal" (which is used by aks)
az role assignment create \
  --assignee $SERVICE_PRINCIPAL_NAME \
  --scope $ACR_ID \
  --role "acrpull"
# Create create with the service principal
kubectl create secret docker-registry "my-acr-secret" \
    --docker-server "container-registry-name.azurecr.io" \
    --docker-username "service-principal-ID" \
    --docker-password "service-principal-password"
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: private-registry.io/apps/internal-app:1.0.0
  imagePullSecrets:
    - name: my-acr-secret
  • With AKS-ACR Integration
# Allow AKS cluster to pull images without username/password
az aks update \
  --resource-group "demo-rg" \
  -n "akscluster" \
  --attach-acr "hvitoi" # hvtoi.azurecr.io

# Detach
az aks update \
  --resource-group "demo-rg" \
  -n "akscluster" \
  --detach-acr "hvitoi"

AKS cluster from Scratch

Node Pools

# Resource Group
az group create \
  --name "aks-rg" \
  --location "southcentralus"
# Create Virtual Network and a Default Subnet
az network vnet create \
  --resource-group "aks-rg" \
  --name "aks-vnet" \
  --address-prefix "10.0.0.0/8" \
  --subnet-name "aks-subnet-default" \
  --subnet-prefix "10.240.0.0/16"

# Create Subnet for Virtual Nodes
az network vnet subnet create \
  --resource-group "aks-rg" \
  --vnet-name "aks-vnet" \
  --name "aks-subnet-vnodes" \
  --address-prefixes "10.241.0.0/16"
# Azure AD Group
az ad group create \
  --display-name "aks-admins" \
  --mail-nickname "aks-admins" \
  --query "objectId" \
  --output "tsv"

# Azure AD User
az ad user create \
  --display-name "henry" \
  --user-principal-name "[email protected]" \
  --password "pass1234." \
  --query "objectId" \
  --output "tsv"

# Associate user to a group
az ad group member add \
  --group "aks-admins" \
  --member-id "user-id" # replace with output from above
# SSH keys
ssh-keygen \
    -m "PEM" \
    -t "rsa" \
    -b "4096" \
    -C "aksuser@myserver" \
    -f "./aks-rsa" \
    -N "mypassphrase" # generates aks-rsa & aks-rsa.pub
# Log Analytics Workspace
az monitor log-analytics workspace create \
  --resource-group "aks-rg" \
  --workspace-name "aks-loganalyticsworkspace" \
  --query "id" \
  --output "tsv"
# Get Azure Active Directory ID - AD Tenant ID
az account show \
  --query "tenantId" \
  --output "tsv"

# AKs group object ID
 az ad group show \
  --group "aks-admins" \
  --query "objectId" \
  --output "tsv"

# VNet Default subnet ID
az network vnet subnet show \
  --resource-group "aks-rg" \
  --vnet-name "aks-vnet" \
  --name "aks-subnet-default" \
  --query "id" \
  --output "tsv"

# Log Analytics Workspace ID
az monitor log-analytics workspace show \
  --resource-group "aks-rg" \
  --workspace-name "aks-loganalyticsworkspace" \
  --query "id" \
  --output "tsv"
az aks create \
  --resource-group "aks-rg" \
  --name "aks-cluster" \
  --enable-managed-identity \
  --ssh-key-value "./aks-rsa.pub" \
  --admin-username "linux-node-admin" \
  --windows-admin-username "windows-node-admin" \
  --windows-admin-password "windowspass1234." \
  --node-count "1" \
  --node-osdisk-size "30" \
  --node-vm-size "Standard_DS2_v2" \
  --enable-cluster-autoscaler \
  --min-count "1" \
  --max-count "100" \
  --network-plugin "azure" \
  --service-cidr "10.0.0.0/16" \
  --dns-service-ip "10.0.0.10" \
  --docker-bridge-address "172.17.0.1/16" \
  --vnet-subnet-id "/subscriptions/c903ad61-2a3e-49b1-ad34-8affe3fdb1df/resourceGroups/aks-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet-default" \
  --enable-aad \
  --aad-admin-group-object-ids "c19a51f9-b48b-489a-bd1f-9d21895f0290" \
  --aad-tenant-id "713b8495-6d18-456c-a49e-1cfd44e79b2e" \
  --nodepool-name "systempool" \
  --nodepool-labels "nodepool-type=system" "nodepoolos=linux" "app=system-apps" \
  --nodepool-tags "nodepool-type=system" "nodepoolos=linux" "app=system-apps" \
  --workspace-resource-id "/subscriptions/c903ad61-2a3e-49b1-ad34-8affe3fdb1df/resourcegroups/aks-rg/providers/microsoft.operationalinsights/workspaces/aks-loganalyticsworkspace" \
  --enable-addons "monitoring" \
  --enable-ahub \
  --zones {1,2,3}


# Additional options
--enable-private-cluster \ # restrict kube-apiserver access
--api-server-authorized-ip-ranges "0.0.0.0/0" \
--kubernetes-version "1.21.2" \
--outbound-type "loadBalancer" \
--load-balancer-sku "standard" \
--load-balancer-managed-outbound-ip-count "5" \
--load-balancer-idle-timeout "5" \
--load-balancer-outbound-ports "1024" \
  • When using SYSTEM assigned identity, azure-cli will grant "Network Contributor" role to it
  • Optionally use USER assigned identity (--assign-identity)
# get vnet id
az network vnet show \
  --resource-group "aks-rg" \
  --name "aks-vnet" \
  --query "id" \
  --output "tsv"

# get aks principal ID
az aks show \
  -g "aks-rg" \
  -n "aks-cluster" \
  --query "identity.principalId" \
  -o "tsv"

# Grant "Vnet contributor" to AKS cluster
az role assignment create \
  --assignee "3518f2e2-3bb5-4b8c-8fb4-7ed55881a424" \
  --scope "/subscriptions/c903ad61-2a3e-49b1-ad34-8affe3fdb1df/resourceGroups/aks-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet" \
  --role "Contributor"
# Enable Virtual Nodepool
az aks enable-addons \
    --resource-group "aks-rg" \
    --name "aks-cluster" \
    --addons "virtual-node" \
    --subnet-name "aks-subnet-vnodes" # aks-cluster must have access to this subnet

# go to "aciconnectorlinux" managed identity and add role assignment, giving permissions (contributor role) to the "aks-rg" resource group
# Create linux user nodepool
az aks nodepool add \
  --resource-group "aks-rg" \
  --cluster-name "aks-cluster" \
  --name "linuxpool" \
  --mode "User" \
  --node-count "1" \
  --enable-cluster-autoscaler \
  --max-count "5" \
  --min-count "1" \
  --node-vm-size "Standard_DS2_v2" \
  --os-type "Linux" \
  --labels "nodepool-type=user" "environment=production" "nodepoolos=linux" "app=java-apps" \
  --tags "nodepool-type=user" "environment=production" "nodepoolos=linux" "app=java-apps" \
  --zones {1,2,3}
# Create windows user nodepool
az aks nodepool add \
  --resource-group "aks-rg" \
  --cluster-name "aks-cluster" \
  --name "win" \
  --mode "User" \
  --node-count "1" \
  --enable-cluster-autoscaler \
  --max-count "5" \
  --min-count "1" \
  --node-vm-size "Standard_DS2_v2" \
  --os-type "Windows" \
  --labels "nodepool-type=user" "environment=production" "nodepoolos=windows" "app=dotnet-apps" \
  --tags "nodepool-type=user" "environment=production" "nodepoolos=windows" "app=dotnet-apps" \
  --zones {1,2,3}