[email protected]

How-to · Kubernetes

Kubernetes go-live checklist: 25 checks as a self-test

Editorial note: Versions, commands and prices may change. Please verify critical steps independently before production use. This guide does not replace individual professional, legal or tax advice.

Have the cluster reviewed externally before go-live? The cluster audit checks configuration, versions, access, network policies and backups of your cluster and delivers a report with prioritized measures. From €1,490 net one-time, credited against the first month of operations, no penetration test (as of October 2026). View the cluster audit

A cluster that accepts deployments is not yet production ready. This checklist is a self-test with 25 checks in six areas. Each item has a pass criterion that can be measured or demonstrated, and a rating: green, yellow or red. All red items are closed before go-live. As of October 2026. It is not a penetration test.

Contents

How the scoring works

Each item gets a color:

  • Green: The criterion is met and documented with evidence (command output, log or report with a date).
  • Yellow: The criterion is partly met, for example in one namespace instead of all, or met but not documented.
  • Red: The criterion is not met or unknown. Unknown counts as not met.
Result Decision
At least one red item No go-live. Close the red items and repeat the check of the affected items.
No red items, some yellow items Go-live possible. Each yellow item gets an owner and a date in the action plan.
All items green Go-live. File the log with date, reviewer and evidence.

A second person confirms the colors. Whoever decided the architecture reviews it with the same assumptions. The check is repeated before every minor upgrade and after major changes to access, network or storage.

The 25 checks

A Availability

No. Check Pass if
A1 Redundant control plane At least 3 control plane nodes (etcd runs with an odd number of members, the documentation recommends five for production). With one node switched off, /readyz of the API server answers with HTTP 200 (health endpoints). Managed: the provider's availability commitment is on file.
A2 Capacity for a node failure After kubectl drain of the most heavily loaded node, all pods are Ready again and no pod stays Pending (drain).
A3 Replicas and distribution Every production application, including the ingress controller, runs with at least 2 replicas on different nodes (topology spread) and has a PodDisruptionBudget. Single-instance exceptions are documented.
A4 Health checks 0 containers in production namespaces without a readinessProbe. Slow-starting applications have a startupProbe (probes, BSI APP.4.4 A11).

B Resources and scaling

No. Check Pass if
B1 Requests and limits 0 containers without CPU and memory requests and without a memory limit. The memory limit is not above the request, otherwise OOM problems can hit the whole node (Security Checklist, SYS.1.6.A15).
B2 Quota and LimitRange Every production namespace has a ResourceQuota and a LimitRange.
B3 Scaling and headroom Load-dependent services have a HorizontalPodAutoscaler with a metrics source, and no target shows <unknown>. The sum of requests stays below 70 % of allocatable capacity in normal operation.
B4 Load test The expected peak load times 1.5 runs without OOMKilled, without Pending pods and with p95 latency within target. The log carries a date.

C Operations, monitoring and alerting

No. Check Pass if
C1 Complete metrics The number of nodes in monitoring equals the number in the cluster. API server, etcd, kubelet and all production namespaces are included.
C2 Alerts with a recipient Alert rules exist for node NotReady, CrashLoopBackOff, full volumes, expiring certificates, API server error rate and failed backups. Each alert was triggered as a test and reached the named recipient.
C3 Logs outside the cluster The log line of a deleted pod is still retrievable (SYS.1.6.A7 requires container logs outside the container). The retention period is defined.
C4 Certificates All certificates are recorded and expire in 30 days at the earliest. Renewal is automated or alerted. Certificates generated by kubeadm are valid for one year by default, the CA certificates for ten years.

D Backup and restore

No. Check Pass if
D1 Scope For every item in APP.4.4 A5 there is a backup job or a justified exception: persistent volumes, control plane configuration, cluster state, etcd, infrastructure applications, registry data.
D2 Target and separation The backup target is outside the cluster, with its own credentials. Retention and encryption of the backups are defined.
D3 Database restore The largest database was restored into an empty environment. Measured duration and data state are within the agreed targets (RTO, RPO). The log is at most 90 days old.
D4 Rebuild From an empty cluster, backup and Git, all production applications run again. The measured duration is below the agreed target.

E Security

