Helm install失败主因是仓库地址变更未更新,APISIX Chart已从charts.apiseven.com迁移至charts.apisix.apache.org,需先helm repo remove apisix再add新源并update;生产环境必须外置etcd集群,禁用内置etcd避免冲突;资源配额需设limits.memory: 2Gi(proxy)和512Mi(admin),requests应接近limits防驱逐;Ingress注解需配合apisix-ingress-controller启用并使用APISIX格式。

用 Helm 部署 APISIX 时为什么 helm install 失败?
多数失败源于 Helm repo 未正确添加或版本不匹配。APISIX 官方 Chart 已从 https://charts.apiseven.com 迁移至 https://charts.apisix.apache.org,旧地址会返回 404 或空 Chart。
- 执行前先清理旧 repo:
helm repo remove apisix - 添加新 repo:
helm repo add apisix https://charts.apisix.apache.org - 更新缓存:
helm repo update - 检查可用版本:
helm search repo apisix/apisix -l,注意apisix/apisix是 Chart 名,不是仓库名
若仍报 "no chart name found",确认 Helm v3 已启用 OCI 支持(v3.8+ 默认开启),且未误用 helm install --version 指定不存在的 Chart 版本(如把 Apache Release 版本号当成 Chart 版本)。
部署时要不要启用 etcd 外置集群?
生产环境必须外置,APISIX 自带的 etcd 副本(默认 1 个)仅适合测试。内置 etcd 无法持久化、不支持高可用,Pod 重启后路由配置丢失是常见问题。
- 推荐方案:用独立 StatefulSet 部署 etcd 集群(至少 3 节点),通过
etcd.hosts指向其 Service:etcd.hosts: ["http://etcd-headless.default.svc.cluster.local:2379"] - 若复用已有 etcd,确保启用了
v3 API且网络策略允许 APISIX Pod 访问对应端口 - 禁用内置 etcd:在 values.yaml 中设
etcd.enabled: false,否则 Helm 会同时部署两套 etcd,造成端口冲突和配置混乱
apisix-admin 和 apisix-proxy 的资源配额怎么设才不爆内存?
APISIX 的内存消耗集中在 LuaJIT GC 和插件缓存,尤其启用 limit-count、openid-connect 等插件后,单实例超 2GB 很常见。K8s 里不设 resources.limits.memory 容易被 OOMKilled。
-
apisix-proxy(处理流量)建议起步值:limits.memory: 2Gi,若 QPS > 500 或启用 JWT/SSL 双向认证,升至3Gi -
apisix-admin(配置同步)压力小得多,512Mi足够;但若频繁调用 Admin API 批量更新路由,可加到1Gi - 务必设
requests.memory与 limits 接近(如1.8Gi/2Gi),避免 K8s 调度器误判节点资源而驱逐 Pod
如何让 APISIX 正确读取 Kubernetes Ingress 注解?
APISIX 不原生兼容标准 Kubernetes Ingress,需启用 ingress-controller 子 Chart 或独立部署 apisix-ingress-controller。直接把 nginx.ingress.kubernetes.io/* 注解写到 Ingress 对象上无效。
- 若用 Helm 一键部署,启用
ingressController.enabled: true,它会监听 Ingress 资源并转换为 APISIX Route/Upstream - 注解需用 APISIX 格式:
kubernetes.io/ingress.class: apisix+apisix.apache.org/upstream-protocol.h2c: "80"等 - 注意 RBAC 权限:Ingress Controller 需要
list/watchIngress、Service、Endpoints 资源,缺权限会导致配置不同步但无明显错误日志
真正难排查的是证书挂载——Ingress TLS secret 必须与 APISIX 所在 namespace 同名,且 Controller 默认只读取 default namespace 下的 secret,跨 ns 需显式配置 watchNamespace。


















