EKS

EKS clusters, managed node groups, addons, Fargate profiles, and access entries.

API Group: aws.konfig.io/v1alpha1

EKSCluster # ✅ Working ⏱ async

Creates and manages an EKS control plane. Supports full VPC configuration, control plane logging, envelope encryption, access configuration, Kubernetes network config, and upgrade policy.

⏱ Async — EKS cluster creation takes 10–15 minutes. Controller polls every 30 seconds until the cluster reaches the ACTIVE state.

Spec

FieldTypeRequiredDescription
clusterNamestringUnique name for the EKS cluster. Immutable after creation.
versionstringKubernetes version (e.g. 1.30). Upgrades trigger an async update.
roleArnstringIAM role ARN for the cluster control plane. Exactly one of roleArn or roleRef.name required.
roleRef.namestringName of the IAMRole CR to use as the cluster role.
resourcesVpcConfig.subnetRefs[]SubnetRefSubnet CR names or IDs. At least two subnets in different AZs required.
resourcesVpcConfig.securityGroupRefs[]stringAdditional security group CR names for the cluster ENIs.
resourcesVpcConfig.endpointPublicAccessboolAllow public access to the Kubernetes API server. Default: true.
resourcesVpcConfig.endpointPrivateAccessboolAllow private (VPC-internal) access to the Kubernetes API server. Default: false.
resourcesVpcConfig.publicAccessCidrs[]stringCIDRs allowed to access the public API endpoint. Default: ["0.0.0.0/0"].
logging.enabledTypes[]stringControl plane log types to send to CloudWatch: api, audit, authenticator, controllerManager, scheduler.
encryptionConfig.providerKeyArnstringKMS key ARN for envelope encryption of Kubernetes secrets. Immutable.
encryptionConfig.resources[]stringResources to encrypt (typically ["secrets"]). Immutable.
accessConfig.authenticationModestringAPI, API_AND_CONFIG_MAP, or CONFIG_MAP. Required for EKSAccessEntry.
accessConfig.bootstrapClusterCreatorAdminPermissionsboolGrant the cluster creator cluster-admin permissions via an access entry. Default: true.
kubernetesNetworkConfig.serviceIpv4CidrstringCIDR for Kubernetes service IPs (e.g. 172.20.0.0/16). Immutable.
kubernetesNetworkConfig.ipFamilystringipv4 or ipv6. Immutable after creation.
upgradePolicy.supportTypestringSTANDARD or EXTENDED support. Extended support provides longer patch windows. Mutable.
bootstrapSelfManagedAddonsboolBootstrap self-managed addons (kube-proxy, CoreDNS, vpc-cni). Default: true. Immutable.
tagsmap[string]stringAWS tags applied to the cluster.

Status

FieldDescription
clusterArnThe ARN of the EKS cluster.
endpointThe Kubernetes API server endpoint URL.
versionThe current Kubernetes version.
statusCluster status: CREATING, ACTIVE, DELETING, FAILED, UPDATING.
certificateAuthorityBase64-encoded certificate authority data for kubeconfig.
oidcIssuerThe OIDC issuer URL for the cluster (use with IAMOIDCProvider for IRSA).
conditionsStandard Kubernetes conditions.
observedGenerationLast reconciled generation.
lastSyncTimeRFC3339 timestamp of last sync.

Example — Basic Cluster

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSCluster
metadata:
  name: prod-cluster
  namespace: platform
spec:
  clusterName: prod-cluster
  version: "1.30"
  roleArn: arn:aws:iam::123456789012:role/eks-cluster-role
  resourcesVpcConfig:
    subnetRefs:
      - prod-private-subnet-1a
      - prod-private-subnet-1b
      - prod-private-subnet-1c
    endpointPublicAccess: true
    endpointPrivateAccess: true
    publicAccessCidrs:
      - 203.0.113.0/24
  accessConfig:
    authenticationMode: API_AND_CONFIG_MAP
  tags:
    env: prod

Example — Full-Featured Cluster

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSCluster
metadata:
  name: prod-cluster
  namespace: platform
spec:
  clusterName: prod-cluster
  version: "1.30"
  roleArn: arn:aws:iam::123456789012:role/eks-cluster-role
  resourcesVpcConfig:
    subnetRefs:
      - prod-private-subnet-1a
      - prod-private-subnet-1b
    endpointPublicAccess: false
    endpointPrivateAccess: true
  logging:
    enabledTypes:
      - api
      - audit
      - authenticator
  encryptionConfig:
    providerKeyArn: arn:aws:kms:us-east-1:123456789012:key/mrk-abc123
    resources:
      - secrets
  accessConfig:
    authenticationMode: API
    bootstrapClusterCreatorAdminPermissions: true
  kubernetesNetworkConfig:
    serviceIpv4Cidr: 172.20.0.0/16
    ipFamily: ipv4
  upgradePolicy:
    supportType: EXTENDED
  tags:
    env: prod
    criticality: high

