Why upgrade the APISIX Ingress Controller to 2.x and which path to take
If your Kubernetes team runs the 1.x APISIX Ingress Controller, moving to the 2.x line is a planned migration, not a version bump. The 2.x line changes how the controller is configured, removes features that 1.x teams may depend on, and makes the controller the source of truth for the gateway configuration it pushes to APISIX. Treat the move as a change to your configuration model, with its own scope, test plan and cutover window. The supported path starts with the APISIX version. Controller releases 2.0.0 and 2.1.0 support APISIX 3.0 and later and recommend APISIX 3.13, and the standalone API-driven mode requires APISIX 3.13 or later. Decide early which APISIX line the new controller will drive, because that choice sets the data plane version you test against and whether standalone mode is available to you. Confirm the current compatibility table in the APISIX Ingress Controller upgrade guide before you pin versions.
Release dates help you plan the target. According to the project's GitHub releases, APISIX Ingress Controller 2.0.0 was released on December 16, 2025, 2.1.0 on June 1, 2026 and 2.2.0 on August 18, 2026. Most teams should target the newest 2.x release that their APISIX version supports, then read the release notes for every version between their current 1.x build and that target. Ask your platform owner to confirm which 2.x release fits your Kubernetes version and APISIX line, and record the decision so auditors and on-call engineers can trace why the cluster runs the version it does.
What changes in the 2.x line and what each change means for your team
This table lists each change in the APISIX Ingress Controller 2.x line, what it means for the way your cluster is run, and the action your team needs to take before switchover. Read each row against your current 1.x setup, and treat any row that touches live configuration as a gate for the blue-green cutover.
| Change | Impact on your team | Action needed |
|---|---|---|
| Controller is the source of truth | Manual changes made through the APISIX Admin API are overwritten on the next full sync from Kubernetes resources. | Move every route, plugin and upstream change into Kubernetes manifests before cutover, and audit the gateway for hand-made objects. |
| Mock-etcd mode removed | Any test or lab setup that ran the controller without a real etcd backend will not start on 2.x. | Replace mock-etcd test environments with a standard APISIX deployment, or retire them. |
| ApisixClusterConfig CRD removed | Cluster-wide settings defined in this resource have no 2.x equivalent under the same name. | Inventory existing ApisixClusterConfig objects and re-express their intent with the 2.x resources listed in the upgrade guide. |
| ApisixGlobalRule for global rules | Global rules now come from ApisixGlobalRule, so manifests that relied on the removed resource must change. | Convert global rule definitions to ApisixGlobalRule and confirm the plugins apply to the intended scope. |
| GatewayProxy CRD connects the data plane | The controller reaches APISIX through a GatewayProxy resource, so data plane endpoints and credentials must be declared there. | Define a GatewayProxy for each data plane, and confirm the endpoint and Admin credentials it references. |
| Ingress v1 only | Ingress resources using networking.k8s.io/v1beta1 are not supported by 2.x. | Convert all Ingress manifests to networking.k8s.io/v1 and check for v1beta1 objects across namespaces. |
| Standalone API-driven mode needs APISIX 3.13 or later | Standalone API-driven deployments on older APISIX releases cannot use this mode with 2.x. | Confirm the APISIX version in each data plane, and plan an APISIX upgrade first if it is older than 3.13. |
| Renamed config fields | Some configuration keys changed names, so manifests written for 1.x may be rejected or ignored. | Compare each manifest field against the upgrade guide and validate the rendered configuration in staging. |
| hmac-auth access_key becomes key_id | For APISIX 3.11 and later, consumers that set access_key must set key_id instead, or HMAC authentication fails. | Update hmac-auth consumer definitions to key_id and test signed requests from each client before switchover. |
What to inventory and back up before touching the controller
The 2.x controller treats its own resources as the source of truth, so anything that lives only in the running gateway or the current cluster can be lost or overwritten. These cards cover what to record, what to export and what to test before the first change to the controller.
Inventory Ingress v1 and custom resources
List every Ingress object in use and confirm each one is on networking.k8s.io/v1, because 2.x does not accept v1beta1. Record the APISIX custom resources and any Gateway API resources that the controller translates today. Note which ones depend on annotations or plugin configuration, since those are the first to need rework during the move.
Find manual Admin API changes
Any route, upstream, consumer or plugin change made directly through the Admin API is at risk, because the 2.x controller is the source of truth and overwrites manual changes on the next full sync. Compare live gateway state against the Kubernetes resources and decide, for each difference, whether to move it into a manifest or retire it.
Identify hmac-auth consumers
Consumers that use hmac-auth must be checked for the access_key field, which became key_id for APISIX 3.11 and later. Confirm which consumers exist, which clients sign requests with them, and how each consumer's credentials will be rotated or re-issued. Plan the field rename as a coordinated change with the client teams so signed traffic does not fail during cutover.
Back up CRDs and cluster state
Export the current ApisixClusterConfig, ApisixRoute, ApisixUpstream, ApisixTls and related custom resources, along with the Ingress objects and the controller's Helm values. Store the exports outside the cluster with access controls, because Kubernetes Secrets are stored unencrypted in etcd by default and referenced TLS or key material must be handled carefully. Test that you can restore from these exports.
Build a test cluster that matches production
Stand up a non-production cluster with the same Kubernetes version, ingress class, controller settings, APISIX version and gateway topology as production. Load the exported resources and confirm routes, plugins and TLS behave the same way before any traffic moves. Document the differences you cannot match, such as load balancer type or network policy, and decide how each will be tested.
Confirm the APISIX version
Check the running APISIX version against the 3.13 recommendation for the 2.x controller and confirm that the standalone API-driven mode you plan to use requires 3.13 or later. If the gateway is older, decide whether to upgrade APISIX first or in the same change window, and treat that as a separate upgrade with its own test plan. Confirm the target version with your vendor or your own environment before you commit to a date.
How a blue-green switchover to the 2.x controller runs step by step
The sequence moves routes from the 1.x controller to the 2.x controller in stages, with a rollback point at each stage so traffic can return to 1.x until the cutover is accepted.
Confirm APISIX and cluster compatibility
Your platform team checks which APISIX version the gateway runs and confirms it meets the 2.x controller requirement, which is APISIX 3.0 or later, with 3.13 recommended. Confirm the Kubernetes API version in use, because 2.x serves only networking.k8s.io/v1 Ingress. Also list every Ingress object that still uses v1beta1 and convert it before going further. The step is done when you have a written compatibility record and an inventory of Ingress resources, and the 1.x deployment is still untouched and serving traffic. Rollback point: nothing has changed yet, so no action is needed.
Review the 1.x to 2.x removals and field changes
Your team reads the upgrade guide and maps each removed or renamed item against your current configuration. Check for mock-etcd mode, ApisixClusterConfig resources, and renamed configuration fields, and replace global rules with ApisixGlobalRule. Record any manual Admin API changes, since 2.x treats the controller as the source of truth and overwrites manual changes on the next full sync. The step is done when every custom resource and Helm value is classified as kept, converted or retired. Rollback point: the 1.x deployment is unchanged, so you can stop here without affecting traffic.
Stand up the 2.x controller beside 1.x
Deploy the 2.x controller in the same cluster under a different ingress class, so it does not claim Ingress objects owned by 1.x. Create a GatewayProxy resource that points the 2.x controller at the APISIX data plane it will configure, and confirm that the controller pods reach the Admin API endpoint. Keep the 1.x controller and its ingress class running. The step is done when the 2.x controller reports healthy and its GatewayProxy shows a connected data plane. Rollback point: delete the 2.x release; 1.x still serves all traffic.
Sync and validate routes on a test host
Create converted copies of a small set of Ingress and custom resources bound to the 2.x ingress class, using a test hostname that only your team resolves. Check that the generated APISIX routes, upstreams and plugin settings match what 1.x produces for the same request paths. Send test requests and compare status codes, headers and response bodies. The step is done when the test set passes and any differences are documented with an owner. Rollback point: remove the test resources; production routes were never changed.
Shift production traffic in stages
Follow the blue-green approach the upgrade guide recommends, or a canary release if you prefer gradual exposure. Move one low-risk Ingress at a time to the 2.x class, or route a small share of traffic to a 2.x data plane through your load balancer, and watch error rates and latency. Widen the share only after each stage is clean. The step is done when all in-scope routes serve from the 2.x controller and the 1.x resources are idle. Rollback point: switch the ingress class or load balancer target back to 1.x for the affected routes, which 1.x still owns until the cutover is accepted.
Verify authentication and observability
Confirm that authentication behaves the same on the 2.x path. Test each consumer, key, JWT, HMAC or OpenID Connect flow you rely on, including failure cases such as expired tokens and missing keys. Check that access logs, metrics and traces still reach your monitoring stack with the labels your dashboards and alerts use. Review the APISIX version for plugin changes that affect your flows, such as the hmac-auth key_id rename in APISIX 3.11 and later. The step is done when a written checklist shows each auth path and each dashboard passing. Rollback point: return the affected routes to 1.x while you fix the gap.
Accept the cutover and remove the 1.x controller
Hold a review with the service owners and the security team, using the test results, traffic metrics and auth checklist as evidence. Only after the agreed observation period passes without open defects, uninstall the 1.x controller, remove its ingress class and delete leftover 1.x custom resources and configuration. Store the final inventory and the change record with your operations documentation. The step is done when 1.x resources are gone from the cluster and the record is filed. Rollback point: until this removal, reinstalling the 1.x release and restoring its ingress class remains possible, so keep its Helm values and manifests in version control.
How the 2.x controller, GatewayProxy and APISIX data plane connect
The 2.x controller is the component that turns Kubernetes configuration into APISIX configuration, so the first thing to settle before the upgrade is which of your resources it will read. The controller translates three kinds of input: Kubernetes Ingress v1 resources, Gateway API resources and APISIX custom resources. Ingress v1 is the only Ingress version the 2.x line accepts, so any networking.k8s.io/v1beta1 Ingress manifests must be converted before the new controller takes over. Inventory your Ingress, Gateway API and custom resource objects per namespace, and note which ones use ApisixGlobalRule or other APISIX resources, because global rules are now handled there rather than through the removed ApisixClusterConfig.
The GatewayProxy custom resource is how the controller finds the data plane it should configure. It names the APISIX Admin API endpoint and credentials that the controller writes to, and your routes are only live on the gateway instances that this connection reaches. Confirm the exact fields in the upgrade guide and the GatewayProxy reference for your controller version, and record which APISIX Admin API address and key each GatewayProxy points to. Two gateways pointed at the same data plane, or a GatewayProxy left pointing at an old deployment during a blue-green switchover, is a common way to send traffic to the wrong place.
The controller is the source of truth in 2.x. Its overview states that the controller writes APISIX configuration from Kubernetes objects, and the upgrade guide notes that manual Admin API changes are overwritten on the next full sync. Any route, plugin or consumer that someone created directly through the Admin API must be moved into a Kubernetes resource before cutover or it will disappear. Standalone, API-driven mode requires APISIX 3.13 or later, and the overview recommends 3.13 for the 2.x releases, so check the data plane version before you choose a mode. Confirm these version constraints against the APISIX Ingress Controller overview for the release you plan to deploy.
What makes a controller upgrade take longer or shorter
How many Ingress v1 resources and custom resources does the upgrade touch?
The number of Ingress v1 resources and APISIX custom resources in your cluster is usually the first driver of effort. The 2.x controller supports only networking.k8s.io/v1 Ingress, so any v1beta1 Ingress must be converted before cutover, and every ApisixRoute, ApisixUpstream or plugin resource must be checked against the 2.x field set. Teams should inventory each resource type by namespace and count how many will need edits, review or retesting. A small set of resources in one namespace is a short review. Hundreds of routes across many namespaces, with custom plugin configuration, takes longer to validate and to sign off.
Do removed features like mock-etcd or ApisixClusterConfig slow the upgrade down?
Yes, if your current setup depends on them. The 2.0 release removes mock-etcd mode and the ApisixClusterConfig CRD, and it introduces ApisixGlobalRule for global rules and a GatewayProxy CRD to connect the data plane. Each place where a removed feature is used needs a replacement design, a change to manifests, and a test. Clusters that already use only current custom resources move faster than clusters that rely on mock-etcd or cluster-level configuration objects. Check the upgrade guide's removal list against your manifests before estimating work.
Do hmac-auth and other changed auth plugins add work?
They can. The upgrade guide notes that the hmac-auth access_key field became key_id for APISIX 3.11 and later, and APISIX 3.17 changed the default for signed_headers. Consumers, secrets and client code that depend on these fields must be updated together with the controller, and a mismatch causes authentication failures that look like outages. Gateways with several auth plugins, such as key-auth, jwt-auth or openid-connect alongside hmac-auth, need each plugin's configuration reviewed separately. Confirm the exact APISIX version you will run, since the field and default changes depend on it.
Does manual Admin API editing make the controller upgrade harder?
It can add significant work and some risk. In 2.0 the controller is the source of truth, and manual Admin API changes are overwritten on the next full sync. Any route, plugin or upstream edited directly through the Admin API must be moved into Kubernetes resources, or it will disappear during sync. Teams should list every manual change, decide whether each one is still needed, and confirm that the corresponding resource exists in the new model. Ask whether automation or runbooks also write to the Admin API, because those writes will be undone as well.
Does the Kubernetes version affect how long the upgrade takes?
It can. The Kubernetes version skew policy requires kube-apiserver to be upgraded one minor version at a time, and kubelets may be up to three minor versions older than kube-apiserver. If the cluster is behind on Kubernetes, the controller upgrade may need to be sequenced with a cluster upgrade, which adds planning and a separate change window. Also confirm that the controller release you choose supports your cluster version and your APISIX version. The Kubernetes release page lists which minor versions are still maintained, so an older cluster may already be out of support.
How does the number of clusters change the effort?
Effort grows with the number of clusters, because each one needs its own inventory, blue-green environment, validation and cutover. Clusters that share a configuration pattern can reuse runbooks and test plans, which shortens later rollouts. Clusters with different ingress classes, gateway setups or security requirements need separate review. If you run several clusters with different APISIX versions, the sequencing decision becomes a project-level task. Ask for the cutover plan per cluster, including rollback steps for each one.
How much traffic validation does the team need before switchover?
The upgrade guide recommends a blue-green deployment or a canary release before full switchover, so validation effort depends on how much traffic you can safely shift and how carefully you can compare results. Teams usually need to test each route, authentication path and plugin behavior, compare logs and metrics between the old and new controllers, and agree on rollback criteria. Routes with strict availability or audit requirements need more evidence than internal routes. Confirm with your stakeholders which routes are in scope for canary traffic and who signs off on the switch.
Can our own team do the upgrade, or should we hire a partner?
Your own team can do it if it already runs APISIX and Kubernetes in production, has no manual Admin API changes, and can allocate people for inventory, testing and a rollback window. A partner is more useful when the inventory is large, removed features are in use, several clusters are involved, or the team has no recent APISIX experience. DeployOpen implements, customizes, hardens, backs up, upgrades and documents self-hosted open-source platforms in your own infrastructure, and most engagements are fixed-scope with scope and timelines agreed in writing before work starts. A written scope is the basis for a quote.
Doing the upgrade in-house or with a partner
Your platform team does the migration with its own people and a test cluster that mirrors production closely enough to rehearse the switchover. This works best when the team already runs Kubernetes and APISIX, has spare capacity, and can keep a running Ingress Controller 1.x in service while the 2.x controller is built alongside it. The team carries the risk of every decision, so the upgrade guide and the release notes become working documents.
- Inventory first: list every Ingress, APISIX custom resource and Admin API change that would be overwritten once the 2.x controller becomes the source of truth.
- Test cluster parity: match APISIX version, plugins, certificates, etcd or standalone mode and Kubernetes version to production as closely as you can.
- Blue-green rehearsal: run the new controller beside the old one, send test traffic through both and record the differences.
- Cutover runbook: write the switch, rollback and post-switch checks with named owners.
- Knowledge retention: document how the GatewayProxy resource connects the data plane, since your team will maintain it after the project ends.
Before you start, check that your team can name who approves the cutover and who answers for a rollback at 2 a.m.
A partner plans, builds and verifies the move under a written scope with agreed deliverables and dates. The partner brings the migration method, the test plan and the runbook, while your team supplies access, change approvals and the people who know the business routes. Because the scope is fixed, the boundaries of the work are settled before anyone touches the cluster.
- Assessment: a written inventory of existing Ingress resources, custom resources, plugins and Admin API usage, with the items that will need rework.
- Build and rehearsal: the 2.x controller configured for your environment and a blue-green or canary path tested against a non-production cluster.
- Switchover support: agreed cutover steps, a rollback plan and verification checks run during the change window.
- Handover: configuration in version control, a runbook and a short training session for your operators.
- Scope questions to ask: which APISIX version is targeted, whether the test cluster is provided by you or the partner, what counts as acceptance, and what happens if a blocking defect appears.
Request that the written scope names the exact APISIX and Ingress Controller versions, and the list of resources in and out of scope.
A retainer covers the work that follows the migration: reviewing new Ingress Controller releases, testing upgrades against your configuration and handling plugin or Admin API changes as APISIX moves on. It suits teams that expect to track the 2.x line over time, since the controller has already shipped several releases after 2.0.0. Retainers are ongoing, so the scope defines what is included each period and what needs a separate quote.
- Release review: a written assessment of each new controller and APISIX release against your deployed configuration.
- Test upgrades: repeatable rehearsals in a non-production environment before each change in production.
- Change support: help with blue-green or canary switchovers and rollback verification.
- Security updates: timely review of advisories that affect your gateway and Kubernetes versions.
- Scope questions to ask: response expectations, how many upgrades are covered per period, who approves changes and what is billed separately.
Check whether the retainer covers Kubernetes version changes as well as APISIX and Ingress Controller releases, since both affect the gateway.
Questions teams ask before upgrading the APISIX Ingress Controller
What does an Ingress Controller 1.x to 2.x upgrade cost?
The cost is the labor to inventory your current setup, convert it, test it and cut over, plus any platform changes the move forces. No public price applies, so the figure depends on your scope. The main drivers are how many clusters and gateways run the controller, whether you use mock-etcd mode or the removed ApisixClusterConfig resource, how many Ingress resources still use v1beta1, and whether custom plugins or auth settings need rework. Work is usually one-time, but the new controller version and the APISIX version it targets then become ongoing maintenance. DeployOpen quotes from a written scope, so ask for the inventory, the affected resources and the test plan to be listed as separate lines.
How long does the controller upgrade take?
The timeline depends on how much of your configuration the 2.x changes touch and how long your parallel run lasts. No duration applies as a fixed figure. The biggest variables are the number of clusters, the presence of removed features such as mock-etcd mode and ApisixClusterConfig, the number of Ingress resources to move to networking.k8s.io/v1, and how long your change approval and test cycles take. A blue-green or canary period adds time, but it reduces the chance of a rushed rollback. Ask for a schedule that separates inventory, conversion, parallel testing, switchover and a rollback window.
What does the upgrade need from our platform team?
Your platform team needs access to the clusters, the current APISIX configuration, the Ingress and custom resources in use, and the ability to run a second controller and data plane during testing. Someone must own the decision on which configuration the controller treats as the source of truth, because version 2.0 overwrites manual Admin API changes on the next full sync. Plan time for Kubernetes RBAC review, traffic testing and monitoring updates. Security and application owners should also review auth and plugin behavior before cutover.
Can our own team upgrade the APISIX Ingress Controller without a partner?
Yes, a capable platform team can do this in-house, provided it reads the upgrade guide carefully and has time to test. The work is mostly configuration inventory, resource conversion and controlled cutover, not new development. A partner adds value when the estate is large, when the team has no recent Kubernetes or APISIX work, or when several controller and APISIX versions must be aligned at once. Decide based on your team's capacity, your change window and how much you want a documented, repeatable runbook at the end.
Do we have to upgrade APISIX before the Ingress Controller?
Your APISIX version must be compatible with the controller you choose. Releases 2.0.0 and 2.1.0 support APISIX 3.0 and later, recommend 3.13, and support standalone API-driven mode with APISIX 3.13 or later. So an old gateway may need an upgrade before or alongside the controller. Check which APISIX version your data plane runs, then pick the controller release and APISIX target together. Plan the controller and gateway changes as one sequence, and confirm the compatibility matrix in the upgrade guide before you start.
Is a blue-green switchover required for this upgrade?
The upgrade guide does not make blue-green mandatory, but it recommends a blue-green deployment or canary release before full switchover. Running the new controller beside the old one lets you compare generated routes and test traffic before users depend on the change. The cost of this approach is a second set of resources and a period of double maintenance. Weigh that against the risk of a single cutover on a production cluster. Confirm the rollback path in writing before the switchover date.
Which Ingress resources and fields break first?
Ingress resources using networking.k8s.io/v1beta1 will not be served, because version 2.0 supports only networking.k8s.io/v1 Ingress. Teams should also check for mock-etcd mode, ApisixClusterConfig objects, and renamed configuration fields listed in the upgrade guide. Auth plugins deserve attention too. For example, the hmac-auth rewrite in APISIX 3.11 changed the required access_key field to key_id for APISIX 3.11 and later. Run a dry review of every manifest against the guide before you start the parallel run.
Does the controller upgrade change our security posture?
It can, because the controller becomes the source of truth for gateway configuration and overwrites manual Admin API edits on the next full sync. Teams that patched routes or plugins by hand need to move those changes into Kubernetes resources before cutover. Review who can change custom resources, since RBAC then controls the gateway's configuration. Also confirm that secrets used by auth plugins are stored in Kubernetes Secrets with encryption at rest enabled, because Kubernetes stores Secrets unencrypted in etcd by default.
How DeployOpen scopes, delivers and supports the controller upgrade
DeployOpen plans and carries out the move of APISIX Ingress Controller from the 1.x line to 2.x as a written, fixed-scope engagement inside your own clusters. The work covers the removed features, renamed fields, Ingress v1 conversion and a blue-green switchover, with ongoing support available as a retainer.
How we scope
- We inventory existing 1.x resources, mock-etcd usage, ApisixClusterConfig objects and any Ingress v1beta1 manifests before agreeing scope.
- We confirm the target APISIX data plane version, including whether standalone API-driven mode with APISIX 3.13 or later is in scope.
- The written scope lists deliverables, environments, cutover approach and acceptance checks, and engagements are fixed-scope with timelines agreed in advance.
How we build
- We convert Ingress resources to networking.k8s.io/v1 and move global rules into ApisixGlobalRule and the data plane link into a GatewayProxy resource.
- We align hmac-auth and other plugin field changes with the APISIX version in use, such as the access_key to key_id change for 3.11 and later.
- We stand up the 2.x controller beside the 1.x install in a blue-green arrangement and test routes, authentication and upstream behavior before any traffic moves.
How we hand over
- We document the source-of-truth model, so teams know that manual Admin API edits are overwritten on the next full sync.
- We provide a field-by-field mapping of renamed configuration, with a rollback procedure for returning traffic to the 1.x controller.
- We hand over the manifests, runbooks and test evidence to your platform team, and review the cutover with them before the old controller is removed.
How we support
- Post-cutover support covers controller upgrades within the 2.x line, such as tracking releases beyond 2.0.0, and is available under a retainer.
- We help you confirm compatibility with your Kubernetes version and APISIX release before each planned upgrade step.
- Continuous testing and security checks of routes and plugins can be added to the retainer, using the agreed scope as the baseline.

