Cloud

Terraform vs Kubernetes: You Need Both, in Sequence

Terraform and Kubernetes are not competitors. Terraform provisions the cluster; Kubernetes runs the workloads inside it. With Terraform 1.16.5 and Kubernetes 1.37.1 current, here is exactly where the boundary sits in 2026 — and where the Terraform Kubernetes provider stops working.

Kubernetes project logo and wordmark from the CNCF brand artwork repository
Image: CNCF Artwork

TL;DR

  • Terraform provisions infrastructure (clusters, VPCs, IAM, databases). Kubernetes schedules containers on infrastructure that already exists. They are not competitors.
  • Current releases: Terraform 1.16.5 (2 October 2026) and Kubernetes 1.37.1 (23 September 2026). Terraform 1.16.0 and Kubernetes 1.37.0 shipped on the same day, 26 August 2026.
  • The standard 2026 stack is both, in sequence: Terraform for day-0 cloud provisioning, Kubernetes plus GitOps (Argo CD or Flux) for in-cluster workloads.
  • Proof the "vs" framing is wrong: the Terraform Kubernetes provider — the official integration between the two — ranks on page one for this query, and has been downloaded over 1.7 billion times.

What is the difference between Terraform and Kubernetes?

Terraform provisions infrastructure. Kubernetes runs containers on infrastructure that already exists. They are not alternatives, and you almost certainly need both: Terraform creates the cluster and the cloud resources around it, then Kubernetes schedules workloads inside it. The real question is not which one, but where you draw the line between them.

Terraform Kubernetes
Category Infrastructure as code / provisioning Container orchestration
Latest release 1.16.5, 2 Oct 2026 1.37.1, 23 Sep 2026
Owner IBM (HashiCorp) CNCF
Licence Business Source License 1.1 Apache 2.0
Runs As a CLI, on demand As a control loop, continuously
Model Plan → apply → store state Declare desired state → reconcile forever
Lifecycle Day 0 / day 1 Day 1 / day 2
Fails at Anything that drifts between applies Creating the machines it runs on

The deepest difference is in that second-to-last row. Terraform is episodic: it reads your config, diffs it against a state file, makes changes, and stops. Kubernetes is continuous: a controller watches desired state against actual state and corrects the gap forever, without you running anything.

That single distinction explains almost every integration problem between them.

Why most of page one gets this question wrong

Search terraform vs kubernetes and the results split three ways: cloud and DevOps vendors with a product to sell, forum threads where people are visibly confused, and documentation explaining how to use the two together.

Two of the top ten results are integration docs from the projects themselves. One is the HashiCorp Terraform Kubernetes provider on the registry. The other is the Kubernetes project's own blog post, "Working with Terraform and Kubernetes" — published 29 June 2020, now more than six years old.

When the two projects' own integration documentation outranks most of the comparison articles, the comparison is the wrong frame. This is the same shape as the Prometheus vs Grafana question, where the two tools are a stack, not a bake-off.

Four of the ten page-one results are vendors selling a tool in this space. Treat their framing accordingly.

Do I need Terraform if I use Kubernetes?

Yes, in almost every case — unless someone else already provisioned your cluster.

Kubernetes cannot create itself. Something has to make the EKS control plane, the VPC, the subnets, the node groups, the IAM roles, the load balancer, the managed database your app talks to. Terraform is the most common answer, and managed-cluster modules are still the default path: the community terraform-aws-modules/eks module is on v21.26.0 and has been downloaded over 185 million times.

You can skip Terraform if you are on a fully managed platform that hands you a kubeconfig, running k3s on a box you provisioned by hand, or using eksctl/gcloud and accepting no IaC. See k3s vs k8s if your cluster is small enough that this is a real option.

You cannot skip Kubernetes if you need container scheduling, self-healing, rolling updates and service discovery. Terraform does none of those things.

The Terraform Kubernetes provider: what it does, and where it breaks

Yes, Terraform can create Kubernetes objects. The Kubernetes provider is at v3.3.0 (1 October 2026), and the Helm provider is at v3.3.0 (2 September 2026). Both are official HashiCorp providers.

The provider is genuinely good for a narrow band of work: cluster-scoped bootstrap objects you need immediately after the cluster exists — namespaces, service accounts, IRSA bindings, storage classes, a CNI or ingress controller installed via the Helm provider.

It breaks on everything that behaves like an application.

The state model is the problem. Terraform wants a stable snapshot it can diff. Kubernetes mutates objects constantly — admission controllers inject fields, HPAs rewrite replica counts, operators add annotations. Terraform reads that as drift and tries to undo it.

HashiCorp documents the failure mode in its own provider docs. The guidance is blunt: the cluster and the provider's resources should be "managed with separate apply operations," because interpolating cluster credentials inside the same module produces "intermittent and unpredictable errors."

The kubernetes_manifest resource is more constrained still. Its documentation states it "requires API access during planning time," which means the cluster must already exist and be reachable before you plan. You cannot define a CRD and a custom resource of that CRD in the same apply.

