---
title: "Kubernetes Cluster on Azure"
description: "Deploy a managed Kubernetes cluster on Azure with Pulumi and Azure Kubernetes Service (AKS) in TypeScript, Python, Go, C#, YAML, or HCL."
url: "https://www.pulumi.com/dev/templates/kubernetes/azure/"
image: "https://www.pulumi.com/assets/og/dev/templates/kubernetes/azure.png"
---

# Kubernetes Cluster on Azure

Deploy a managed Kubernetes cluster on Azure with Pulumi and Azure Kubernetes Service (AKS) in TypeScript, Python, Go, C#, YAML, or HCL.

The Azure Kubernetes Cluster template scaffolds a Pulumi project that provisions a managed [Azure Kubernetes Service (AKS) cluster](https://www.pulumi.com/registry/packages/azure-native/api-docs/containerservice/managedcluster) inside a new [Azure Virtual Network](https://www.pulumi.com/registry/packages/azure-native/api-docs/network/virtualnetwork/) with three subnets. Worker nodes are deployed with private IP addresses for improved security and spread across multiple availability zones for resilience.

![An architecture diagram of the Azure Kubernetes Cluster template](./architecture.png)

## Using this template

To use this template to deploy your own Kubernetes cluster, make sure you've [installed Pulumi](https://www.pulumi.com/docs/install/) and [configured your Azure credentials](https://www.pulumi.com/registry/packages/azure-native/installation-configuration#credentials), then create a new [project](https://www.pulumi.com/docs/iac/concepts/projects/) using the template in the language of your choice:

**TypeScript**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-typescript
```

**Python**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-python
```

**Go**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-go
```

**C#**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-csharp
```

**YAML**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-yaml
```

**HCL**

```bash
mkdir my-k8s-cluster && cd my-k8s-cluster
pulumi new kubernetes-azure-hcl
```

Follow the prompts to complete the new-project wizard. When it's done, you'll have a complete Pulumi project that's ready to deploy and configured with the most common settings. Feel free to inspect the code in `index.ts` for a closer look.

## Deploying the project

**TypeScript / Python / Go / C# / YAML**

You must supply two values to deploy the cluster. You can input both through the new-project wizard:

**`mgmtGroupId`**

The object ID of an existing Azure AD group that will serve as the cluster administrator.

**`sshPubKey`**

The contents of the public key used for SSH access to the cluster nodes.

Once the project is created, you can deploy it with [`pulumi up`](https://www.pulumi.com/docs/iac/cli/commands/pulumi_up):

**HCL**

The template requires no additional configuration. Once the new project is created, you can deploy it immediately with [`pulumi up`](https://www.pulumi.com/docs/iac/cli/commands/pulumi_up):

```bash
$ pulumi up
```

When the deployment completes, Pulumi exports the following [stack output](https://www.pulumi.com/docs/iac/concepts/stacks/#outputs) values:

**TypeScript / Python / Go / C# / YAML**

**`rgname`**

The name of the Azure Resource Group containing the Kubernetes cluster resources.

**`vnetName`**

The name of the Azure Virtual Network used for worker nodes, apps, and workloads.

**`clusterName`**

The name of the AKS cluster.

**`kubeconfig`**

The cluster's kubeconfig file, which you can use with `kubectl` to access and communicate with your cluster.

**HCL**

**`cluster_name`**

The name of the AKS cluster.

**`kubeconfig`**

The cluster's kubeconfig file, which you can use with `kubectl` to access and communicate with your cluster.

Output values like these are useful in many ways, most commonly as inputs for other stacks or related cloud resources.

## Customizing the project

Projects created with the Kubernetes Cluster template expose the following [configuration](https://www.pulumi.com/docs/iac/concepts/config/) settings:

**TypeScript / Python / Go / C# / YAML**

**`numWorkerNodes`**

The number of nodes in your cluster. Defaults to `3`.

**`kubernetesVersion`**

The version of Kubernetes used in your AKS cluster. Defaults to `1.24.3`.

**`prefixForDns`**

The unique DNS prefix for your AKS cluster. Defaults to `pulumi`.

**`nodeVmSize`**

The VM instance type used to run your nodes. Defaults to `Standard_DS2_v2`.

**HCL**

**`node_count`**

The number of worker nodes in the cluster. Defaults to `3`.

**`dns_prefix`**

The unique DNS prefix to use for the cluster. Defaults to `pulumi`.

**`node_vm_size`**

The VM size to use for worker nodes. Defaults to `Standard_DS2_v2`.

All of these settings are optional and may be adjusted either by editing the stack configuration file directly (by default, `Pulumi.dev.yaml`) or by changing their values with [`pulumi config set`](https://www.pulumi.com/docs/iac/cli/commands/pulumi_config_set):

**TypeScript / Python / Go / C# / YAML**

```bash
$ pulumi config set numWorkerNodes 5
$ pulumi up
```

**HCL**

```bash
$ pulumi config set node_count 5
$ pulumi up
```

## Cleaning up

You can cleanly destroy the stack and all of its infrastructure with [`pulumi destroy`](https://www.pulumi.com/docs/iac/cli/commands/pulumi_destroy):

```bash
$ pulumi destroy
```

## Learn more

- Browse other architecture templates in the [Templates gallery](https://www.pulumi.com/templates).
- Explore the [Azure Native provider API docs](https://www.pulumi.com/registry/packages/azure-native) in the Pulumi Registry.
- Walk through Pulumi from the ground up in [Pulumi Tutorials](https://www.pulumi.com/dev/browse/?type=tutorial).
- Read the latest [Kubernetes posts on the Pulumi blog](https://www.pulumi.com/blog/tag/kubernetes).