No. Check Pass if
E1 Access Sign-in through an identity provider. Every cluster-admin binding is justified and no account belongs to system:masters. The dated RBAC export is on file.
E2 Pod Security kubectl get namespaces --selector='!pod-security.kubernetes.io/enforce' returns no namespaces. Application namespaces are set to restricted, exceptions at baseline are justified.
E3 Network 0 production namespaces without a NetworkPolicy, default-deny for ingress active. The API server is not reachable from outside, tested from a foreign network.
E4 Secrets Encryption in etcd active (test: the value stored in etcd starts with k8s:enc:). No credentials in Git or images.
E5 Version and images End of support of the version lies at least 6 months after go-live, or an upgrade date is set. The image scan shows no open critical findings without a documented exception.

The criteria for E1 to E5 appear with commands and standard references in the hardening checklist.

F Processes and handover

No. Check Pass if
F1 Runbooks Runbooks exist for node failure, CrashLoop, full volume, expired certificate and restore. A person who did not build the cluster solves "node failure" with them in a test.
F2 Upgrade rehearsed A minor upgrade ran on a staging cluster with the same topology. Duration and rollback path are logged, the maintenance window is agreed (SYS.1.6.A2 requires updates in the lifecycle planning).
F3 Staffing and reachability At least 2 named people can perform restore and upgrade. Escalation path and response time are in writing. A test alert outside office hours is handled within the agreed time.
F4 Changes from Git The desired state is versioned in Git (APP.4.4 A8). In a test, an application in staging can be deleted and redeployed from Git.

Order of the checks

Start with the items that need a test with lead time: A1, A2, B4, D3, D4 and F2 (failure tests, load test, restore, rebuild, upgrade in staging). They decide whether the date holds. Next come the items that can be checked by command or configuration comparison: A3, A4, B1 to B3, C1, C4, D1, D2 and E1 to E5. Last come C2, C3, F1, F3 and F4. Alerts, runbooks and staffing build on the results of the first group.

Check commands

# A1: API server reachable while a control plane node is off
kubectl get --raw='/readyz?verbose'
# A2: simulate a node failure (maintenance window or staging)
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl get pods -A --field-selector=status.phase=Pending
kubectl uncordon <node>
# A3: deployments with one replica, PodDisruptionBudgets
kubectl get deploy -A -o json | jq -r '.items[] | select(.spec.replicas==1) | .metadata.namespace + "/" + .metadata.name'
kubectl get pdb -A
# A4: containers without a readinessProbe
kubectl get pods -A -o json | jq -r '.items[] | .metadata.namespace as $ns | .metadata.name as $p | .spec.containers[] | select(.readinessProbe == null) | "\($ns)/\($p)/\(.name)"'
# B1: containers without requests or memory limit
kubectl get pods -A -o json | jq -r '.items[] | .metadata.namespace as $ns | .metadata.name as $p | .spec.containers[] | select(.resources.limits.memory == null or .resources.requests.memory == null or .resources.requests.cpu == null) | "\($ns)/\($p)/\(.name)"'
# B2, B3: quotas, autoscalers, headroom (section "Allocated resources")
kubectl get resourcequota,limitrange,hpa -A
kubectl describe nodes
# B4: pods with OOMKilled
kubectl get pods -A -o json | jq -r '.items[] | select(.status.containerStatuses[]?.lastState.terminated.reason == "OOMKilled") | .metadata.namespace + "/" + .metadata.name'
# C1: compare the number of nodes with monitoring
kubectl get nodes --no-headers | wc -l
# C4 (kubeadm only, on a control plane node), E5: certificates and version
kubeadm certs check-expiration
kubectl version

Which Kubernetes version for go-live

The end of support is listed on kubernetes.io/releases. For a go-live on 28.10.2026 this gives:

Version End of support Months until end of support Rule E5 (at least 6 months)
1.37 28.10.2027 12 met
1.36 28.06.2027 8 met
1.35 28.02.2027 4 not met, upgrade date needed
1.34 27.10.2026 ended not met

When the self-test is not enough

The self-test checks what your own team can measure. It does not check whether the criteria fit the application, and it does not produce an independent report. For customer questionnaires, evidence for auditors or a second opinion before go-live, an external configuration review is the right tool. It compares the cluster with the CIS Kubernetes Benchmark and APP.4.4 and is not a penetration test.

