title: 升级指南 keywords:
APISIX 的版本号遵循语义化版本。
升级到 APISIX 3.0.0 是一个重大的版本升级,我们建议您先升级到 2.15.x,然后再升级到 3.0.0。
在升级之前,请查看 3.0.0-beta 和 3.0.0 中的 Change 部分,以了解 3.0.0 版本的不兼容的修改与重大更新。
基于 alpine 的镜像已不再支持,如果你使用了 alpine 的镜像,那么你需要将镜像替换为基于 debian/centos 的镜像。
目前,我们提供了:
3.0.0 对部署模式进行了重大更新,具体如下:
traditional
模式,并且更新配置文件,具体可参考 Traditional如果你使用提供的二进制包(Debian 和 RHEL)或者镜像,则它们已经捆绑了 APISIX 所有必要的依赖项,你可以跳过本节。
APISIX 的一些特性需要在 OpenResty 中引入额外的 NGINX 模块。如果要使用这些功能,你需要构建一个自定义的 OpenResty 发行版(APISIX-Runtime)。你可以参考 api7/apisix-build-tools 中的代码,构建自己的 APISIX-Runtime 环境。
如果你希望 APISIX 运行在原生的 OpenResty 上,这种情况下将只支持运行在 OpenResty 1.19.3.2 及以上的版本。
APISIX 的配置方式是用自定义的 conf/config.yaml
中的内容覆盖默认的 conf/config-default.yaml
,如果某个配置项在 conf/config.yaml
中不存在,那么就使用 conf/config-default.yaml
中的配置。在 3.0.0 中,我们调整了 conf/config-default.yaml
配置文件中的部分细节,具体内容如下。
从 2.15.x 到 3.0.0 版本,在 conf/config-default.yaml
有一些配置项的位置被移动了。如果你使用了这些配置项,那么你需要将它们移动到新的位置。
调整内容:
config_center
功能改由 deployment
中的 config_provider
实现etcd
字段整体迁移到 deployment
中deployment
中的 admin
字段你可以在 conf/config-default.yaml
中找到这些配置的新的确切位置。
某些配置在 3.0.0 中被移除了,并被新的配置项替代。如果你使用了这些配置项,那么你需要将它们更新为新的配置项。
调整内容:
apisix.ssl.enable_http2
和 apisix.ssl.listen_port
,使用 apisix.ssl.listen
替代。如果在 conf/config.yaml
中有这样的配置:
ssl: enable_http2: true listen_port: 9443
则在 3.0.0 版本中需要转换成如下所示:
ssl: listen: - port: 9443 enable_http2: true
nginx_config.http.lua_shared_dicts
,用 nginx_config.http.custom_lua_shared_dict
替代,这个配置用于声明自定义插件的共享内存。如果在 conf/config.yaml
中有这样的配置:
nginx_config: http: lua_shared_dicts: my_dict: 1m
则在 3.0.0 版本中需要转换成如下所示:
nginx_config: http: custom_lua_shared_dict: my_dict: 1m
etcd.health_check_retry
,用 deployment.etcd.startup_retry
替代,这个配置用于在启动时,重试连接 etcd 的次数。如果在 conf/config.yaml
中有这样的配置:
etcd: health_check_retry: 2
则在 3.0.0 版本中需要转换成如下所示:
deployment: etcd: startup_retry: 2
apisix.port_admin
,用 deployment.apisix.admin_listen
替代。如果在 conf/config.yaml
中有这样的配置:
apisix: port_admin: 9180
则在 3.0.0 中需要转换成如下所示:
deployment: apisix: admin_listen: ip: 127.0.0.1 # 替换成实际暴露的 IP port: 9180
enable_cpu_affinity
的默认值为 false
。主要是因为越来越多的用户通过容器部署 APISIX,由于 Nginx 的 worker_cpu_affinity 不计入 cgroup,默认启用 worker_cpu_affinity 会影响 APISIX 的行为,例如多个实例会被绑定到一个 CPU 上。为了避免这个问题,我们在 conf/config-default.yaml
中默认禁用 enable_cpu_affinity
选项。apisix.real_ip_header
,用 nginx_config.http.real_ip_header
替代如果你需要备份与恢复数据,可以利用 ETCD 的备份与恢复功能,参考 etcdctl snapshot。
在 3.0.0 中,我们调整了部分数据结构,这些调整影响到 APISIX 的路由、上游、插件等数据。3.0.0 版本与 2.15.x 版本之间数据不完全兼容。因此,你无法使用 3.0.0 版本的 APISIX 直接连接到 2.15.x 版本 APISIX 使用的 ETCD 集群。
为了保持数据兼容,有两种方式,仅供参考:
数据层面调整内容如下。
disable
移动到 _meta
中。disable
表示该插件的启用/禁用状态,如果在 ETCD 中存在这样的数据结构:
{ "plugins":{ "limit-count":{ ... // 插件配置 "disable":true } } }
则在 3.0.0 版本中,这个插件的数据结构应该变成如下所示:
{ "plugins":{ "limit-count":{ ... // 插件配置 "_meta":{ "disable":true } } } }
注意:disable
是插件的元配置,该调整对所有插件配置生效,不仅仅是 limit-count
插件。
service_protocol
字段,使用 upstream.scheme
替代。如果在 ETCD 中存在这样的数据结构:
{ "uri":"/hello", "service_protocol":"grpc", "upstream":{ "type":"roundrobin", "nodes":{ "127.0.0.1:1980":1 } } }
则在 3.0.0 版本中,这个路由的数据结构应该变成如下所示:
{ "uri":"/hello", "upstream":{ "type":"roundrobin", "scheme":"grpc", "nodes":{ "127.0.0.1:1980":1 } } }
authz-keycloak
插件中的 audience
字段,使用 client_id
替代。如果在 ETCD 中 authz-keycloak
的插件配置存在这样的数据结构:
{ "plugins":{ "authz-keycloak":{ ... // 插件配置 "audience":"Client ID" } } }
则在 3.0.0 中,这个路由的数据结构应该变成如下所示:
{ "plugins":{ "authz-keycloak":{ ... // 插件配置 "client_id":"Client ID" } } }
mqtt-proxy
插件中的 upstream
,在插件外部配置 upstream
,并在插件中引用。如果在 ETCD 中 mqtt-proxy
的插件配置存在这样的数据结构:
{ "remote_addr":"127.0.0.1", "plugins":{ "mqtt-proxy":{ "protocol_name":"MQTT", "protocol_level":4, "upstream":{ "ip":"127.0.0.1", "port":1980 } } } }
则在 3.0.0 版本中,这个插件的数据结构应该变成如下所示:
{ "remote_addr":"127.0.0.1", "plugins":{ "mqtt-proxy":{ "protocol_name":"MQTT", "protocol_level":4 } }, "upstream":{ "type":"chash", "key":"mqtt_client_id", "nodes":[ { "host":"127.0.0.1", "port":1980, "weight":1 } ] } }
syslog
插件中的 max_retry_times
和 retry_interval
字段,使用 max_retry_count
和 retry_delay
替代。如果在 ETCD 中 syslog
的插件配置存在这样的数据结构:
{ "plugins":{ "syslog":{ "max_retry_times":1, "retry_interval":1, ... // 其他配置 } } }
则在 3.0.0 版本中,这个插件的数据结构应该变成如下所示:
{ "plugins":{ "syslog":{ "max_retry_count":1, "retry_delay":1, ... // 其他配置 } } }
proxy-rewrite
插件中的 scheme
字段,在配置上游时,用 upstream.scheme
替代。如果在 ETCD 中 proxy-rewrite
的插件配置存在这样的数据结构:
{ "plugins":{ "proxy-rewrite":{ "scheme":"https", ... // 其他配置 } }, "upstream":{ "nodes":{ "127.0.0.1:1983":1 }, "type":"roundrobin" }, "uri":"/hello" }
则在 3.0.0 版本中,这个插件的数据结构应该变成如下所示:
{ "plugins":{ "proxy-rewrite":{ ... // 其他配置 } }, "upstream":{ "scheme":"https", "nodes":{ "127.0.0.1:1983":1 }, "type":"roundrobin" }, "uri":"/hello" }
在 3.0.0 版本中,我们对 Admin API 也进行了一些调整。使得 Admin API 更加易用,更加符合 RESTful 的设计理念,具体调整内容如下。
count
、action
和 node
字段,并将 node
中的内容提升到响应体的根节点。在 2.x 版本中,通过 Admin API 查询 /apisix/admin/routes/1
的响应格式是这样的:
{ "count":1, "action":"get", "node":{ "key":"\/apisix\/routes\/1", "value":{ ... // 配置内容 } } }
在 3.0.0 版本中,通过 Admin API 查询 /apisix/admin/routes/1
资源的响应格式调整为如下所示:
{ "key":"\/apisix\/routes\/1", "value":{ ... // 配置内容 } }
dir
字段,新增 list
字段,存放列表资源的数据;新增 total
字段,存放列表资源的总数。在 2.x 版本中,通过 Admin API 查询 /apisix/admin/routes
的响应格式是这样的:
{ "action":"get", "count":2, "node":{ "key":"\/apisix\/routes", "nodes":[ { "key":"\/apisix\/routes\/1", "value":{ ... // 配置内容 } }, { "key":"\/apisix\/routes\/2", "value":{ ... // 配置内容 } } ], "dir":true } }
在 3.0.0 版本中,通过 Admin API 查询 /apisix/admin/routes
资源的响应格式调整为如下所示:
{ "list":[ { "key":"\/apisix\/routes\/1", "value":{ ... // 配置内容 } }, { "key":"\/apisix\/routes\/2", "value":{ ... // 配置内容 } } ], "total":2 }
/apisix/admin/ssl/{id}
调整为 /apisix/admin/ssls/{id}
。在 2.x 版本中,通过 Admin API 操作 ssl 资源是这样的:
curl -i http://{apisix_listen_address}/apisix/admin/ssl/{id}
在 3.0.0 版本中,通过 Admin API 操作 ssl 资源调整为如下所示:
curl -i http://{apisix_listen_address}/apisix/admin/ssls/{id}
/apisix/admin/proto/{id}
调整为 /apisix/admin/protos/{id}
。在 2.x 版本中,通过 Admin API 操作 proto 资源是这样的:
curl -i http://{apisix_listen_address}/apisix/admin/proto/{id}
在 3.0.0 版本中,通过 Admin API 操作 proto 资源调整为如下所示:
curl -i http://{apisix_listen_address}/apisix/admin/protos/{id}
除以上内容外,我们也将 Admin API 的端口调整为 9180。
Apache APISIX 3.0.0 版本的发布,将产品的更多细节迭代了一大步。由于大版本的更新迭代会导致一些配置与数据也相应进行调整,为此我们为您整理了这份 APISIX 升级指南。希望对各位在使用 APISIX 的过程中,对于版本的更新操作也更得心应手。
如果您有任何问题或意见,欢迎随时在社区进行交流。