Every EKS cluster runs core software just to function: a CNI plugin for pod networking, CoreDNS for service discovery, kube-proxy for routing. Historically you installed and upgraded these by applying YAML by hand and tracking versions yourself. EKS-managed add-ons hand that job to AWS, and you drive it from the EKS SDK.
This page covers discovering versions, installing, updating, and wiring an add-on to an IRSA role - the everyday add-on lifecycle in both SDKs.
Before installing, ask which versions are compatible with your cluster's Kubernetes version. DescribeAddonVersions answers that, so you never guess a version string.
# --- Python (boto3) ---import boto3eks = boto3.client("eks", region_name="us-east-1")resp = eks.describe_addon_versions( addonName="vpc-cni", kubernetesVersion="1.30",)for addon in resp["addons"]: for v in addon["addonVersions"]: print(v["addonVersion"]) # e.g. v1.18.1-eksbuild.3
// --- TypeScript (AWS SDK v3) ---import { EKSClient, DescribeAddonVersionsCommand } from "@aws-sdk/client-eks";const eks = new EKSClient({ region: "us-east-1" });const resp = await eks.send(new DescribeAddonVersionsCommand({ addonName: "vpc-cni", kubernetesVersion: "1.30",}));for (const addon of resp.addons ?? []) { for (const v of addon.addonVersions ?? []) { console.log(v.addonVersion); // e.g. v1.18.1-eksbuild.3 }}
The add-on names are stable strings: vpc-cni, coredns, kube-proxy, and aws-ebs-csi-driver, among others. Each version entry also reports the Kubernetes versions it supports and whether it is the default, so you can pick the newest compatible build deliberately.
With a version chosen, CreateAddon installs it. EKS deploys the add-on's manifests into the cluster and takes over managing them. For an add-on that calls AWS APIs - like the VPC CNI or EBS CSI driver - pass a serviceAccountRoleArn so it uses an IRSA role rather than the node role.
The add-on starts in CREATING and becomes ACTIVE, so wait on addon_active before depending on it. resolveConflicts: "OVERWRITE" tells EKS to take ownership even if a self-managed version of the add-on already exists in the cluster - which is exactly what you want when adopting an add-on that was previously applied by hand.
UpdateAddon changes the version or configuration of an existing add-on. The resolveConflicts field is the important nuance: it decides what happens to fields you (or another tool) modified directly on the add-on's Kubernetes objects.
NONE - fail the update if it would overwrite a field you changed. Safest for detecting drift.
OVERWRITE - replace your changes with the add-on's managed defaults. Use when EKS should be the source of truth.
PRESERVE - keep your field-level changes and apply the rest. Use when you intentionally customized the add-on.
Add-ons accept a JSON configurationValues blob that maps to the underlying chart's settings - replica counts, resource requests, CNI environment variables, and so on. Since this is add-on-specific JSON, it goes as a plain string; here is the shape of a CoreDNS tuning payload:
You pass that as configurationValues on CreateAddon or UpdateAddon. Validate the accepted keys per add-on with DescribeAddonConfiguration, which returns the JSON schema the add-on supports so you do not send a field it will reject.
ListAddons shows which add-ons EKS manages on a cluster, and DescribeAddon gives the status, version, and health of one. DeleteAddon stops EKS from managing an add-on. By default that removes the add-on's workloads too; pass preserve: true if you want the Kubernetes objects to stay but be self-managed again - handy when moving management to another tool without disrupting running pods.
Guessing a version string. Add-on versions like v1.18.1-eksbuild.3 are specific and Kubernetes-version-gated. Always call DescribeAddonVersions first.
Missing IRSA role for AWS-calling add-ons. The VPC CNI and EBS CSI driver need AWS permissions. Without serviceAccountRoleArn they fall back to the node role, which is broader than it should be.
Wrong resolveConflicts choice.OVERWRITE silently wipes intentional customizations; NONE blocks a needed upgrade. Pick PRESERVE when you have deliberately tuned an add-on.
Deleting an add-on and its pods by accident.DeleteAddon removes workloads by default. Use preserve: true if you only want to stop managing it, not remove it.
Not waiting for ACTIVE. An add-on install is asynchronous; depending on it before addon_active returns can race against a not-yet-ready DaemonSet.
Editing a managed add-on by hand. Direct kubectl edits fight EKS management and get reverted on the next update unless you use PRESERVE. Prefer configurationValues.
Self-managed add-ons (applying the upstream manifests or Helm charts yourself) when you need a version or configuration EKS does not offer as a managed add-on.
Helm for community or third-party components that are not available as EKS-managed add-ons at all.
GitOps (Argo CD, Flux) to declare add-on versions and config in Git and reconcile them, layered over or instead of managed add-ons.
IaC (eksctl, Terraform, CDK) to declare managed add-ons and their IRSA roles as versioned infrastructure, with the SDK for runtime updates.
Use EKS-managed add-ons for the core AWS-owned components; reach for Helm or GitOps when you need software or knobs the managed add-on catalog does not expose.
Core cluster software (VPC CNI, CoreDNS, kube-proxy, EBS CSI driver, and more) that EKS installs and upgrades for you through the SDK, instead of you applying and tracking manifests by hand.
How do I find a valid add-on version?
Call DescribeAddonVersions with the add-on name and your cluster's Kubernetes version. It returns the compatible version strings and marks the default.
How do I install an add-on?
Call CreateAddon with the cluster name, add-on name, and a version from DescribeAddonVersions. Wait on the addon_active waiter before depending on it.
What does serviceAccountRoleArn do?
It attaches an IRSA role to the add-on's service account so an AWS-calling add-on (VPC CNI, EBS CSI driver) uses scoped permissions instead of the broader node role.
What does resolveConflicts control?
How EKS treats fields you changed directly. NONE fails on conflict, OVERWRITE replaces your changes with defaults, and PRESERVE keeps your changes while applying the rest.
How do I upgrade an add-on?
Call UpdateAddon with a newer addonVersion and an appropriate resolveConflicts. Choose the version from DescribeAddonVersions for your Kubernetes version.
How do I customize an add-on's settings?
Pass a JSON configurationValues string on CreateAddon or UpdateAddon. Check the accepted keys first with DescribeAddonConfiguration, which returns the add-on's config schema.
What happens when I delete an add-on?
DeleteAddon stops EKS from managing it and, by default, removes its workloads. Pass preserve: true to keep the Kubernetes objects running as self-managed.
Can I edit a managed add-on with kubectl?
You can, but EKS may revert hand edits on the next update unless you use PRESERVE. Prefer configurationValues so your changes survive upgrades.
Which add-ons need an IRSA role?
The ones that call AWS APIs - notably the VPC CNI (assigns ENIs/IPs) and the EBS/EFS CSI drivers (manage volumes). CoreDNS and kube-proxy do not call AWS APIs and need no role.