Kubernetes(K8s)部署高可用(High Availability)的 Apache APISIX 集群。部署要点、注意事项,并提供基于 Helm 的部署步骤,助你构建稳定、可靠的 APISIX 网关集群。

🔧 一、高可用部署核心要点
实现 APISIX 在 K8s 中的高可用,主要需关注以下几点:
- ETCD 集群高可用:APISIX 的所有配置(路由、服务、证书等)都存储在 etcd 中。etcd 的高可用是 APISIX 高可用的基石。在生产环境中,务必部署不少于 3 个节点的 etcd 集群,并确保它们分布在不同的故障域(如不同可用区)。
- APISIX 组件多副本:无论是 APISIX 网关本身,还是
apisix-ingress-controller,都应通过 Deployment 部署多个副本,并配置反亲和性(Anti-Affinity),避免副本集中在同一工作节点,从而避免单点故障。 - 持久化存储:etcd 是有状态服务,必须为每个 etcd 节点提供独立且持久的存储卷(Persistent Volume)。这样即使 Pod 重建,数据也不会丢失。
- 外部访问与负载均衡:需要通过 LoadBalancer 类型的 Service 或 Ingress 将 APISIX 网关暴露到集群外部,并确保流量能在多个 APISIX 网关副本间均衡分布。

📊 二、部署方式对比
在 K8s 中部署 APISIX,主要有两种方式,下表列出了它们的对比,Helm 通常是更便捷的选择:
| 特性 | Helm 部署 (推荐) | YAML 文件部署 |
|---|---|---|
| 复杂度 | 低,几条命令即可完成 | 高,需自行处理所有资源定义和依赖 |
| 可维护性 | 高,易于升级、回滚 | 较低,需手动管理所有配置 |
| 灵活性 | 高,可通过 values.yaml 灵活定制 | 极高,可对每个细节进行定制 |
| 生产适用性 | 非常适合 | 适用,但管理成本较高 |
🚀 三、使用 Helm 部署高可用 APISIX 集群(推荐)
以下是使用 Helm 进行高可用部署的关键步骤和配置。假设你已安装 kubectl 和 helm。
步骤 1: 添加 Helm 仓库
helm repo add apisix https://charts.apiseven.com
helm repo update
步骤 2: 准备 Values.yaml 配置文件
创建一个自定义的 values.yaml 文件来覆盖默认配置,这是实现高可用的核心。关键配置如下:
# values.yaml 高可用配置示例
# 1. 配置 APISIX 网关多副本及反亲和性
gateway:
replicaCount: 3 # 根据需求调整副本数
autoscaling: # 可选:配置水平自动扩缩容 (HPA)
enabled: true
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 80
podAntiAffinity: # 反亲和性,尽量将 Pod 分散到不同节点
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- apisix
topologyKey: kubernetes.io/hostname
# 2. 高可用 ETCD 集群配置 (核心!)
etcd:
replicaCount: 3 # 必须 3 个或更多奇数节点
persistence:
enabled: true
storageClass: "alicloud-disk-ssd" # 替换为你集群中可用的 StorageClass
size: 20Gi # 根据实际需求调整存储大小
# 资源请求与限制
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 2Gi
# 3. 启用 Ingress Controller 并配置多副本
ingress-controller:
enabled: true
replicaCount: 2 # 通常 2 个副本即可
config:
apisix:
serviceNamespace: apisix # 指定 APISIX Admin API 的命名空间
# 4. 启用 Dashboard (可选)
dashboard:
enabled: true
# Dashboard 的服务类型,可根据需要设置为 ClusterIP, NodePort 或 LoadBalancer
service:
type: LoadBalancer
📌 关键配置说明:
- StorageClass:
etcd.persistence.storageClass必须设置为你的 K8s 集群中可用的、支持动态供给的存储类。在阿里云 ACK 中,可以是alicloud-disk-ssd;AWS EKS 中可能是gp2或gp3;自建集群可能需要配置 Ceph RBD 或 NFS Provisioner。 - 资源限制:务必为
etcd和gateway设置合理的 CPU 和内存资源请求与限制,防止资源竞争导致容器被杀。 - 反亲和性:
podAntiAffinity配置能尽量避免同一应用的 Pod 调度到同一节点,提升容灾能力。
步骤 3: 执行 Helm Install
使用你的 values.yaml 文件部署 APISIX。建议部署到独立的命名空间。
# 创建命名空间
kubectl create namespace apisix
# 部署 APISIX
helm install apisix apisix/apisix \
--namespace apisix \
--values values.yaml # 指定你的自定义配置文件
步骤 4: 验证部署
检查 Pod 是否全部正常运行,且副本数符合预期:
kubectl get pods -n apisix
期望的输出应显示所有 Pod 都处于 Running 状态,例如:
NAME READY STATUS RESTARTS AGE
apisix-etcd-0 1/1 Running 0 5m
apisix-etcd-1 1/1 Running 0 5m
apisix-etcd-2 1/1 Running 0 5m
apisix-gateway-xxx-yyy 1/1 Running 0 5m
apisix-gateway-xxx-zzz 1/1 Running 0 5m
apisix-gateway-xxx-www 1/1 Running 0 5m
apisix-ingress-controller-aaa-bbb 1/1 Running 0 5m
apisix-ingress-controller-aaa-ccc 1/1 Running 0 5m
检查 Service,确认 apisix-gateway 和 apisix-dashboard (如果启用) 的服务类型:
kubectl get svc -n apisix
⚠️ 四、重要注意事项与故障排查
-
存储卷权限问题:在某些环境中(如阿里云 ACK 使用云盘),etcd Pod 可能会因无权限写入挂载目录而启动失败。解决方法是在
values.yaml的etcd部分添加以下配置:etcd: # ... 其他配置 volumePermissions: enabled: true # 启用初始化容器来修改卷权限 securityContext: fsGroup: 0 # 设置文件组ID runAsUser: 0 # 设置运行用户ID -
访问 APISIX 网关和 Dashboard:
- 通常将
apisix-gateway服务的类型设置为LoadBalancer,云提供商会自动分配一个外部 IP 或域名。 - 同样,若需从外部访问 Dashboard,也可将其服务类型设置为
LoadBalancer。务必注意 Dashboard 的安全风险,应配置强密码、启用 HTTPS 并严格限制访问源 IP。
- 通常将
-
资源监控与自动扩缩容 (HPA):生产环境强烈建议配置 HPA(如示例配置),并根据实际监控指标(如 QPS、连接数、CPU 负载)动态调整 APISIX 网关的副本数。
-
备份与灾难恢复:定期备份 etcd 的数据至关重要。你可以使用
etcdctl工具手动备份,或使用 Velero 等工具备份整个 Persistent Volume,以确保在发生严重故障时能够恢复。
💎 总结
在 K8s 中部署高可用的 Apache APISIX 集群,关键在于确保 ETCD 集群的高可用和多副本部署、为 ETCD 提供可靠的持久化存储,以及通过反亲和性等方式避免单点故障。使用 Helm chart 可以极大地简化部署和管理的复杂度。
部署完成后,你应该通过 kubectl get pods -n apisix 验证所有组件(特别是 etcd 和 gateway)的副本数是否都按预期运行,并通过 kubectl get svc -n apisix 确认网关服务是否已成功暴露以便接收外部流量。
希望这份指南能助你顺利完成高可用 APISIX 集群的部署。
327

被折叠的 条评论
为什么被折叠?



