Problem
API7 Ingress Controller and Apache APISIX Ingress Controller share the same config.yaml structure, and the shared documentation presents one set of defaults. However, the two controller binaries and their two Helm charts currently produce different defaults for several non-provider fields.
Most users install the controllers through Helm, so these differences change effective behavior depending on the selected controller and installation path. We should choose canonical defaults for common fields, align the implementations where appropriate, and document any intentional installation-specific differences.
Scope and versions
This audit covers the active Ingress Controller 2.1.0 documentation and the releases that deploy controller 2.1.0:
- Apache APISIX Ingress Controller 2.1.0
- API7 Ingress Controller 2.1.0
- Apache
apisix-ingress-controller chart 1.2.x
- API7
api7-ingress-controller chart 0.1.x
provider.type is intentionally excluded. listener_port_match_mode is APISIX-only and should remain explicitly documented as product-specific.
Default differences
| Field |
APISIX binary |
API7 binary |
APISIX Helm |
API7 Helm |
leader_election_id |
apisix-ingress-gateway-leader |
apisix-ingress-gateway-leader |
apisix-ingress-controller-leader |
apisix-ingress-controller-leader |
leader_election.lease_duration |
30s |
30s |
Declares 15s, but effective value is 30s because the rendered key is ignored |
15s |
leader_election.renew_deadline |
20s |
20s |
Declares 10s, but effective value is 20s because the rendered key is ignored |
10s |
server_addr |
:9092 |
:9092 |
Not emitted; effective :9092 |
127.0.0.1:9092 |
provider.sync_period |
1h |
0 |
1m |
1h |
webhook.enable |
false |
false |
true |
true |
The remaining literal values align, but some still have chart-control or documentation problems described below.
Additional findings
APISIX Helm renders invalid leader-election keys
The APISIX chart renders:
leader_election:
leaseDuration: 15s
renewDeadline: 10s
retryPeriod: 2s
The controller accepts lease_duration, renew_deadline, and retry_period. It uses non-strict yaml.Unmarshal, so the camelCase keys are silently ignored. This means all three APISIX Helm overrides are ineffective. A focused upstream issue should track that chart defect.
Hidden Helm fallback values also drift
The chart templates contain fallback literals that differ from values.yaml:
- APISIX:
values.yaml uses 1m, while the template fallback is 1s.
- API7:
values.yaml uses 1h, while the template fallback is 0s.
Helm configuration surfaces differ
- APISIX Helm does not expose or emit
enable_server or server_addr.
- Both charts hard-code the webhook certificate filename, key filename, and directory when the webhook is enabled.
- API7 correctly omits
listener_port_match_mode because the API7 binary does not support it.
Some differences may be intentional
Both binaries default the admission webhook to disabled, while both charts enable it and provision the required certificates and Kubernetes resources. This can be a valid installation-context override and should be documented as such rather than automatically copied into the raw binary default.
Changing leader_election_id also needs upgrade planning because replicas using different election IDs can participate in separate elections.
Related issue
Proposed acceptance criteria
Evidence
Problem
API7 Ingress Controller and Apache APISIX Ingress Controller share the same
config.yamlstructure, and the shared documentation presents one set of defaults. However, the two controller binaries and their two Helm charts currently produce different defaults for several non-provider fields.Most users install the controllers through Helm, so these differences change effective behavior depending on the selected controller and installation path. We should choose canonical defaults for common fields, align the implementations where appropriate, and document any intentional installation-specific differences.
Scope and versions
This audit covers the active Ingress Controller 2.1.0 documentation and the releases that deploy controller 2.1.0:
apisix-ingress-controllerchart 1.2.xapi7-ingress-controllerchart 0.1.xprovider.typeis intentionally excluded.listener_port_match_modeis APISIX-only and should remain explicitly documented as product-specific.Default differences
leader_election_idapisix-ingress-gateway-leaderapisix-ingress-gateway-leaderapisix-ingress-controller-leaderapisix-ingress-controller-leaderleader_election.lease_duration30s30s15s, but effective value is30sbecause the rendered key is ignored15sleader_election.renew_deadline20s20s10s, but effective value is20sbecause the rendered key is ignored10sserver_addr:9092:9092:9092127.0.0.1:9092provider.sync_period1h01m1hwebhook.enablefalsefalsetruetrueThe remaining literal values align, but some still have chart-control or documentation problems described below.
Additional findings
APISIX Helm renders invalid leader-election keys
The APISIX chart renders:
The controller accepts
lease_duration,renew_deadline, andretry_period. It uses non-strictyaml.Unmarshal, so the camelCase keys are silently ignored. This means all three APISIX Helm overrides are ineffective. A focused upstream issue should track that chart defect.Hidden Helm fallback values also drift
The chart templates contain fallback literals that differ from
values.yaml:values.yamluses1m, while the template fallback is1s.values.yamluses1h, while the template fallback is0s.Helm configuration surfaces differ
enable_serverorserver_addr.listener_port_match_modebecause the API7 binary does not support it.Some differences may be intentional
Both binaries default the admission webhook to disabled, while both charts enable it and provision the required certificates and Kubernetes resources. This can be a valid installation-context override and should be documented as such rather than automatically copied into the raw binary default.
Changing
leader_election_idalso needs upgrade planning because replicas using different election IDs can participate in separate elections.Related issue
sync_period: 0. It should remain the implementation issue for that runtime bug. This issue tracks the broader default-alignment decision and should not duplicate bug: sync_period 0 stops API7 synchronization events and retries #458.Proposed acceptance criteria
webhook.enable.secure_metrics,sync_period, andinit_sync_delay.config.yamlthrough the real controller parser, reject unknown fields, and assert the effective defaults.leader_election_idchanges.Evidence