升级 AISIX Enterprise
AISIX Enterprise 分两部分升级:控制面,以及承载流量的 AISIX 网关。两者按固定顺序独立升级,在逐台升级网关期间可以运行不同发布版本。支持的升级路径和具体流程取决于安装方式;各版本变更请参阅发布说明。
更改控制面前,请将数据库、密钥、部署配置和匹配的软件一起准备为恢复集。参见备份与恢复。完整的平台专用产品升级流程请参阅在 OpenShift 或 OKD 上升级 AISIX Enterprise。
AISIX Enterprise 支持的升级路径
AISIX Enterprise 支持的升级最低版本为 1.6.0。运行 1.6.0 或更高版本的 AISIX Enterprise 部署,可以直接升级到任何更新版本,包括当前版本。
版本可以跳过。从 1.6.0 直接升级到当前版本是受支持的,不需要逐个经过中间版本。决定升级是否受支持的是下限,而不是跨度:只要来源版本不低于 1.6.0,就可以一步升级到任意更新的目标版本。
升级下限只有在某个版本明确宣布上调时才会变化,不会随着新版本发布而静默抬高,因此今天受支持的部署会一直受支持,直到有版本公告说明为止。从较旧的部署规划跨版本升级前,请先查看目标版本的发布说明。
低于 1.6.0 的部署需要分两步升级:先升级到 1.6.x 或 1.7.x,让它启动并完成数据库迁移,然后再升级到目标版本。cp-api 和部署包的 run.sh 都会拒绝从低于 1.6.0 的版本直接升级,参见升级下限闸门。
兼容性例外是按功能划分的,而不是按版本划分:升级过程中可能出现差异的,始终是某一项具体配置,而不是版本组合本身。这里有两种不同的差异。一种是网关版本无法加载的配置,它会让该网关丢掉整个资源——只要环境中注册了无法加载它的受支持网关,控制面就会拒绝保存这样的配置,参见窗口期内控制面会做哪些检查。另一 种是网关版本不认识的配置,这是升级期间的常见情况:资源照常加载并生效,只是这一项配置在该网关上不起作用,直到它被升级。
AISIX Enterprise 升级顺序与混合版本窗口
先升级控制面,再升级网关。 控制面能够识别升级下限及以上的每个网关版本;网关不一定能够识别比自身更新的控制面。
在这两步之间,部署处于混合版本状态:控制面已是新版本,网关仍是旧版本。这个窗口由升级下限限定,而不是由时间限定。只要每台网关都不低于 1.6.0,这个窗口可以持续到你需要的任何时长——分批推进的机群升级、刻意滞后一周的灰度环境、按自己维护窗口升级的网关,都可以。整个期间网关照常承载流量。
环境的 Data planes 视图会逐实例显示网关版本,便于识别尚未升级的实例。控制面版本显示在控制台左侧导航底部,也可以通过 GET /api/config/public 获取;参见验证部署。
保存作用域内某些网关不认识的配置项是允许的。响应会给出字段名、第一个能够识别该字段的受支持网关版本,以及有多少台网关会忽略它。如果当前没有任何受支持版本能够识别该字段,响应也会明确说明。控制台会在保存后显示同一条警告。在依赖该配置项之前请先阅读警告:被忽略的限制类配置在这些网关上并不生效。
配置到达网关后,控制台还会显示各网关上报的信息。环境概览会区分被忽略的字段和整个资源被拒绝的情况,Data planes 则把受影响节点标记为 Limitations 或 Incompatible。运行版本低于控制面支持的最低网关版本(1.6.0)的节点会标记为 Unsupported version,并提示将其升级到该版本或更高版本;GET /environments/{env_id}/dp_nodes 的响应以 support_floor 给出该版本,并为这类节点返回 below_support_floor: true。这些运行时信号能够发现最初保存配置后才注册或发生回滚的网关。验证流程参见资源投射。
在网关侧,aisix_config_partially_compatible_resources 统计的是携带了本网关版本不认识的字段的资源数量。在窗口期内它可能不为零,网关升级完成后应回落到零。配置健康类指标参见指标参考。
跳过的每个版本,其升级说明依然适用
跳过一个版本,跳过的是它的发布说明,而不是它带来的行为变化。一次跨越多个版本的升级,其间每个版本的升级说明都对你适用,并且要按顺序阅读——从你当前版本的下一个版本开始,一直读到目标版本,由旧到新。
升级说明记录的是升级前需要做的事:含义发生变化的配置项、开始生效的 Helm 取值、需要复核的告警表达式。被跳过版本中的说明,不会因为 后续版本的说明而失效。
从更早的版本升级到 1.0.0 之前,还要完成升级到 1.0.0 时复核已有安全护栏。它不是一条升级说明,而是一份升级前检查清单:它要求你在控制面以新版本启动之前,先找出并停用受影响的语义安全护栏。
从 1.7.0 或更早版本升级:控制面不再使用行级安全
AISIX Enterprise 不再使用 PostgreSQL 行级安全(Row-Level Security)。其数据库角色只需要拥有控制面数据库,参见外部数据库。1.7.0 及更早版本会在控制面表上安装行级安全策略,并在每个请求中切换到内部角色 cp_api_app,因此要求 CREATEROLE 和 BYPASSRLS。
启动时移除行级安全
每次启动时,cp-api 会在持有 migration 锁期间,移除早期版本在其表上安装的内容:FORCE ROW LEVEL SECURITY、ENABLE ROW LEVEL SECURITY 和 tenant_isolation 策略。只要移除了内容,它就会记录 一条 info 日志,以 removed the row-level security an earlier release installed 开头,并列出处理的表。对于已经清理过的数据库,它只读取系统目录,不做任何修改。
由其他角色持有的表
只有表的 owner,或 owner 角色的成员,才能做这些修改。被其他账号复制或恢复过的数据库,例如经过阿里云数据传输服务(DTS)或 pg_restore 处理的数据库,其中的控制面表可能由其他角色持有。当这样的表仍带有上述设置时,cp-api 不会修改任何表,并拒绝启动。错误信息以 an on-premises control plane does not use row-level security, but an earlier release left it on tables this database role does not own 开头,列出每张表及其 owner,并给出每张表需要执行的语句:
ALTER TABLE public."<table>" NO FORCE ROW LEVEL SECURITY;
ALTER TABLE public."<table>" DISABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation ON public."<table>";
请让表的 owner 或数据库管理员执行错误信息中的语句,然后再次启动控制面。
拒绝第二个数据库 URL
cp-api 只通过 database.url(AISIX_CLOUD_DATABASE_URL)连接;如果同时设置了 database.admin_url(AISIX_CLOUD_ADMIN_DATABASE_URL),它会拒绝启动。1.7.0 及更早版本只会对此记录一条警告。升级前,请把 database.url 设置为 database.admin_url 的值(它以拥有数据库的角色连接),并删除 database.admin_url。
使用 Helm 时,设置 twoDSN.enabled=false。该值为 true 时,Helm 首先要求设置 twoDSN.existingSecret,或设置非空且不以 CHANGE_ME 开头的 twoDSN.servingPassword。通过该检查后,Chart 会以 database.admin_url 渲染第二个数据库 URL,cp-api 随后会因该 URL 在 on-premises 模式下无效而拒绝启动。原因写在 cp-api 的 Pod 日志中,日志给出的是 database.admin_url,而不是 Helm value。错误信息中还提到 saas 模式,该模式运行托管的 AISIX Cloud 服务,不支持客户自行托管的安装。
移除 CREATEROLE 和 BYPASSRLS
升级后,连接角色不再需要 CREATEROLE 或 BYPASSRLS。是否移除由你决定:
ALTER ROLE aisix NOCREATEROLE NOBYPASSRLS;
将 aisix 替换为实际配置的连接角色。回滚到 1.7.0 或更早版本时仍需要这两个属性,因此在确定不再回滚之前请保留它们。
删除 cp_api_app 角色
控制面不再使用 cp_api_app,但不会删除它,因为该角色属于整个 PostgreSQL 集群,同一集群上的其他控制面数据库可能仍在使用。该角色不能登录。确认集群上没有数据库再使用它之后,如需删除,请以该数据库的 owner 或数据库管理员身份,在该角色拥有授权的每个数据库中执行:
REASSIGN OWNED BY cp_api_app TO aisix;
DROP OWNED BY cp_api_app;
将 aisix 替换为该数据库的 owner。然后删除角色一次:
DROP ROLE cp_api_app;
DROP ROLE 需要超级用户,或具备 CREATEROLE 的角色;在 PostgreSQL 16 及更高版本中,该角色还需持有 cp_api_app 的 ADMIN OPTION。回滚到 1.7.0 或更早版本时,控制面会在启动时重新创建该角色。