# Install and set up Kubeflow for ML on EKS.

> Source: <https://dev.to/rdgmh/install-and-set-up-kubeflow-for-ml-on-eks-4cgm>
> Published: 2026-09-17 07:33:51+00:00

Kubeflow is like a dedicated playground for machine learning on Kubernetes. Imagine having a magic toolbox that not only helps you build and train your models but also handles all the nitty-gritty details of deploying and scaling them in a Kubernetes environment. It's like having a personal assistant that makes sure your machine learning workflows run smoothly, letting you focus on the fun part—experimenting and creating cutting-edge models.

You can install the AWS CLI from the official `[documentation](https://docs.aws.amazon.com/cli/)`

This command can also be used to install AWS CLI

```
sudo apt-get update && sudo apt-get install -y awscli
```

After the download, we need to configure it using the command

```
AWS configure
```

This step will prompt you to enter your AWS Access Key ID, AWS Secret Access Key, default region, and default output format (optional).

The raw `aws eks create-cluster` command shown above works, but only if you already have a VPC, subnets, and an EKS service role with the right trust policy set up beforehand — that's three extra prerequisites most people don't have lying around. The faster, more common path is `eksctl`, which creates the cluster, the VPC, the subnets, and a managed node group in one command:

```
eksctl create cluster \
  --name kubeflow-eks \
  --region us-east-1 \
  --nodegroup-name ml-nodes \
  --node-type m5.xlarge \
  --nodes 2 \
  --nodes-min 2 \
  --nodes-max 4 \
  --managed
```

`m5.xlarge` (4 vCPU, 16 GB RAM) is a reasonable floor for Kubeflow — its control-plane components (Istio, Dex, the Kubeflow dashboard, Notebook controller, Pipelines) are memory-hungry even before you run a single training job. This takes 15-20 minutes; `eksctl` is provisioning real VPC, subnet, and IAM resources underneath, not just the cluster.

Once it finishes, point `kubectl` at the new cluster:

```
aws eks update-kubeconfig --name kubeflow-eks --region us-east-1
kubectl get nodes
```

You should see your node group's instances in `Ready` state before moving on — Kubeflow's installer will fail in confusing ways if the nodes aren't ready yet.

Kubeflow doesn't ship as a single Helm chart — it's a collection of components (Istio, Dex, cert-manager, the Kubeflow Pipelines UI, Notebook controller, KServe, and more) glued together with Kustomize overlays in the official [kubeflow/manifests](https://github.com/kubeflow/manifests) repo. Clone it and check out a release tag that matches a Kubernetes version your EKS cluster actually supports:

```
git clone https://github.com/kubeflow/manifests.git
cd manifests
git checkout v1.9.0
```

Kubeflow's components have interdependencies that `kubectl apply -k` alone can't always resolve on the first pass — a CRD from one component might not exist yet when another component's manifest tries to reference it. The project's own documented workaround is to retry the apply in a loop until every resource is created:

```
while ! kustomize build example | kubectl apply --server-side --force-conflicts -f -; do
  echo "Retrying to apply resources"
  sleep 20
done
```

This can take several passes and several minutes — that's expected, not a sign something's broken, as long as the error messages are about missing CRDs rather than something else.

```
kubectl get pods -n kubeflow
```

Every pod should eventually reach `Running`. Then reach the dashboard by port-forwarding the Istio ingress gateway rather than exposing it publicly on a fresh cluster:

```
kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
```

Open `http://localhost:8080` — the default login is `user@example.com` / `12341234`, which you should treat as a placeholder to change immediately, not a real credential to leave in place, if this cluster is anything more than a throwaway lab.

The gap between the raw `aws eks create-cluster` command and a running Kubeflow dashboard is bigger than it looks from the AWS CLI reference page alone — a working node group, a Kustomize-based multi-component install with real interdependency ordering issues, and a default credential you have to remember to rotate. None of that is a knock on Kubeflow itself; it's a genuinely capable ML platform once it's up. It's just worth knowing the real shape of the setup before starting, rather than assuming one `aws eks create-cluster` call and a Helm install away.