HashiCorp's own recommendation is to reserve kubernetes_manifest for custom resources the provider does not yet cover natively.

Where the boundary sits in 2026

Draw the line at the cluster edge, with one deliberate exception.

Layer Tool Why
Cloud account, VPC, IAM, cluster, managed data stores Terraform Episodic, cloud API-shaped, needs state and plan review
Cluster bootstrap (CNI, ingress, cert-manager, CSI) Terraform + Helm provider Must exist before GitOps can run. Small, stable, rarely changes
Application workloads, config, scaling Kubernetes + Argo CD or Flux Continuously reconciled, changes hourly, owned by app teams
Cloud resources requested from the cluster Crossplane / Cluster API The blurred middle — Kubernetes controllers provisioning cloud infra

Crossplane and Cluster API are the genuinely contested zone. They invert the usual order: instead of Terraform creating Kubernetes, Kubernetes controllers create cloud infrastructure, using the same reconciliation loop that manages your Pods. That is attractive if you want one control plane and continuous drift correction. It is a bigger operational commitment than a Terraform module, and the ecosystem of providers is thinner than Terraform's.

If you are building a paved road for app teams, this boundary is the core design decision — see internal developer platforms for how teams are packaging it.

One ownership note that is easy to miss. Terraform is no longer an independent open-source project. IBM completed its acquisition of HashiCorp on 27 February 2025, at an enterprise value of $6.4 billion. Terraform has shipped under the Business Source License since August 2023, which is source-available, not OSI open source. OpenTofu is the MPL-licensed fork that exists because of that change. Kubernetes remains Apache 2.0 under the CNCF.

If licence terms matter to you, the two sides of this comparison are not equivalent — and the broader IaC field has shifted around it.

What this means for you

If you are a solo dev or small team: Use Terraform for the cluster and cloud resources, kubectl apply or Helm for your app. Skip GitOps until you have more than one environment. Do not manage Deployments in Terraform.

If you run a platform team: Split state hard. One Terraform root module per cluster for cloud infra, a second apply for bootstrap add-ons via the Helm provider, then hand everything above that to Argo CD or Flux. Different repos, different permissions, different review cadence.

If you are deciding whether to adopt Crossplane: Only if you want app teams self-serving cloud resources through the Kubernetes API, and you have the platform headcount to run it. Otherwise Terraform modules plus a service catalogue is less machinery for the same outcome.

If you inherited Terraform managing Deployments: Migrate those resources out. The drift fights will not improve, and they get worse as HPAs and operators enter the picture.

Frequently Asked Questions

Can Terraform and Kubernetes work together?

Yes — that is the normal setup, not an edge case. Terraform provisions the cluster and surrounding cloud resources, then hands off. HashiCorp ships official Kubernetes and Helm providers for in-cluster work, both at v3.3.0. HashiCorp's own docs recommend running cluster creation and in-cluster resources as separate apply operations.

Should I use Terraform or Helm to deploy to Kubernetes?

Helm, for application workloads. Terraform's Helm provider is a reasonable fit for cluster bootstrap add-ons installed once and rarely changed — ingress controllers, cert-manager, CSI drivers. For anything your team deploys weekly, use Helm through a GitOps controller like Argo CD or Flux, where rollback and reconciliation are first-class.

What are Kubernetes, Terraform and Ansible?

Three tools at three layers. Terraform provisions infrastructure declaratively and tracks it in state. Ansible configures operating systems and software on machines that already exist, procedurally. Kubernetes schedules and continuously reconciles containers across a cluster. Ansible has largely lost ground to immutable images and containers for the configuration layer.

Do I need Terraform with Kubernetes on a managed service like EKS?

Yes, for repeatability. EKS, AKS and GKE still require a VPC, subnets, IAM roles, node groups and security groups, and clicking those through a console is not reproducible. The terraform-aws-modules/eks module at v21.26.0 remains the default path, with over 185 million registry downloads.


Editor's note — sources: All version and date claims were verified against the GitHub releases API on 5 October 2026, not against documentation pages: Terraform v1.16.5 (published 2026-10-02) and v1.16.0 (2026-08-26); Kubernetes v1.37.0 (2026-08-26) and v1.37.1 (2026-09-23); Terraform Kubernetes provider v3.3.0 (2026-10-01); Helm provider v3.3.0 (2026-09-02); terraform-aws-modules/eks v21.26.0 (2026-09-23). Download counts are cumulative figures from the Terraform Registry API, read the same day: 1,710,789,707 for the Kubernetes provider and 185,094,584 for the EKS module. Provider limitations are quoted from the Kubernetes provider docs and the kubernetes_manifest reference. The Kubernetes project's 2020 Terraform post carries a published date of 29 June 2020. Acquisition terms are from IBM's newsroom.

Get Edgewisely in your inbox

Business stories that matter, free. Enter your email — no password, no account to set up.
jamie@example.com
Subscribe