- Authors

- Name
- Phillip Pham
- @ddppham
TL;DR
Pulumi ermöglicht Infrastructure as Code mit echten Programmiersprachen statt proprietärer DSLs. Mit TypeScript bekommst du Typ-Sicherheit, Autocompletion und Wiederverwendbarkeit für deine Kubernetes-Infrastruktur. Dieser Guide zeigt dir, wie du einen EKS-Cluster erstellst und Workloads mit Pulumi deployest.
Kubernetes-Infrastruktur mit Pulumi und TypeScript
HCL, YAML, JSON — Infrastruktur wird traditionell in Konfigurationssprachen definiert. Pulumi geht einen anderen Weg: Du schreibst Infrastructure as Code in TypeScript, Python, Go oder C#. Für Kubernetes-Teams, die ohnehin TypeScript nutzen, fällt damit eine Sprachbarriere weg.
Warum Pulumi statt Terraform?
Drei Argumente sprechen für Pulumi im Kubernetes-Kontext:
// TypeScript: Typ-Sicherheit und IDE-Support
import * as k8s from "@pulumi/kubernetes";
// Fehler werden VOR dem Deployment erkannt
const deploy = new k8s.apps.v1.Deployment("app", {
spec: {
replicas: 3, // IDE zeigt dir: number erwartet
selector: { matchLabels: { app: "web" } },
template: {
metadata: { labels: { app: "web" } },
spec: {
containers: [{
name: "web",
image: "nginx:1.27",
ports: [{ containerPort: 80 }],
}],
},
},
},
});
Deine IDE warnt dich sofort, wenn du replicas: "drei" schreibst. Bei HCL oder YAML fällt das erst beim Apply auf.
| Kriterium | Pulumi | Terraform |
|---|---|---|
| Sprache | TypeScript, Python, Go, C# | HCL |
| Typ-Sicherheit | Ja (bei TypeScript) | Nein |
| State Management | Pulumi Cloud, S3, lokal | Terraform Cloud, S3, lokal |
| Kubernetes-Support | Nativ | Via Provider |
| Lernkurve | Gering (bekannte Sprachen) | Mittel (HCL lernen) |
Projekt einrichten
Pulumi CLI installieren und ein neues Projekt starten:
# Pulumi CLI installieren
# macOS
brew install pulumi
# Linux
curl -fsSL https://get.pulumi.com | sh
# Neues Projekt erstellen
mkdir k8s-infra && cd k8s-infra
pulumi new aws-typescript
# Abhängigkeiten für EKS
npm install @pulumi/eks @pulumi/kubernetes
Das Projekt enthält nach der Initialisierung drei Dateien: Pulumi.yaml (Projektkonfiguration), index.ts (dein Code) und Pulumi.dev.yaml (Stack-Konfiguration).
EKS-Cluster erstellen
Das @pulumi/eks-Paket abstrahiert die Komplexität von VPC, Subnets und Node Groups:
import * as pulumi from "@pulumi/pulumi";
import * as eks from "@pulumi/eks";
import * as k8s from "@pulumi/kubernetes";
// EKS-Cluster mit Managed Node Group
const cluster = new eks.Cluster("production", {
instanceType: "t3.medium",
desiredCapacity: 3,
minSize: 2,
maxSize: 5,
version: "1.31",
nodeRootVolumeSize: 50,
enabledClusterLogTypes: [
"api", "audit", "authenticator",
],
});
// Kubeconfig als Output exportieren
export const kubeconfig = cluster.kubeconfig;
export const clusterName = cluster.eksCluster.name;
Mit pulumi up wird der Cluster erstellt. Pulumi zeigt dir vorher einen Preview aller Änderungen — ähnlich wie terraform plan.
Workloads deployen
Der Cluster-Output lässt sich direkt als Provider für Kubernetes-Ressourcen nutzen:
// Kubernetes-Provider mit dem erstellten Cluster
const provider = new k8s.Provider("k8s", {
kubeconfig: cluster.kubeconfig,
});
// Namespace
const ns = new k8s.core.v1.Namespace("app", {
metadata: { name: "production" },
}, { provider });
// Deployment
const appDeployment = new k8s.apps.v1.Deployment("web-app", {
metadata: { namespace: ns.metadata.name },
spec: {
replicas: 3,
selector: { matchLabels: { app: "web" } },
template: {
metadata: { labels: { app: "web" } },
spec: {
containers: [{
name: "app",
image: "my-registry/web-app:v1.2.0",
ports: [{ containerPort: 8080 }],
resources: {
requests: { cpu: "100m", memory: "128Mi" },
limits: { cpu: "500m", memory: "512Mi" },
},
livenessProbe: {
httpGet: { path: "/healthz", port: 8080 },
initialDelaySeconds: 10,
},
}],
},
},
},
}, { provider });
// Service
const service = new k8s.core.v1.Service("web-service", {
metadata: { namespace: ns.metadata.name },
spec: {
type: "LoadBalancer",
selector: { app: "web" },
ports: [{ port: 80, targetPort: 8080 }],
},
}, { provider });
export const serviceUrl = service.status.loadBalancer.ingress[0].hostname;
Der gesamte Stack — vom EKS-Cluster bis zum LoadBalancer — wird in einer Datei beschrieben und mit einem Befehl deployed.
Wiederverwendbare Komponenten
Der größte Vorteil gegenüber HCL: echte Abstraktion durch Klassen und Funktionen.
// Wiederverwendbare Microservice-Komponente
interface MicroserviceArgs {
image: string;
port: number;
replicas?: number;
namespace: pulumi.Input<string>;
}
function createMicroservice(
name: string,
args: MicroserviceArgs,
provider: k8s.Provider
) {
const labels = { app: name };
const deployment = new k8s.apps.v1.Deployment(name, {
metadata: { namespace: args.namespace },
spec: {
replicas: args.replicas ?? 2,
selector: { matchLabels: labels },
template: {
metadata: { labels },
spec: {
containers: [{
name,
image: args.image,
ports: [{ containerPort: args.port }],
}],
},
},
},
}, { provider });
const service = new k8s.core.v1.Service(`${name}-svc`, {
metadata: { namespace: args.namespace },
spec: {
selector: labels,
ports: [{ port: args.port }],
},
}, { provider });
return { deployment, service };
}
// Nutzung: 3 Microservices mit einer Funktion
createMicroservice("api", {
image: "my-app/api:latest",
port: 3000,
replicas: 3,
namespace: "production",
}, provider);
createMicroservice("worker", {
image: "my-app/worker:latest",
port: 9090,
namespace: "production",
}, provider);
In Terraform bräuchtest du dafür Module mit separaten Verzeichnissen und Variable-Definitionen. In Pulumi ist es eine TypeScript-Funktion.
State und Secrets
Pulumi verschlüsselt Secrets im State standardmäßig — ein Unterschied zu Terraform, wo Secrets im Klartext im State landen:
# Secret in der Konfiguration setzen
pulumi config set --secret dbPassword "s3cure-p4ss!"
# State-Backend wählen
# Pulumi Cloud (default)
pulumi login
# Self-hosted S3
pulumi login s3://my-pulumi-state
# Lokaler State
pulumi login --local
CI/CD-Integration
Pulumi lässt sich nahtlos in GitHub Actions einbinden:
# .github/workflows/infra.yml
name: Infrastructure
on:
push:
branches: [main]
paths: ['infra/**']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm ci
working-directory: infra
- uses: pulumi/actions@v6
with:
command: up
stack-name: production
work-dir: infra
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
FAQ
Kann ich bestehende Terraform-Projekte zu Pulumi migrieren?
Ja. Pulumi bietet pulumi convert --from terraform, das HCL-Code in TypeScript konvertiert. Zusätzlich kann pulumi import bestehende Cloud-Ressourcen importieren, die zuvor mit Terraform verwaltet wurden.
Ist Pulumi für Production-Cluster geeignet?
Pulumi wird von Unternehmen wie Mercedes-Benz und Snowflake produktiv eingesetzt. Der State kann in S3 oder Pulumi Cloud gespeichert werden. Für kritische Infrastruktur empfiehlt sich Review-Stacks und Policy as Code mit CrossGuard.
Brauche ich Pulumi Cloud?
Nein. Pulumi funktioniert vollständig Open Source mit Self-hosted State Backends (S3, Azure Blob, GCS). Pulumi Cloud bietet zusätzlich Audit-Logs, RBAC und eine Web-UI — ist aber optional.
Wie verhält sich Pulumi bei Drift Detection?
Mit pulumi refresh gleicht Pulumi den State mit dem tatsächlichen Zustand der Cloud-Ressourcen ab. Abweichungen werden angezeigt und können mit pulumi up korrigiert werden.
Nächster Schritt: Erstelle ein Pulumi-Projekt für deinen Kubernetes-Cluster und definiere Infrastruktur und Workloads in einer Sprache. Der offizielle Pulumi-Guide für EKS ist ein guter Startpunkt.
Kubernetes-Expertise gesucht?
Managed Services, Beratung, Training oder Security – wir unterstützen deutsche Unternehmen bei allen Kubernetes-Themen.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Terraform für Kubernetes: Infrastructure as Code
Kubernetes-Cluster und Ressourcen mit Terraform verwalten: EKS-Cluster erstellen, Deployments provisionieren und State sicher managen.
Generative AI in DevOps: Produktivität steigern mit KI-Tools
Wie ein deutsches Software-Team mit Generative AI in DevOps die Produktivität um 180% steigerte und jährlich über 300.000 Euro Entwicklerkosten einspart.
Kubernetes Automotive ASPICE 2026: Container für SDV und Compliance
Entdecken Sie, wie Kubernetes Automotive ASPICE 2026 Standards für die SDV-Entwicklung & Compliance revolutioniert. Effiziente Entwicklung, Tests und sichere Prozesse für OEMs in Deutschland – ein entscheidender Schritt für Kubernetes Compliance Deutschland.
Self-Hosted Kubernetes AI Code Assistant: Ihr eigener Copilot für Datensouveränität
Entdecken Sie, wie Ihr Unternehmen mit einem selbst-gehosteten Kubernetes AI Code Assistant maximale Datensouveränität sicherstellt und Compliance-Anforderungen erfüllt. Profitieren Sie von Kosteneffizienz und maßgeschneiderter Coding AI als leistungsstarke Copilot-Alternative – ideal für deutsche Entwicklungsteams und den Mittelstand.
Kubernetes Medizintechnik MDR 2026 Container-Compliance
Die EU-MDR stellt hohe Anforderungen an Medizintechnik-Software bis 2026. Dieser Artikel beleuchtet, wie Sie Ihre Kubernetes-Umgebung in Deutschland **MDR-konform** gestalten und Ihre **Container-Workflows** im **Healthcare**-Sektor sicher betreiben. Erfahren Sie die entscheidenden Strategien für **Infrastruktur-Qualifizierung**, **Software-Validierung** und umfassende **Kubernetes Compliance** in regulierten Umgebungen.