Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Azure Kubernetes Service (AKS) is a managed Kubernetes service that lets you quickly deploy and manage clusters. In this article, you use Azure PowerShell to deploy an AKS cluster that runs Windows Server containers. You also deploy an ASP.NET sample application in a Windows Server container to the cluster.
Note
To get started with quickly provisioning an AKS cluster, this article includes steps to deploy a cluster with default settings for evaluation purposes only.
Before you begin
This quickstart assumes a basic understanding of Kubernetes concepts. For more information, see Kubernetes core concepts for Azure Kubernetes Service (AKS).
If you don't have an Azure subscription, create a trial account before you begin.
If you want to use PowerShell locally, then install the Az PowerShell module and connect to your Azure account using the Connect-AzAccount cmdlet. For more information, see Install Azure PowerShell.
Make sure that the identity you're using to create your cluster has the appropriate minimum permissions. For more details on access and identity for AKS, see Access and identity options for Azure Kubernetes Service (AKS).
If you have more than one Azure subscription, set the subscription that you wish to use for the quickstart by calling the Set-AzContext cmdlet. For more information, see Manage Azure subscriptions with Azure PowerShell.
If you're using osSku
Windows2025, you need to install theaks-previewextension and register the preview flag.Specifying the
OsSKUparameter requires PowerShell Az module version 9.2.0 or higher.
Install the aks-preview extension
Important
AKS preview features are available on a self-service, opt-in basis. Previews are provided "as is" and "as available," and they're excluded from the service-level agreements and limited warranty. AKS previews are partially covered by customer support on a best-effort basis. As such, these features aren't meant for production use. For more information, see the following support articles:
- Install the
aks-previewAzure CLI extension using theaz extension addcommand.
az extension add --name aks-preview
- Update to the latest version of the extension using the
az extension updatecommand. Windows Server 2025 requires a minimum of 18.0.0b40.
az extension update --name aks-preview
Register the AksWindows2025Preview feature flag
- Register the
AksWindows2025Previewfeature flag using the [az feature register][az-feature-register] command.
az feature register --name AksWindows2025Preview --namespace Microsoft.ContainerService
- Verify the registration status using the [
az feature show][az-feature-show] command. It takes a few minutes for the status to show Registered.
az feature show --name AksWindows2025Preview --namespace Microsoft.ContainerService
When the status reflects Registered, refresh the registration of the Microsoft.ContainerService resource provider using the [
az provider register][az-provider-register] command.az provider register --namespace Microsoft.ContainerService
Create a resource group
An Azure resource group is a logical group in which Azure resources are deployed and managed. When you create a resource group, you're asked to specify a location. This location is where resource group metadata is stored and where your resources run in Azure if you don't specify another region during resource creation.
Create a resource group using the
New-AzResourceGroupcmdlet. The following example creates a resource group named myResourceGroup in the eastus region.New-AzResourceGroup -Name myResourceGroup -Location eastusThe following example output shows that the resource group was created successfully:
ResourceGroupName : myResourceGroup Location : chinaeast2 ProvisioningState : Succeeded Tags : ResourceId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup
Create an AKS cluster
In this section, we create an AKS cluster with the following configuration:
- The cluster is configured with two nodes to ensure it operates reliably. A node is an Azure virtual machine (VM) that runs the Kubernetes node components and container runtime.
- The
-WindowsProfileAdminUserNameand-WindowsProfileAdminUserPasswordparameters set the administrator credentials for any Windows Server nodes on the cluster and must meet the Windows Server password complexity requirements. - The node pool uses
VirtualMachineScaleSets.
Use the following steps to create the AKS cluster with Azure PowerShell:
Create the administrator credentials for your Windows Server containers using the following command. This command prompts you to enter a
WindowsProfileAdminUserNameandWindowsProfileAdminUserPassword. The password must be a minimum of 14 characters and meet the Windows Server password complexity requirements.$AdminCreds = Get-Credential ` -Message 'Please create the administrator credentials for your Windows Server containers'Create your cluster using the
New-AzAksClustercmdlet and specify theWindowsProfileAdminUserNameandWindowsProfileAdminUserPasswordparameters.New-AzAksCluster -ResourceGroupName myResourceGroup ` -Name myAKSCluster ` -NodeCount 2 ` -NetworkPlugin azure ` -NodeVmSetType VirtualMachineScaleSets ` -WindowsProfileAdminUserName $AdminCreds.UserName ` -WindowsProfileAdminUserPassword $secureString ` -GenerateSshKeyAfter a few minutes, the command completes and returns JSON-formatted information about the cluster. Occasionally, the cluster can take longer than a few minutes to provision. Allow up to 10 minutes for provisioning.
If you get a password validation error, and the password that you set meets the length and complexity requirements, try creating your resource group in another region. Then try creating the cluster with the new resource group.
If you don't specify an administrator username and password when creating the node pool, the username is set to azureuser and the password is set to a random value. For more information, see the Windows Server FAQ.
The administrator username can't be changed, but you can change the administrator password that your AKS cluster uses for Windows Server nodes using
az aks update. For more information, see the Windows Server FAQ.To run an AKS cluster that supports node pools for Windows Server containers, your cluster needs to use a network policy that uses Azure CNI (advanced) network plugin. The
-NetworkPlugin azureparameter specifies Azure CNI.
Add a node pool
By default, an AKS cluster is created with a node pool that can run Linux containers. You must add another node pool that can run Windows Server containers alongside the Linux node pool.
To create a Windows node pool, you need to specify a supported OsType and OsSku. Use the information in the following table to determine which is appropriate for your cluster:
OsType |
OsSku |
Default | Supported K8s versions | Details |
|---|---|---|---|---|
windows |
Windows2025 |
Not default. Currently in preview. | 1.32+ | Updated defaults: containerd 2.0, Generation 2 image is used by default. |
windows |
Windows2022 |
Default in K8s 1.25-1.34 | Not available in K8s 1.35+ | Retires in March 2027. Updated defaults: FIPS is enabled by default |
windows |
Windows2019 |
Default in K8s 1.24 and below | Not available in K8s 1.32+ | Retires in March 2026. |
Windows Server 2022 is the default operating system for Kubernetes versions 1.25-1.34. Windows Server 2019 is the default OS for earlier versions. If you don't specify a particular OS SKU, Azure creates the new node pool with the default SKU for the version of Kubernetes used by the cluster.
Note
- Windows Server 2022 retires after Kubernetes version 1.34 reaches end of support and won't be supported in Kubernetes version 1.35 and above.
- Windows Server 2019 retires after Kubernetes version 1.32 reaches end of support and won't be supported in Kubernetes version 1.33 and above.
For more information, see AKS release notes. To stay up to date on the latest Windows Server OS versions and learn more about our roadmap of what's planned for support on AKS, see our AKS public roadmap.
Add a Windows Server node pool using the
New-AzAksNodePoolcmdlet. The following command creates a new node pool named npwin and adds it to myAKSCluster. The command also uses the default subnet in the default virtual network created when runningNew-AzAksCluster:New-AzAksNodePool -ResourceGroupName myResourceGroup ` -ClusterName myAKSCluster ` -VmSetType VirtualMachineScaleSets ` -OsType Windows ` -OsSKU Windows2022 ` -Name npwin
Connect to the cluster
You use kubectl, the Kubernetes command-line client, to manage your Kubernetes clusters. To you want to install kubectl locally, you can use the Install-AzAzAksCliTool cmdlet.
Configure
kubectlto connect to your Kubernetes cluster using theImport-AzAksCredentialcmdlet. This command downloads credentials and configures the Kubernetes CLI to use them.Import-AzAksCredential -ResourceGroupName myResourceGroup -Name myAKSClusterVerify the connection to your cluster using the
kubectl getcommand, which returns a list of the cluster nodes.kubectl get nodesThe following example output shows all the nodes in the cluster. Make sure the status of all nodes is Ready:
NAME STATUS ROLES AGE VERSION aks-nodepool1-20786768-vmss000000 Ready agent 22h v1.27.7 aks-nodepool1-20786768-vmss000001 Ready agent 22h v1.27.7 aksnpwin000000 Ready agent 21h v1.27.7
Deploy the application
A Kubernetes manifest file defines a desired state for the cluster, such as what container images to run. In this article, you use a manifest to create all objects needed to run the ASP.NET sample application in a Windows Server container. This manifest includes a Kubernetes deployment for the ASP.NET sample application and an external Kubernetes service to access the application from the internet.
The ASP.NET sample application is provided as part of the .NET Framework Samples and runs in a Windows Server container. AKS requires Windows Server containers to be based on images of Windows Server 2019 or greater. The Kubernetes manifest file must also define a node selector to tell your AKS cluster to run your ASP.NET sample application's pod on a node that can run Windows Server containers.
Create a file named
sample.yamland copy in the following YAML definition:apiVersion: apps/v1 kind: Deployment metadata: name: sample labels: app: sample spec: replicas: 1 template: metadata: name: sample labels: app: sample spec: nodeSelector: "kubernetes.io/os": windows containers: - name: sample image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp resources: limits: cpu: 1 memory: 800M ports: - containerPort: 80 selector: matchLabels: app: sample --- apiVersion: v1 kind: Service metadata: name: sample spec: type: LoadBalancer ports: - protocol: TCP port: 80 selector: app: sampleFor a breakdown of YAML manifest files, see Deployments and YAML manifests.
If you create and save the YAML file locally, then you can upload the manifest file to your default directory in CloudShell by selecting the Upload/Download files button and selecting the file from your local file system.
Deploy the application using the
kubectl applycommand and specify the name of your YAML manifest.kubectl apply -f sample.yamlThe following example output shows the deployment and service created successfully:
deployment.apps/sample created service/sample created
Test the application
When the application runs, a Kubernetes service exposes the application front end to the internet. This process can take a few minutes to complete. Occasionally, the service can take longer than a few minutes to provision. Allow up to 10 minutes for provisioning.
Check the status of the deployed pods using the
kubectl get podscommand. Make all pods areRunningbefore proceeding.kubectl get podsMonitor progress using the
kubectl get servicecommand with the--watchargument.kubectl get service sample --watchInitially, the output shows the EXTERNAL-IP for the sample service as pending:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6sWhen the EXTERNAL-IP address changes from pending to an actual public IP address, use
CTRL-Cto stop thekubectlwatch process.The following example output shows a valid public IP address assigned to the service:
sample LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2mSee the sample app in action by opening a web browser to the external IP address of your service.
Delete resources
If you don't plan on going through the AKS tutorial, then delete your cluster to avoid incurring Azure charges.
Remove the resource group, container service, and all related resources using the
Remove-AzResourceGroupcmdlet.Remove-AzResourceGroup -Name myResourceGroupNote
The AKS cluster was created with system-assigned managed identity (default identity option used in this quickstart). The Azure platform manages this identity, so it doesn't require removal.
Next steps
In this quickstart, you deployed a Kubernetes cluster and then deployed an ASP.NET sample application in a Windows Server container to it. This sample application is for demo purposes only and doesn't represent all the best practices for Kubernetes applications.
To learn more about AKS, and to walk through a complete code-to-deployment example, continue to the Kubernetes cluster tutorial.