---
title: Create project
url: /docs/iac/get-started/kubernetes/create-project/
---
## Create a new project

A [**project**](/docs/iac/concepts/projects) is a program in your chosen language that defines a collection of related cloud resources. In this step, you will create a new project.

### Initializing your project

Each project lives in its own directory. Create a new one:

<!-- chooser: os -->
<!-- option: linux -->

```bash
$ mkdir quickstart
```

<!-- /option -->

<!-- option: windows -->

```powershell
> mkdir quickstart
```

<!-- /option -->
<!-- /chooser -->

Change into the new directory:

<!-- chooser: os -->
<!-- option: linux -->

```bash
$ cd quickstart
```

<!-- /option -->

<!-- option: windows -->

```powershell
> cd quickstart
```

<!-- /option -->
<!-- /chooser -->

Now initialize a new Pulumi project for Kubernetes using the `pulumi new` command:

<!-- chooser: language -->
<!-- option: typescript -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-typescript

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-typescript

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: python -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-python

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-python

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: go -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-go

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-go

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: csharp -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-csharp

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-csharp

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: java -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-java

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-java

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: yaml -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new kubernetes-yaml

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new kubernetes-yaml

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->
<!-- /chooser -->

The `pulumi new` command interactively walks through initializing a new project, as well as creating a [**stack**](/docs/iac/concepts/stacks) and [**configuring**](/docs/iac/concepts/config) it. A stack is an instance of your project and you may have many of them -- like `dev`, `staging`, and `prod` -- each with different configuration settings.

> **Note:** If this is your first time running Pulumi, you will be prompted to log into Pulumi Cloud. This is a free but optional service that makes IaC easy by safely and securely managing state for you. [This guide](/docs/iac/guides/basics/pulumi-cloud-vs-oss/) explains what Pulumi Cloud is and [this topic](/docs/iac/concepts/state-and-backends) describes alternative Pulumi backend options.

<!-- chooser: language -->
<!-- option: typescript -->

After some dependency installations from `npm`, the project and stack will be ready.

<!-- /option -->

<!-- option: python -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: go -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: csharp -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: java -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: yaml -->

After the command completes, the project and stack will be ready.

<!-- /option -->
<!-- /chooser -->

### Review your new project's contents

Review some of the generated project files:

<!-- chooser: language -->
<!-- option: typescript -->

- `Pulumi.yaml` defines the [project](/docs/concepts/projects/).

<!-- /option -->

<!-- option: yaml -->

- `Pulumi.yaml` defines both the [project](/docs/concepts/projects/) and the program that manages your stack resources.

<!-- /option -->
<!-- /chooser -->

- If present, `Pulumi.dev.yaml` would contain [configuration](/docs/concepts/config/) values for the [stack](/docs/concepts/stack/) we initialized. However, it's empty since this project doesn't require any configuration.

<!-- chooser: language -->
<!-- option: java -->

- `src/main/java/myproject` defines the project's Java package root.

<!-- /option -->

<!-- option: python -->

- `__main__.py` is the Pulumi program that defines your stack resources.

<!-- /option -->

<!-- option: typescript -->

- <!-- chooser: language -->
<!-- option: javascript -->
`index.js`
<!-- /option -->
<!-- option: typescript -->
`index.ts`
<!-- /option -->
<!-- option: python -->
`__main__.py`
<!-- /option -->
<!-- option: go -->
`main.go`
<!-- /option -->
<!-- option: csharp -->
`Program.cs`
<!-- /option -->
<!-- option: fsharp -->
`Program.fs`
<!-- /option -->
<!-- option: visualbasic -->
`Program.vb`
<!-- /option -->
<!-- option: java -->
`App.java`
<!-- /option -->
<!-- option: yaml -->
`Pulumi.yaml`
<!-- /option -->
<!-- /chooser -->
 is the Pulumi program that defines your stack resources.

<!-- /option -->
<!-- /chooser -->

Examine <!-- chooser: language -->
<!-- option: javascript -->
`index.js`
<!-- /option -->
<!-- option: typescript -->
`index.ts`
<!-- /option -->
<!-- option: python -->
`__main__.py`
<!-- /option -->
<!-- option: go -->
`main.go`
<!-- /option -->
<!-- option: csharp -->
`Program.cs`
<!-- /option -->
<!-- option: fsharp -->
`Program.fs`
<!-- /option -->
<!-- option: visualbasic -->
`Program.vb`
<!-- /option -->
<!-- option: java -->
`App.java`
<!-- /option -->
<!-- option: yaml -->
`Pulumi.yaml`
<!-- /option -->
<!-- /chooser -->
:

<!-- chooser: language -->
<!-- option: typescript -->

```typescript
import * as k8s from "@pulumi/kubernetes";

const appLabels = { app: "nginx" };
const deployment = new k8s.apps.v1.Deployment("nginx", {
    spec: {
        selector: { matchLabels: appLabels },
        replicas: 1,
        template: {
            metadata: { labels: appLabels },
            spec: { containers: [{ name: "nginx", image: "nginx" }] }
        }
    }
});
export const name = deployment.metadata.name;
```

<!-- /option -->

<!-- option: python -->

```python
"""A Kubernetes Python Pulumi program"""

import pulumi
from pulumi_kubernetes.apps.v1 import Deployment, DeploymentSpecArgs
from pulumi_kubernetes.meta.v1 import LabelSelectorArgs, ObjectMetaArgs
from pulumi_kubernetes.core.v1 import ContainerArgs, PodSpecArgs, PodTemplateSpecArgs

app_labels = { "app": "nginx" }

deployment = Deployment(
    "nginx",
    spec={
        "selector": { "match_labels": app_labels },
        "replicas": 1,
        "template": {
            "metadata": { "labels": app_labels },
            "spec": { "containers": [{ "name": "nginx", "image": "nginx" }] }
        },
    })

pulumi.export("name", deployment.metadata["name"])
```

