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.
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.yamldefines the project.
Pulumi.yamldefines both the project and the program that manages your stack resources.
- If present,
Pulumi.dev.yamlwould contain configuration values for the stack we initialized. However, it’s empty since this project doesn’t require any configuration.
src/main/java/myprojectdefines the project’s Java package root.
__main__.pyis the Pulumi program that defines your stack resources.
is the Pulumi program that defines your stack resources.index.jsindex.tsmain.pymain.goProgram.csProgram.fsProgram.vbApp.javaPulumi.yaml
Examine index.jsindex.ts__main__.pymain.goProgram.csProgram.fsProgram.vbApp.javaPulumi.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.
Thank you for your feedback!
If you have a question about how to use Pulumi, reach out in Community Slack.
Open an issue on GitHub to report a problem or suggest an improvement.
