AMAZON ECS → STACKIT KUBERNETES ENGINE · HANDLEIDING
Amazon ECS naar STACKIT Kubernetes: een uitgewerkt voorbeeld
ECS heeft op STACKIT geen kant-en-klare tegenhanger: de containers blijven, de task definition en de service worden Kubernetes-objecten op STACKIT Kubernetes Engine (SKE). Deze handleiding voert StackToIT uit op een kleine Fargate-omgeving en laat zien wat StackToIT schrijft, wat het achterhoudt en wat u beslist voordat de eerste pod draait.
De invoer: één task definition, één service
Een demo-omgeving die voor deze pagina is geschreven: een Fargate-service met drie tasks van 0,5 vCPU en 1 GiB achter een Application Load Balancer, één secret, één gewone omgevingswaarde en een awslogs-loggroep. Links: de task definition en de service. Rechts: de Deployment die StackToIT ervoor opstelde (de lange commentaarkop van het bestand is hier weggelaten; al het getoonde is ongewijzigd).
resource "aws_ecs_task_definition" "web" {
family = "shop-web"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = "512"
memory = "1024"
execution_role_arn = aws_iam_role.task_execution.arn
container_definitions = jsonencode([
{
name = "web"
image = "registry.example.com/shop/web:1.8.2"
essential = true
portMappings = [{ containerPort = 8080, protocol = "tcp" }]
environment = [{ name = "APP_ENV", value = "production" }]
secrets = [{ name = "DATABASE_URL", valueFrom = aws_secretsmanager_secret.db_url.arn }]
logConfiguration = {
logDriver = "awslogs"
options = {
"awslogs-group" = "/ecs/shop-web"
"awslogs-region" = "eu-central-1"
"awslogs-stream-prefix" = "web"
}
}
}
])
}resource "aws_ecs_service" "web" {
name = "web"
cluster = aws_ecs_cluster.shop.id
task_definition = aws_ecs_task_definition.web.arn
desired_count = 3
launch_type = "FARGATE"
network_configuration {
subnets = [aws_subnet.app_a.id, aws_subnet.app_b.id]
security_groups = [aws_security_group.web.id]
}
load_balancer {
target_group_arn = aws_lb_target_group.web.arn
container_name = "web"
container_port = 8080
}
}apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app.kubernetes.io/name: web
spec:
replicas: 0 # held back until the start step of the plan scales to the number the header names
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 3
selector:
matchLabels:
app.kubernetes.io/name: web
template:
metadata:
labels:
app.kubernetes.io/name: web
spec:
containers:
- name: web
image: "registry.example.com/shop/web:1.8.2"
ports:
- containerPort: 8080
protocol: TCP
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: web-env
key: APP_ENV
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: web-secrets
key: DATABASE_URL
resources:
requests:
cpu: "500m"
memory: "1024Mi"
limits:
cpu: "500m"
memory: "1024Mi"
readinessProbe:
httpGet:
path: "/healthz"
port: 8080
periodSeconds: 30
timeoutSeconds: 6
successThreshold: 3
failureThreshold: 3De handleiding stap voor stap
Vijf stappen van de Terraform-bestanden naar een draaiende workload. StackToIT voert de eerste twee uit; alles daarna is werk van uw team, met de bestanden die StackToIT schreef.
1 · Voer het assessment uit
Voer StackToIT uit in de map met de Terraform. StackToIT leest de bestanden, maakt nooit verbinding met AWS en schrijft een uitvoermap met het concept, de beslissingen en het uitvoeringsplan.
2 · Lees de classificatie
Het cluster en de service zijn ingedeeld als REPLATFORM, het omliggende netwerk, het secret, de rol, de loggroep en de load balancer als RECONFIGURE. De task definition en de target group hebben geen eigen eenheid: hun inhoud gaat op in de service.
3 · Beantwoord de beslissingen
Beantwoord de openstaande beslissingen in review/decisions.yaml (hoe de load balancer de pods bereikt, of de pods netwerksegmentatie krijgen, welk netwerk het cluster en de bijbehorende consumers bevat, de opt-in voor de API-aanroepen). Stel de variabelen van de nodepool (machinetype, minimum, maximum) in het bestand met doelwaarden in.
4 · Pas eerst het cluster toe, dan de manifests
Pas eerst de Terraform voor het SKE-cluster toe. De manifests zijn geschreven met replicas op 0, zodat er niets draait of met een datastore verbindt voordat de data op zijn plaats staat.
5 · Schaal op en schakel het verkeer over
Schaal na de dataverplaatsing op naar het aantal tasks dat de bron vermeldt, voer de smoketest uit de checklist uit, verplaats de load balancer of het DNS-record en laat ECS draaien tot u het resultaat accepteert.
Wat de run rapporteert
De samenvatting die het commando voor de demo-omgeving toont (console.txt in de uitvoermap). Het commando is vanuit de invoermap uitgevoerd als stacktoit assess . <output folder> --offline --no-validate. --offline is de gedocumenteerde manier om zonder netwerkverzoeken te draaien. --no-validate sloeg de OpenTofu-controle van de bron over; daarom meldt de samenvatting dat die niet is uitgevoerd.
Source: input
Source files: 1
Resources scanned: 13
support resources: 1 (+0 Terraform helpers, out of scope; 1 + 0 = the 1 support node of summary.support.nodes in assessment.json)
Migration units: 10 (10 instances)
Unit dependencies: 14
Source checks: Built-in source checks passed — OpenTofu validation of the source was not run
STACKIT mapping
────────────────────────────────────────────
DIRECT 0
RECONFIGURE 8 ████████████████████████ 80%
REPLATFORM 2 ██████ 20%
CONTAINERIZE 0
REDESIGN 0
MANUAL_REVIEW 0
BLOCKED 0 (the mapping class BLOCKED, not the execution blockers, which Migration readiness counts)Hoe de ECS-instellingen op Kubernetes terechtkomen
| ECS-instelling in de demo | Kubernetes-resultaat in het concept | Wat u controleert |
|---|---|---|
| desired_count = 3 | replicas: 0 in het bestand, bij de startstap opgeschaald naar 3 | De startstap schrijft het getal ook in het bestand; als u het bestand opnieuw toepast met 0, worden de pods weer tegengehouden |
| cpu 512, memory 1024 op de task | requests en limits van 500m en 1024Mi op de container | Requests zijn hier gelijk aan limits; herzie ze zodra u het echte gebruik ziet |
| secrets valueFrom een Secrets Manager-secret | secretKeyRef naar een Secret web-secrets, sleutel DATABASE_URL | U maakt de Secret aan; de waarde verschijnt nooit in het concept |
| environment APP_ENV | een ConfigMap web-env met een leeg data-blok | Waarden worden bewust niet gekopieerd, omdat een waarde onder elke naam een secret kan zijn |
| healthcheck van de target group /healthz | readinessProbe httpGet op /healthz, poort 8080 | De bron stelt alleen het pad in, dus het concept schrijft de gedocumenteerde standaardwaarden van de target group (interval 30, drempels 3, time-out per protocol); de kubelet accepteert elke status van 200 tot 399 |
| deployment minimum 100% en maximum 200% (de standaardwaarden, niet ingesteld) | maxUnavailable 0, maxSurge 3 | StackToIT leidt beide af uit drie replicas met de afrondingsregels van ECS |
| awslogs-logdriver | niet overgenomen | De container schrijft naar stdout; u kiest waarheen het cluster de logs stuurt, bijvoorbeeld STACKIT Logs |
| launch_type FARGATE, awsvpc-netwerkmodus | niet overgenomen | Pods draaien op het netwerk van de nodepool; er is geen netwerkinterface per task en geen security group per task |
Het cluster en de load balancer
Fargate heeft geen nodes, dus de omvang van de nodepool is een variabele die u instelt aan de hand van de taskgroottes die het rapport optelt (1,5 vCPU en 3 GiB op de ondergrens en op de bovengrens voor deze service). De load balancer bereikt de pods via een NodePort Service op poort 30000, met de nodeadressen als pooldoelen.
resource "stackit_ske_cluster" "shop" {
project_id = var.project_id
name = "shop"
node_pools = [{
name = "workloads"
machine_type = var.shop_machine_type
minimum = var.shop_nodes_min
maximum = var.shop_nodes_max
availability_zones = var.availability_zones
}]
} target_pools = [{
name = "web"
target_port = 30000
targets = [for ip in var.web_target_ips : { ip = ip }]
active_health_check = {
healthy_threshold = var.web_health_healthy_threshold
interval = var.web_health_interval
interval_jitter = var.alb_interval_jitter
timeout = var.web_health_timeout
unhealthy_threshold = var.web_health_unhealthy_threshold
http_health_checks = {
ok_status = var.web_health_ok_status
path = "/healthz"
}
}
}]apiVersion: v1
kind: Service
metadata:
name: web-nodeport
labels:
app.kubernetes.io/name: web
spec:
type: NodePort
selector:
app.kubernetes.io/name: web
ports:
- name: p8080-tcp
port: 8080
targetPort: 8080
protocol: TCP
nodePort: 30000
Beslis hoe het verkeer de pods bereikt
| Optie uit het plan | Wat het betekent | Wat het u kost |
|---|---|---|
| NodePort achter de opgestelde load balancer (het concept) | Een NodePort Service en een doelpool van de node-IP's | U houdt de nodeadressen actueel naarmate de pool schaalt; de load balancer en de nodes moeten een netwerk delen |
| Een Ingress-controller achter de load balancer | Een controller zoals ingress-nginx routeert met Ingress-regels naar ClusterIP Services | U installeert en beheert de controller; het concept schrijft noch de controller noch de Ingress-regels |
| De SKE ALB Ingress-extensie | Wordt op het cluster ingeschakeld via de SKE API; het aanmaken van een IngressClass richt een managed Application Load Balancer in en Ingress-objecten op die klasse bepalen de routes | Per november 2026 biedt STACKIT dit alleen op aanvraag via STACKIT Support, als opt-in-functie die zonder aankondiging kan wijzigen en die STACKIT niet aanbeveelt voor productiegebruik; het opgestelde load balancer-blok wordt niet toegepast |
De checklist die de workload gesloten houdt
applications/web.json meldt de workload als niet gereed en noemt drie blokkerende punten (omgevingswaarde, secret, smoketest). De workload geldt pas als gereed wanneer uw team ze in het beslissingenbestand als afgerond markeert; StackToIT rolt niets uit en voert geen test uit.
"readiness": "NOT_READY",
"readiness_words": "Checklist items are open: StackToIT lists the work and counts an item done only when the customer marks it in the decisions file (application_checklists); StackToIT never deploys the application.",Wat u wijzigt voordat u het toepast
Het concept is een startpunt. Dit zijn de aanpassingen en antwoorden waar de demo-run om vraagt.
Geef het cluster een omvang
Stel het machinetype en het minimum en maximum aantal nodes in. Het maximum moet minimaal gelijk zijn aan het aantal zones; standaard worden drie zones geselecteerd.
Plaats de load balancer
De load balancer in de bron beslaat twee subnets die op STACKIT afzonderlijke netwerken zijn. De doelen zijn de clusternodes, dus het concept plaatst de load balancer in het netwerk dat SKE voor het cluster aanmaakt. De provider exporteert dat netwerk en de nodeadressen niet. Pas dus eerst het cluster toe en stel daarna de netwerk-id en de node-IP's in.
Upload het certificaat
De HTTPS-listener noemt een certificaat-ARN. De ARN wordt niet omgezet: upload het certificaat naar STACKIT en geef de id ervan mee in de listenervariabele.
Beperk wie verbinding mag maken
De bron laat elk IPv4-adres toe op poort 443 en de opgestelde load balancer doet hetzelfde. Beslis of u een toegestaan bronbereik schrijft.
Schrijf het netwerkbeleid
De security group van de tasks wordt niet naar pods vertaald. Het plan noemt als opties het schrijven van een NetworkPolicy, een security group op de nodes of geen segmentatie accepteren.
Vul de ConfigMap en de Secret
Voeg APP_ENV toe aan de ConfigMap, maak web-secrets aan met DATABASE_URL en controleer of de nodes de image registry kunnen bereiken.
Vragen van teams
Kan ik Fargate-achtige taskgroottes op SKE blijven gebruiken?
Fargate bestaat niet op STACKIT. De pods gebruiken de nodepool, dus de taskgroottes worden requests en limits van de container en de nodepool wordt gedimensioneerd op hun som plus systeempods en de extra capaciteit tijdens een rolling update.
Past StackToIT de manifests toe op mijn cluster?
Nee. StackToIT schrijft de manifests, de Terraform en het uitvoeringsplan. Uw team past ze toe met de kubeconfig van het cluster nadat de beslissingen zijn beantwoord.
Wat gebeurt er met de task role van mijn applicatie?
De demo heeft alleen een execution role. Het concept maakt er een STACKIT-serviceaccount zonder rechten van, omdat de run geen STACKIT-tegenhanger vindt voor de rol van de platformagent die images ophaalt en secrets injecteert. Noch die rol, noch een task role bereikt de pods: er is geen ServiceAccount en geen workload identity opgesteld. U beslist dus hoe images worden opgehaald en hoe de applicatie zich authenticeert.
Hoe voer ik na de cutover een rollback uit?
De kop van het manifest beschrijft het: de ECS-service blijft draaien, dus u stuurt het verkeer er weer naartoe. De pods kunnen toegepast blijven en ECS wordt pas afgeschaald en verwijderd nadat de pods de belasting hebben gedragen gedurende de periode die u kiest.
Bronnen
Uw volgende stap: STACKIT.
Vertel ons over uw omgeving, dan laten wij zien wat StackToIT daarvoor oplevert: doelarchitectuur, Terraform-artefacten en een gestructureerd migratieplan.
Laat uw gegevens achter, onze specialisten nemen contact met u op.
Liever zelf een e-mail sturen? connect@stacktoit.com
Hartelijk dank.
Uw verzoek is bij ons binnengekomen. Onze specialisten nemen contact met u op.