Notes

  • Either roleArn or roleRef.name is required. The role must have the AmazonEKSClusterPolicy managed policy attached.
  • kubernetesNetworkConfig.ipFamily and kubernetesNetworkConfig.serviceIpv4Cidr are immutable after creation.
  • upgradePolicy.supportType is mutable and can be changed without recreating the cluster.
  • The oidcIssuer in status is used to create an IAMOIDCProvider CR for IRSA (IAM Roles for Service Accounts).

Deletion

Prerequisite deletions required. Delete all EKSNodeGroup, EKSFargateProfile, and EKSAddon CRs before deleting the cluster. Cluster deletion takes 10–15 minutes.

EKSNodeGroup # ✅ Working ⏱ async

Creates and manages an EKS managed node group. Supports scaling configuration, instance types, AMI type, capacity type, taints, labels, launch templates, and node repair.

⏱ Async — node group creation and scaling takes 3–5 minutes. Controller polls every 20 seconds until the node group reaches the ACTIVE state.

Spec

FieldTypeRequiredDescription
clusterNamestringEKS cluster name. Mutually exclusive with clusterRef.name.
clusterRef.namestringName of the EKSCluster CR (alternative to clusterName).
nodegroupNamestringName of the node group. Immutable after creation.
nodeRoleArnstringIAM role ARN for EC2 instances. One of nodeRoleArn or nodeRoleRef.name required.
nodeRoleRef.namestringName of the IAMRole CR.
subnetRefs[]SubnetRefSubnet CR names or IDs. Place in private subnets for production.
scalingConfig.minSizeint32Minimum number of nodes.
scalingConfig.maxSizeint32Maximum number of nodes.
scalingConfig.desiredSizeint32Desired number of nodes. Managed by cluster autoscaler in autoscaled setups.
instanceTypes[]stringEC2 instance types (e.g. ["m5.xlarge", "m5a.xlarge"]). Immutable.
amiTypestringAMI type: AL2_x86_64, AL2_x86_64_GPU, AL2_ARM_64, AL2023_x86_64_STANDARD, etc. Immutable.
capacityTypestringON_DEMAND or SPOT. Immutable. Default: ON_DEMAND.
diskSizeint32Root EBS disk size in GiB. Immutable when using a launch template.
labelsmap[string]stringKubernetes labels to apply to nodes.
taints[]TaintKubernetes taints to apply to nodes.
taints[].keystringTaint key.
taints[].valuestringTaint value.
taints[].effectstringNO_SCHEDULE, NO_EXECUTE, or PREFER_NO_SCHEDULE.
updateConfig.maxUnavailableint32Maximum number of unavailable nodes during updates.
updateConfig.maxUnavailablePercentageint32Maximum percentage of unavailable nodes during updates.
launchTemplate.namestringLaunch template name.
launchTemplate.idstringLaunch template ID (alternative to name).
launchTemplate.versionstringLaunch template version.
releaseVersionstringAMI release version (e.g. 1.30.0-20240514).
versionstringKubernetes version for the node group. Defaults to cluster version.
remoteAccess.ec2SshKeystringEC2 key pair name for SSH access.
remoteAccess.sourceSecurityGroupRefs[]stringSecurity groups allowed SSH access to nodes.
nodeRepairConfig.enabledboolEnable automatic node repair. Unhealthy nodes are automatically replaced.
tagsmap[string]stringAWS tags applied to the node group and EC2 instances.

Status

FieldDescription
nodegroupArnThe ARN of the node group.
statusCurrent status: CREATING, ACTIVE, UPDATING, DELETING, DEGRADED.
conditionsStandard Kubernetes conditions.
observedGenerationLast reconciled generation.
lastSyncTimeRFC3339 timestamp of last sync.

Example — Basic Worker Nodes

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSNodeGroup
metadata:
  name: prod-workers
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  nodegroupName: prod-workers
  nodeRoleArn: arn:aws:iam::123456789012:role/eks-node-role
  subnetRefs:
    - prod-private-subnet-1a
    - prod-private-subnet-1b
  scalingConfig:
    minSize: 2
    maxSize: 10
    desiredSize: 3
  instanceTypes:
    - m5.xlarge
  amiType: AL2023_x86_64_STANDARD
  capacityType: ON_DEMAND
  diskSize: 50
  tags:
    env: prod

