1. Docs
  2. Infrastructure as Code
  3. Get Started
  4. Kubernetes
  5. Create project

Pulumi & Kubernetes: Create project

    Create a new project

    A project 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:

    $ mkdir quickstart
    
    > mkdir quickstart
    

    Change into the new directory:

    $ cd quickstart
    
    > cd quickstart
    

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

    $ pulumi new kubernetes-typescript
    
    > pulumi new kubernetes-typescript
    
    $ pulumi new kubernetes-python
    
    > pulumi new kubernetes-python
    
    $ pulumi new kubernetes-go
    
    > pulumi new kubernetes-go
    
    $ pulumi new kubernetes-csharp
    
    > pulumi new kubernetes-csharp
    
    $ pulumi new kubernetes-java
    
    > pulumi new kubernetes-java
    
    $ pulumi new kubernetes-yaml
    
    > pulumi new kubernetes-yaml
    

    The pulumi new command interactively walks through initializing a new project, as well as creating a stack and configuring 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.

    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 explains what Pulumi Cloud is and this topic describes alternative Pulumi backend options.

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

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

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

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

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

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

    Review your new project’s contents

    Review some of the generated project files:

    • Pulumi.yaml defines both the project and the program that manages your stack resources.
    • If present, Pulumi.dev.yaml would contain configuration values for the stack we initialized. However, it’s empty since this project doesn’t require any configuration.
    • src/main/java/myproject defines the project’s Java package root.
    • __main__.py is the Pulumi program that defines your stack resources.
    • index.js index.ts main.py main.go Program.cs Program.fs Program.vb App.java Pulumi.yaml is the Pulumi program that defines your stack resources.

    Examine index.js index.ts __main__.py main.go Program.cs Program.fs Program.vb App.java Pulumi.yaml :

    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;
    
    """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"])
    
    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
    	})
    }
    
    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)
        };
    });
    
    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);
            });
        }
    }
    
    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}
    

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

      Neo just got smarter about infrastructure policy automation