Veröffentlicht am

Pulumi: Kubernetes-Infrastruktur mit TypeScript

Teilen:
Authors

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.

KriteriumPulumiTerraform
SpracheTypeScript, Python, Go, C#HCL
Typ-SicherheitJa (bei TypeScript)Nein
State ManagementPulumi Cloud, S3, lokalTerraform Cloud, S3, lokal
Kubernetes-SupportNativVia Provider
LernkurveGering (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

kubernetesdevops

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.

Weiterlesen →