在生产环境中运维 etcd
在传统模式下,以及控制面和数据面使用 etcd 配置提供方的解耦部署中,APISIX 使用 etcd 作为配置存储。该集群的可用性和延迟决定运维人员能否发布配置,以及新的 APISIX 进程能否加载初始配置。
在传统模式下,每个 APISIX 实例管理配置并代理流量。在解耦模式下,控制面实例通过 Admin API 接收配置变更,数据面实例则加载这些配置并代理流量。APISIX 使用 etcd watch(即对配置变更的订阅)使自身配置保持最新。
如果 etcd 变得不可用,正在运行的 APISIX 进程会在内存中保留最近一次成功加载的配置。因此,在 APISIX 重新连接期间,现有代理路径可以继续处理流量,但配置写入和同步会停止。新启动或重启的进程必须从可用端点加载配置后才能就绪。依赖其他运行时系统的能力(例如服务发现或外部限流存储)具有各自的故障行为。
本文适用于 APISIX 专用的 etcd 集群,不适用于独立模式。独立模式将配置存储在文件或内存中,而不使用 etcd。除非已规划并演练过切换和回滚流程,否则不要在事故响应中临时将生产部署切换为独立模式。
生产基线
在生产环境中使用由 etcd 支持的 APISIX 部署之前,请建立以下基线:
| 领域 | 要求 |
|---|---|
| 版本和平台 | 固定确切的 etcd 版本或镜像摘要。记录并测试完整的 APISIX、etcd、操作系统和 部署平台组合。 |
| 集群拓扑 | 使用三个位于不同故障域的投票成员,并确保成员间延迟较低且可预测。 |
| 存储和容量 | 使用基于 SSD 的存储。在测试有代表性的 APISIX 连接、watch、配置写入、故障和维护操作后确定集群容量。 |
| 安全 | 使用 TLS 加密客户端和对等节点流量,启用身份认证,并将凭证权限限制到配置的前缀。为传统模式实例和控制面授予读写权限,为数据面授予读取和 watch 权限。 |
| 生产验收 | 在将流量导向部署之前,完成部署顺序、只读检查、故障测试、备份测试和生产检查清单。 |
| 监控 | 同时监控 etcd 仲裁和存储,以及 APISIX 可达性和配置传播。对需要运维人员立即处理的故障发出告警。 |
| 维护 | 启用自动压缩。按既定周期评估维护需求;执行破坏性操作时一次只处理一个成员,并在成员之间进行健康检查。 |
| 恢复 | 加密快照,在集群故障域之外至少保留一份副本,并演练恢复流程。学习者成员或额外成员不等同于备份。 |
了解故障行为
规划恢复时,应考虑对配置和流量的影响,而不应只关注 etcd 进程状态:
| 状况 | 配 置操作 | 现有代理流量 | 新启动或重启的 APISIX 进程 |
|---|---|---|---|
| 一个成员不可用,但仍保持仲裁 | 通过其余成员继续执行读取、写入和 watch。 | 正常继续。 | 可以从可用端点加载配置。 |
| 丢失仲裁或所有端点均不可达 | Admin API 写入和配置同步停止。 | 使用内存中最近加载的配置继续运行。 | 在恢复仲裁并验证初始加载之前,使其保持停止服务状态。 |
| watch 的修订版本已被压缩 | APISIX 执行完整读取,并从当前状态恢复 watch。 | APISIX 重新连接期间,使用已加载的配置继续运行。 | 加载当前状态,而不是重放旧修订版本。 |
| 从较旧的快照恢复集群 | 存储的配置回退到快照状态。 | 正在运行的进程在重新同步前可能暂时保留更新的内存状态。 | 加载恢复后的状态。 |
警告
etcd 故障期间,请勿重启 APISIX 实例。配置缓存只存在于进程内存中,重启会丢弃维持现有代理流量的配置。重启后的进程必须从 etcd 加载配置后才能就绪。