Install Istio on EKS cluster using Terraform and Helm
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
Installing Istio on EKS with Terraform usually means two separate concerns: Terraform manages access to the EKS cluster and drives the Helm releases, while Istio itself is installed as a set of Helm charts. The key is to wire the Kubernetes and Helm providers to the EKS API correctly, then install the Istio charts in the right order.
Start With EKS Provider Configuration
Assume the EKS cluster already exists or is created elsewhere in Terraform. The Kubernetes and Helm providers need the cluster endpoint, certificate authority data, and a token.
A common Terraform pattern looks like this:
This keeps Helm and Kubernetes talking directly to the EKS control plane rather than relying on an external kubeconfig file.
Install Istio Charts in the Right Order
Current Istio Helm installs are split into separate components. The official Helm-based flow installs the base chart before istiod, and optionally installs gateways after that.
A Terraform version of that flow can look like this:
The depends_on chain matters because the base chart installs CRDs and cluster-scoped resources that istiod expects to find first.
Verify the Installation
After terraform apply, check the Helm releases and Kubernetes workloads:
If you plan to use sidecar injection, label a namespace and deploy a test workload:
Then deploy an app and confirm the proxy sidecar is injected.
Why Terraform Plus Helm Is a Good Fit
This approach works well because:
- Terraform manages cluster access and release dependencies
- Helm manages chart lifecycle and upgrade state
- Istio can still be customized with chart values instead of ad hoc
kubectlpatches
It also makes upgrades easier because the same Terraform resources can pin chart versions and set values consistently across environments.
Common Pitfalls
- Installing
istiodbefore the base chart and hitting missing-CRD or missing-resource errors. - Mixing
kubeconfig-based local Helm usage with Terraform-managed provider configuration and then debugging the wrong cluster context. - Forgetting to create the namespaces or to express release ordering with
depends_on. - Leaving chart versions unpinned in production and getting unexpected changes on later applies.
- Assuming Istio is "done" after install, without verifying injection, gateways, and workload readiness.
Summary
- Use Terraform to configure EKS access for both the Kubernetes and Helm providers.
- Install Istio with Helm charts in order: base first, then
istiod, then gateways as needed. - Express dependencies explicitly in Terraform so CRD installation happens before the control plane.
- Use Istio chart values to adapt the install for EKS and for your chosen profile.
- Verify the mesh after installation, because a successful apply is only the first step.