Our approach at WZ-IT

The cluster audit checks versions and upgrade path, RBAC and service accounts, secrets, network policies, and backup and restore path, and compares the cluster with CIS and APP.4.4. The result is a report with findings by priority. We make no changes to the cluster during the audit. The cluster audit costs from €1,490 net one-time and is credited against the first month of operations.

Managed Kubernetes from €590 net per cluster per month including three worker nodes takes over operations after go-live, with monitoring, upgrades, backups with restore test and hardening. Monitoring runs 24/7, the response to P1 incidents follows the service level. The levels are on the SLA page. Open items on upgrades, certificates or etcd we also handle without a contract through Kubernetes support, €120 net per hour, without a guaranteed response time. Prices net, as of October 2026.

Status and methodology

  • Status: 28.10.2026. The end-of-support dates come from kubernetes.io/releases, retrieved on 28.10.2026. The months until end of support are counted from that date.
  • Sources of the criteria: Kubernetes documentation (production environment, probes, PodDisruptionBudget, resource management, Security Checklist) and the BSI modules APP.4.4 and SYS.1.6, 2023 edition. The modules name requirements such as backup of the cluster (APP.4.4 A5), health checks (A11) and resource limits (SYS.1.6.A15), but no numeric values for these items.
  • Planning values: 70 % request utilization, factor 1.5 for the load test, 30 days for certificates, 6 months until end of support and 90 days for the restore evidence are our assumptions. Adjust them to criticality. The rhythm of at most 90 days follows the quarterly restore test from Kubernetes backup.
  • Selection: The 25 items are our own selection. They cover the areas where clusters typically have gaps at go-live and in takeovers, see the takeover checklist.
  • Scope: Self-test and configuration review. Not a penetration test.

Further guides

Secure the go-live with an external review? The cluster audit delivers the report, managed Kubernetes takes over operations afterwards. Cluster audit · Managed Kubernetes

Further reading: Kubernetes operations concept per APP.4.4

Rather have it operated?

You'd rather not run Kubernetes yourself? WZ-IT handles setup, operations and maintenance - privacy-focused from Germany.

Enquiry

Design, take over, or operate Kubernetes

We design and operate Kubernetes on bare metal, Proxmox, and European cloud platforms, including networking, GitOps, observability, and backups.

  • Straight with Timo and Robin - no sales team, no pitch
  • A professional assessment of your situation
  • Concrete next steps for infrastructure, software or AI

The conversation is free and non-binding.

WZ-IT supported us professionally with the provisioning and setup of NetBird. Alongside the technical implementation, we also received well-founded advice on connecting our Kubernetes clusters. The recommendations were concrete and directly actionable. The collaboration was consistently reliable, fast and on equal terms. We can recommend WZ-IT without reservation.
Kai ClaußHead of Development, SweetConnect GmbH
Timo and Robin, founders of WZ-IT

Design, take over, or operate Kubernetes

WZ-IT supported us professionally with the provisioning and setup of NetBird. Alongside the technical implementation, we also received well-founded advice on connecting our Kubernetes clusters. The recommendations were concrete and directly actionable. The collaboration was consistently reliable, fast and on equal terms. We can recommend WZ-IT without reservation.
Kai ClaußHead of Development, SweetConnect GmbH

Frequently Asked Questions

Answers to the most important questions

Knowledge

More on Kubernetes

Companies worldwide trust WZ-IT

  • Stadtwerke Brühl
  • DGHO e.V.
  • solarwerkstatt berlin
  • Krüger Dirndl
  • ABCO Water Systems
  • Golem.de
  • EVADXB
  • nextGYM
  • AInergy
  • ml&s
  • Odiseo Solutions
  • Annota
  • ARGE
  • SweetConnect GmbH
  • Aphy AG
  • CORGOS
  • Rekorder
  • SolidProof
  • Yonju
  • Keymate
  • Paritel
  • Mr. Clipart
  • Millenium
  • Negosh
  • Führerscheinmacher
  • BTI
  • Deutsche Gesellschaft für Datenschutz
Read client reviews