<!-- /option -->

<!-- option: go -->

```go
package main

import (
	appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apps/v1"
	corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
	metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {

		appLabels := pulumi.StringMap{
			"app": pulumi.String("nginx"),
		}
		deployment, err := appsv1.NewDeployment(ctx, "app-dep", &appsv1.DeploymentArgs{
			Spec: appsv1.DeploymentSpecArgs{
				Selector: &metav1.LabelSelectorArgs{
					MatchLabels: appLabels,
				},
				Replicas: pulumi.Int(1),
				Template: &corev1.PodTemplateSpecArgs{
					Metadata: &metav1.ObjectMetaArgs{
						Labels: appLabels,
					},
					Spec: &corev1.PodSpecArgs{
						Containers: corev1.ContainerArray{
							corev1.ContainerArgs{
								Name:  pulumi.String("nginx"),
								Image: pulumi.String("nginx"),
							}},
					},
				},
			},
		})
		if err != nil {
			return err
		}

		ctx.Export("name", deployment.Metadata.Name())

		return nil
	})
}

```

<!-- /option -->

<!-- option: csharp -->

```csharp
using Pulumi;
using Pulumi.Kubernetes.Types.Inputs.Core.V1;
using Pulumi.Kubernetes.Types.Inputs.Apps.V1;
using Pulumi.Kubernetes.Types.Inputs.Meta.V1;
using System.Collections.Generic;

return await Deployment.RunAsync(() =>
{
    var appLabels = new InputMap<string>
    {
        { "app", "nginx" }
    };

    var deployment = new Pulumi.Kubernetes.Apps.V1.Deployment("nginx", new DeploymentArgs
    {
        Spec = new DeploymentSpecArgs
        {
            Selector = new LabelSelectorArgs
            {
                MatchLabels = appLabels
            },
            Replicas = 1,
            Template = new PodTemplateSpecArgs
            {
                Metadata = new ObjectMetaArgs
                {
                    Labels = appLabels
                },
                Spec = new PodSpecArgs
                {
                    Containers =
                    {
                        new ContainerArgs
                        {
                            Name = "nginx",
                            Image = "nginx",
                            Ports =
                            {
                                new ContainerPortArgs
                                {
                                    ContainerPortValue = 80
                                }
                            }
                        }
                    }
                }
            }
        }
    });

    // export the deployment name
    return new Dictionary<string, object?>
    {
        ["name"] =  deployment.Metadata.Apply(m => m.Name)
    };
});
```

<!-- /option -->

<!-- option: java -->

```java
package myproject;

import com.pulumi.Pulumi;
import com.pulumi.kubernetes.apps.v1.Deployment;
import com.pulumi.kubernetes.apps.v1.DeploymentArgs;
import com.pulumi.kubernetes.apps.v1.inputs.DeploymentSpecArgs;
import com.pulumi.kubernetes.core.v1.inputs.ContainerArgs;
import com.pulumi.kubernetes.core.v1.inputs.ContainerPortArgs;
import com.pulumi.kubernetes.core.v1.inputs.PodSpecArgs;
import com.pulumi.kubernetes.core.v1.inputs.PodTemplateSpecArgs;
import com.pulumi.kubernetes.meta.v1.inputs.LabelSelectorArgs;
import com.pulumi.kubernetes.meta.v1.inputs.ObjectMetaArgs;

import java.util.Map;

public class App {
    public static void main(String[] args) {
        Pulumi.run(ctx -> {
            var labels = Map.of("app", "nginx");

            var deployment = new Deployment("nginx", DeploymentArgs.builder()
                    .spec(DeploymentSpecArgs.builder()
                            .selector(LabelSelectorArgs.builder()
                                    .matchLabels(labels)
                                    .build())
                            .replicas(1)
                            .template(PodTemplateSpecArgs.builder()
                                    .metadata(ObjectMetaArgs.builder()
                                            .labels(labels)
                                            .build())
                                    .spec(PodSpecArgs.builder()
                                            .containers(ContainerArgs.builder()
                                                    .name("nginx")
                                                    .image("nginx")
                                                    .ports(ContainerPortArgs.builder()
                                                            .containerPort(80)
                                                            .build())
                                                    .build())
                                            .build())
                                    .build())

                            .build())
                    .build());

            var name = deployment.metadata()
                .applyValue(m -> m.orElseThrow().name().orElse(""));

            ctx.export("name", name);
        });
    }
}
```

<!-- /option -->

<!-- option: yaml -->

```yaml
name: quickstart
runtime: yaml
description: A minimal Kubernetes Pulumi YAML program

variables:
  appLabels:
    app: nginx

resources:
  deployment:
    name: nginx
    type: kubernetes:apps/v1:Deployment
    properties:
      spec:
        selector:
          matchLabels: ${appLabels}
        replicas: 1
        template:
          metadata:
            labels: ${appLabels}
          spec:
            containers:
              - name: nginx
                image: nginx

outputs:
  name: ${deployment.metadata.name}
```

<!-- /option -->
<!-- /chooser -->

This Pulumi program creates an NGINX deployment and exports the name of the deployment.

---
[← Previous step](/docs/iac/get-started/kubernetes/configure/)
[Next: Deploy to Kubernetes →](/docs/iac/get-started/kubernetes/deploy-stack/)