Example — Full-Featured with Taints and Node Repair

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSNodeGroup
metadata:
  name: prod-gpu-workers
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  nodegroupName: prod-gpu-workers
  nodeRoleArn: arn:aws:iam::123456789012:role/eks-node-role
  subnetRefs:
    - prod-private-subnet-1a
  scalingConfig:
    minSize: 0
    maxSize: 5
    desiredSize: 1
  instanceTypes:
    - g4dn.xlarge
    - g4dn.2xlarge
  amiType: AL2_x86_64_GPU
  capacityType: ON_DEMAND
  labels:
    workload-type: gpu
    env: prod
  taints:
    - key: nvidia.com/gpu
      value: present
      effect: NO_SCHEDULE
  updateConfig:
    maxUnavailable: 1
  nodeRepairConfig:
    enabled: true
  tags:
    env: prod
    workload: gpu

Deletion

Async (3–5 minutes). EKS drains pods from nodes (respecting PodDisruptionBudgets), terminates the EC2 instances, and deletes the node group. The CR remains until AWS confirms full deletion.

EKSAddon # ✅ Working

Creates and manages an EKS cluster addon (e.g. vpc-cni, kube-proxy, coredns, ebs-csi-driver, eks-pod-identity-agent). Can adopt pre-existing addons.

Spec

FieldTypeRequiredDescription
clusterNamestringEKS cluster name. Mutually exclusive with clusterRef.name.
clusterRef.namestringName of the EKSCluster CR. One of these is required.
addonNamestringAddon name (e.g. vpc-cni, coredns, kube-proxy, aws-ebs-csi-driver, eks-pod-identity-agent).
addonVersionstringAddon version. If omitted, defaults to the latest recommended version.
serviceAccountRoleArnstringIAM role ARN for the addon's service account (IRSA). Mutually exclusive with serviceAccountRoleRef.name.
serviceAccountRoleRef.namestringName of the IAMRole CR for the addon's service account.
resolveConflictsstringConflict resolution on install: OVERWRITE, NONE, or PRESERVE. Default: OVERWRITE.
configurationValuesstringJSON configuration override for the addon (addon-specific settings).
tagsmap[string]stringAWS tags applied to the addon.

Status

FieldDescription
addonArnThe ARN of the addon.
addonVersionThe installed addon version.
statusAddon status: CREATING, ACTIVE, DEGRADED, UPDATING.
conditionsStandard Kubernetes conditions.
observedGenerationLast reconciled generation.
lastSyncTimeRFC3339 timestamp of last sync.

Example — vpc-cni Addon

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSAddon
metadata:
  name: prod-vpc-cni
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  addonName: vpc-cni
  resolveConflicts: OVERWRITE
  tags:
    env: prod

Example — ebs-csi-driver with IRSA

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSAddon
metadata:
  name: prod-ebs-csi-driver
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  addonName: aws-ebs-csi-driver
  addonVersion: v1.26.0-eksbuild.1
  serviceAccountRoleRef:
    name: ebs-csi-controller-role
  resolveConflicts: OVERWRITE
  tags:
    env: prod

Deletion

Immediate. The addon is removed from the cluster. The addon's Kubernetes resources (DaemonSets, Deployments) are deleted.

EKSFargateProfile # ✅ Working ⏱ async

Creates a Fargate profile defining which pods run on AWS Fargate rather than EC2 nodes. Pod selection is based on namespace and optional label selectors.

⏱ Async — Fargate profile creation and deletion takes approximately 2 minutes. Controller polls every 15 seconds.

Spec

FieldTypeRequiredDescription
clusterNamestringEKS cluster name. One of clusterName or clusterRef.name required.
clusterRef.namestringName of the EKSCluster CR.
fargateProfileNamestringName of the Fargate profile. Immutable after creation.
podExecutionRoleArnstringIAM role ARN for Fargate pod execution. One of this or podExecutionRoleRef.name required.
podExecutionRoleRef.namestringName of the IAMRole CR for pod execution.
subnetRefs[]SubnetRefPrivate subnet CR names or IDs. Fargate pods require private subnets.
selectors[]SelectorPod selection criteria. At least one selector required.
selectors[].namespacestringKubernetes namespace to match.
selectors[].labelsmap[string]stringOptional label selectors. All labels must match.
tagsmap[string]stringAWS tags applied to the Fargate profile.

