Skip to main content
Source

This page is generated from devops-agent/eks-upgrade-check/SKILL.md. Edit the source, not this page.

EKS Upgrade Readiness Skill

Overview

This skill assesses a live EKS cluster's readiness for a Kubernetes version upgrade. It connects to the cluster via AWS APIs, runs automated checks across 8 assessment areas, calculates a readiness score (0-100%), and produces a detailed report with prioritized remediation steps and pre-filled AWS CLI commands.

This skill is laser-focused on upgrade safety — answering the question: "Is it safe to upgrade this cluster to the next version?"

All operations are read-only — this skill does not modify your cluster.

What Gets Assessed

#SectionKey Checks
01Version ValidationUpgrade path validity, version skew policy, support status & cost
02Breaking ChangesVersion-specific API removals, behavioral changes, resource impact
03Deprecated API DetectionLive scan of cluster resources for deprecated/removed APIs
04Add-on CompatibilityCore add-on versions, OSS add-on matrix, Karpenter compatibility
05Node ReadinessNode version skew, AL2→AL2023 migration, AMI compatibility
06Workload RisksSingle replicas, missing PDBs, health probes, resource requests
07AWS Upgrade InsightsOfficial EKS pre-upgrade checks and recommendations
08Upgrade PlanPre-filled CLI commands, step-by-step upgrade sequence

Readiness Score

The skill calculates a weighted readiness score:

CategoryMax DeductionRationale
Breaking Changes25 ptsHighest risk — can break apps
Deprecated APIs20 ptsActionable, fixable pre-upgrade
Node Readiness (skew + subnet IPs)20 ptsCan block upgrade entirely
Unsupported Version15 ptsNo security patches, urgent upgrade needed
Add-on Compatibility15 ptsCritical > optional add-ons
Karpenter10 ptsOnly if installed
Workload Risks10 ptsBest-practice, not blockers
AWS Upgrade Insights10 ptsOfficial AWS checks
AL2 Nodes / Behavioral10 ptsInformational

Hard Blocker Override: If any hard blocker is detected (e.g., incompatible Karpenter, critical add-on DEGRADED, cluster subnets collectively cannot place control-plane ENIs, cluster not ACTIVE), the score is capped at ≤ 59% (NOT READY) regardless of other findings. See references/report-generation.md for the full list.

Score Interpretation:

ScoreLevelMeaning
90-100READYSafe to proceed
80-89GOODMinor issues, can proceed with caution
70-79FAIRSeveral issues need attention first
60-69RISKYSignificant issues, not recommended yet
0-59NOT READYCritical blockers, must resolve first

Assessment Workflow

Step 0: Pre-flight

Execution model — autonomous with hard stops. This skill runs autonomously and does NOT pause for interactive input. It proceeds only when the target cluster and version are unambiguous. If any gating criterion below is not met, it performs a HARD STOP: it does NOT guess, auto-select, or partially assess an ambiguous cluster/target — it emits a structured stop message and ends. Never assess a cluster or target the user did not unambiguously specify or that cannot be uniquely determined. (This gate is about an ambiguous cluster/target; denied reads during a valid assessment are handled via ## Unassessed, not a hard stop — see Action 3 below.)

HARD STOP output format — whenever a criterion below triggers a hard stop, output exactly this and end the run (produce no readiness score):

## Assessment Halted — <one-line reason>

**Criterion not met:** <which check failed>
**What was found:** <observed state>
**To proceed:** <the specific input needed, e.g., re-run naming the cluster + region + target>

Action 1 — Discover clusters

Use EKS ListClusters to discover available clusters, then apply this decision table.

Region caveat. EKS ListClusters is region-scoped and returns names only, not regions. A zero-cluster result means "none in this region," NOT "none in the account" — confirm the intended region before treating zero clusters as terminal. The "name + region" shown below pairs each returned name with the region actually queried, not a region returned by the API.

ConditionAction
User named a cluster in the requestConfirm it exists in the list, then proceed. If it does not exist → HARD STOP.
Exactly one cluster found, none namedProceed. State which cluster is being assessed.
More than one cluster found, none namedHARD STOP. List all clusters (name + region). Do NOT auto-select by first/newest/any heuristic.
Zero clusters foundHARD STOP. Report that no clusters were found in the queried region (state the region), and note that other regions were not checked.

Action 2 — Describe the selected cluster

Use EKS DescribeCluster and record: cluster name, Kubernetes version, platform version, region, status, account ID.

Account ID hygiene: the account ID is sensitive. If the generated report will be shared outside the account, mask or omit the account ID before sharing.

Action 2b — Validate cluster status

If status is NOT ACTIVEHARD STOP:

  • CREATING/UPDATING/DELETING — cluster is in transition; the EKS API will reject an upgrade.
  • FAILED — cluster must be recovered before an upgrade can be attempted.

Cluster status gates the whole assessment; node group status gates node readiness. If a node group's lifecycle status == UPDATING (mid-rotation), the assessment can still run but node readings may be a transient old/new mix — flag it as potentially unstable and recommend re-running after rotation (see references/node-readiness.md §5.1).

Action 3 — Validate permissions (AWS + Kubernetes)

3a — AWS API preflight. Verify access to: ListNodegroups, ListAddons, DescribeAddonVersions (add-on compatibility — references/addon-compatibility.md marks this a MUST-run read), ListInsights, and EC2 DescribeSubnets (node-readiness subnet-IP hard-blocker input). DescribeCluster / DescribeNodegroup / DescribeAddon / DescribeInsight are exercised implicitly by the assessment steps.

3b — Kubernetes RBAC preflight. The high-weight categories read Kubernetes objects, not just AWS APIs. Confirm cluster read access to: Deployments/DaemonSets/StatefulSets (workloads + deprecated-apis), Validating/MutatingWebhookConfigurations (breaking-changes), HorizontalPodAutoscalers (deprecated-apis), and nodepools.karpenter.sh (node-readiness + add-on compatibility) via a can-i-style list check. If kubectl auth can-i itself errors (not a clean yes/no), treat the read as denied.

If any required AWS permission or Kubernetes read is denied → this is NOT a hard stop (the hard stops in this Step 0 are for an ambiguous cluster/target only — see the execution-model note above). Instead, proceed as a partial assessment:

  1. Record exactly which IAM action or RBAC verb/resource is denied.
  2. Continue the assessment. Every category whose backing read was denied is reported UNKNOWN / not-scored (NOT a clean 0-deduction pass) and listed in ## Unassessed, per references/report-generation.md.
  3. The headline verdict carries the (partial — N category/categories unassessed) marker and is capped below READY — a partial assessment can NEVER yield an uncaveated READY.

The guarantee this preflight gives extends only to the reads it actually probes.

Action 4 — Determine target version

  • User specified a target version → use it. Validate the upgrade path per references/version-validation.md; if the path is invalid (downgrade, same version, or the target does not exist on EKS) → HARD STOP.
  • No target specified → default to the immediate next minor version (current + 1). This is deterministic (EKS upgrades one minor at a time), so it is a safe default, not a guess. State the assumed target explicitly in the report metadata.
  • User requested a multi-hop upgrade (target > current + 1) → HARD STOP. Show the required one-hop-at-a-time path (e.g., 1.30 → 1.31 → 1.32) and state that this run assesses only a single hop; re-run naming the immediate next version.

Action 5 — Proceed

If all criteria above pass, proceed through Steps 1-8 without further pauses.

Steps 1-8: Run Assessment

For each assessment area, read the corresponding reference file from references/ and execute the checks described.

Assessment AreaReference File
Version / upgrade pathreferences/version-validation.md
Breaking changes / API removalsreferences/breaking-changes.md
Deprecated APIsreferences/deprecated-apis.md
Add-on compatibility / Karpenterreferences/addon-compatibility.md
Node readiness / AL2 / AMIreferences/node-readiness.md
Workload risks / PDB / probesreferences/workload-risks.md
AWS Insightsreferences/upgrade-insights.md
Generate reportreferences/report-generation.md

Step 9: Calculate Score & Generate Report

Follow the scoring algorithm in references/report-generation.md to calculate the final score and produce the report.

Tool Usage Guidelines

  1. Do NOT hardcode or guess cluster names. Always discover by listing first.
  2. Do NOT retry a failed API call more than once.
  3. Always read the relevant reference file before executing checks for that section.
  4. Use EKS APIs for cluster queries — DescribeCluster, ListNodegroups, DescribeNodegroup, ListAddons, DescribeAddon, DescribeAddonVersions, ListInsights, DescribeInsight.
  5. Use Kubernetes APIs for resource scanning — list Deployments, DaemonSets, StatefulSets, Pods, Nodes, PDBs, etc.
  6. Use EC2 DescribeSubnets for subnet IP capacity checks.

Data Files

  • OSS Add-on Registry: assets/oss_addon_registry.json — identifiers and authoritative upstream URLs for common OSS add-ons. This file does NOT contain compatibility data. Compatibility is always verified live via the registry's compatibility_url and releases_url fields.

Report Output Format

The report is rendered as Markdown inline in your response — the DevOps Agent runtime cannot write files. Use the report-title pattern from references/report-generation.md as the report's title/heading, not as a saved filename. There is only one delivery path: render the full report inline.

Each report includes:

  • Readiness score with breakdown
  • Blockers (hard blockers only — these cap the score at ≤59)
  • Critical Actions (other HIGH-severity findings, not score-capping)
  • Recommended actions
  • Informational findings
  • Evidence tables (add-ons, nodes, workloads)
  • Step-by-step upgrade plan with pre-filled commands
  • AWS reference links