Status

FieldDescription
fargateProfileArnThe ARN of the Fargate profile.
statusCurrent status: CREATING, ACTIVE, DELETING, CREATE_FAILED.
conditionsStandard Kubernetes conditions.
observedGenerationLast reconciled generation.
lastSyncTimeRFC3339 timestamp of last sync.

Example

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSFargateProfile
metadata:
  name: prod-fargate-profile
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  fargateProfileName: prod-serverless
  podExecutionRoleArn: arn:aws:iam::123456789012:role/eks-fargate-pod-execution-role
  subnetRefs:
    - prod-private-subnet-1a
    - prod-private-subnet-1b
  selectors:
    - namespace: serverless-workloads
    - namespace: kube-system
      labels:
        k8s-app: kube-dns
  tags:
    env: prod

Notes

  • Fargate pods must run in private subnets. Public subnet placement is not supported.
  • Selectors and subnets are mostly immutable after creation. To change them, delete and recreate the profile.
  • The pod execution role must have the AmazonEKSFargatePodExecutionRolePolicy managed policy attached.

Deletion

Async (~2 minutes). Running pods matched by this profile are terminated. The profile is fully deleted after AWS confirms deletion.

EKSAccessEntry # ✅ Working

Maps an IAM principal (role or user) to Kubernetes RBAC groups or EKS access policies. Requires the cluster to use API or API_AND_CONFIG_MAP authentication mode.

Spec

FieldTypeRequiredDescription
clusterNamestringEKS cluster name. One of clusterName or clusterRef.name required.
clusterRef.namestringName of the EKSCluster CR.
principalArnstringIAM principal ARN (role or user). One of principalArn or principalRef.name required.
principalRef.namestringName of the IAMRole CR.
typestringEntry type: STANDARD, FARGATE_LINUX, EC2_LINUX, or EC2_WINDOWS. Default: STANDARD.
kubernetesGroups[]stringKubernetes RBAC groups to add the principal to (e.g. ["system:masters"]).
usernamestringKubernetes username for the principal. Defaults to the IAM principal ARN.
accessPolicies[]AccessPolicyEKS access policies to associate with this entry.
accessPolicies[].policyArnstringARN of the EKS access policy.
accessPolicies[].accessScope.typestringcluster for cluster-wide access, namespace for namespace-scoped access.
accessPolicies[].accessScope.namespaces[]stringNamespaces to scope access to (when type is namespace).
tagsmap[string]stringAWS tags applied to the access entry.

Common Access Policy ARNs

PolicyARNDescription
AmazonEKSClusterAdminPolicyarn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicyFull cluster-admin access.
AmazonEKSAdminPolicyarn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicyAdmin access, cluster-scoped.
AmazonEKSEditPolicyarn:aws:eks::aws:cluster-access-policy/AmazonEKSEditPolicyEdit access to workload resources.
AmazonEKSViewPolicyarn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicyRead-only view access.

Status

FieldDescription
accessEntryArnThe ARN of the access entry.
conditionsStandard Kubernetes conditions.
observedGenerationLast reconciled generation.
lastSyncTimeRFC3339 timestamp of last sync.

Example — Cluster Admin Access

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSAccessEntry
metadata:
  name: platform-team-admin
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  principalArn: arn:aws:iam::123456789012:role/platform-team-role
  type: STANDARD
  accessPolicies:
    - policyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy
      accessScope:
        type: cluster
  tags:
    team: platform

Example — Namespace-Scoped Edit for CI Role

yaml
apiVersion: aws.konfig.io/v1alpha1
kind: EKSAccessEntry
metadata:
  name: ci-deploy-access
  namespace: platform
spec:
  clusterRef:
    name: prod-cluster
  principalArn: arn:aws:iam::123456789012:role/ci-deploy-role
  type: STANDARD
  accessPolicies:
    - policyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSEditPolicy
      accessScope:
        type: namespace
        namespaces:
          - my-app
          - my-app-staging
  tags:
    purpose: ci-cd

Notes

  • The EKS cluster must be configured with accessConfig.authenticationMode: API or API_AND_CONFIG_MAP for access entries to work.
  • Access entries replace the need to manually manage the aws-auth ConfigMap for IAM principals.
  • For EC2 node role principals, use type: EC2_LINUX or EC2_WINDOWS instead of STANDARD.

Deletion

Immediate. The access entry and associated policy associations are deleted. The IAM principal loses access to the cluster.