時隔一個月,新版本又來了。這次的 APISIX 3.1.0 是 3.0 大版本以來的第一個新版本,在 3.x 的新時代里,我們一如既往地在每個版本中給大家奉上更多的新功能。

此次發布的 3.1.0 版本,添加了對插件配置的加密存儲和存儲在外部安全服務的支持,著重于讓用戶能夠更安全、更放心地使用他們的配置。在這之外,我們還引入了許多新的特性,旨在優化對 APISIX 的使用體驗。

新特性:插件配置的加密存儲


(資料圖片)

新版本支持將插件的特定字段加密保存到 etcd 中。

在之前的版本中,APISIX 提供了一個key_encrypt_salt的配置項,支持對 etcd 里面存儲的 SSL key 進行加密,避免明文存儲私鑰數據。畢竟像私鑰這樣的敏感數據,少一個地方存儲明文,就能多一份安心。那么對于其他同樣敏感的配置,比如jwt-auth插件中的 secret,我們能不能也加密起來,避免在 etcd 里面存儲明文呢?

3.1 版本中就把加密存儲的功能拓展到其他字段上。有了這個功能,我們可以在某個特定的插件上指定需要加密的字段,然后在config.yaml文件中開啟加密,即可避免明文存儲。

舉個例子,我們給jwt-auth插件新增了如下的標記:

encrypt_fields = {"secret", "private_key"},

當我們在config.yaml里開啟了字段的加密功能:

apisix: data_encryption: enable: true keyring: - edd1c9f0985e76a2

那么寫入到 etcd 的jwt-auth插件的配置中的 secret 和 private_key,就會被加密存儲。通過etcdctl get --prefix /看到的配置,會是諸如 “"secret":"77+NmbYqNfN+oL..."” 這樣的數據,而不是原始的配置信息。

新特性:將敏感信息存儲在外部安全服務

除了可以將敏感信息加密存儲在 etcd 之外,還可以選擇從別的系統中動態獲取敏感信息,而不再要求敏感信息必須存儲在 APISIX 的配置存儲(如 etcd)中。

在 3.1 版本中,我們上線了名為 APISIX Secret 的功能。APISIX Secret 允許用戶在 APISIX 中通過一些密鑰管理服務(Vault 等)來存儲 secret,在使用的時候根據 key 進行讀取,確保 secret 在整個平臺中不以明文的形式存在。

APISIX 目前支持通過以下方式存儲 secret:

環境變量HashiCorp Vault

相關示例

以key-auth插件為例,我們來簡單示范下如何使用該特性。

基于環境變量的敏感信息存儲

第一步:APISIX 實例啟動前創建環境變量

export JACK_AUTH_KEY=abc

第二步:在key-auth插件中引用環境變量

curl http://127.0.0.1:9180/apisix/admin/consumers \\-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d "{ "username": "jack", "plugins": { "key-auth": { "key": "$ENV://JACK_AUTH_KEY" } }}"

通過以上步驟,可以將key-auth插件中的 key 配置保存在環境變量中,而不是在配置插件時明文顯示。

基于 Vault 的敏感信息存儲

第一步:在 Vault 中創建對應的配置,可以使用如下命令:

vault kv put apisix/jack auth-key=value

第二步:通過 Admin API 添加 Secret 資源,配置 Vault 的地址等連接信息:

curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1 \\-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d "{ "uri": "https://127.0.0.1:8200", "prefix": "apisix", "token": "root"}"

第三步:在key-auth插件中引用 APISIX Secret 資源,填充配置在 Vault 中的位置:

curl http://127.0.0.1:9180/apisix/admin/consumers \\-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d "{ "username": "jack", "plugins": { "key-auth": { "key": "$secret://vault/1/jack/auth-key" } }}"

通過以上步驟,可以將key-auth插件中的 key 配置保存在 Vault 中,而不是在配置插件時明文顯示。

新特性:實驗性基于 gRPC 的 etcd 配置同步

在本次新版本中,我們還引入了實驗性的基于 gRPC 的 etcd 配置同步。當前 APISIX 同步 etcd 的配置,是基于 HTTP long pulling,這就要求 etcd 開啟 gRPC-gateway (所幸的是默認就是開啟的)。

在實踐過程中,我們遇到了 etcd 的 HTTP API 出現問題,也許是因為通過 HTTP 同步配置并非 etcd 的主流使用方式,所以會更容易遇到 bug。通過把 etcd 配置同步由 HTTP long pulling 切換到 gRPC 上面來,APISIX 實現了同步方式與主流接軌。

另外由于 gRPC 本身提供了多路復用的支持,改用 gRPC 同步配置能大幅降低 APISIX 到 etcd 的連接數。當前 APISIX 同步每一類配置都要有獨立的 HTTP 連接,切換到 gRPC 后每個進程只有一條用于配置同步的連接(如果開啟了 L4 代理,那么是兩條)。

啟用實驗性的基于 gRPC 的配置同步,需要在配置文件config.yaml中設置use_grpc: true,如下所示:

etcd: use_grpc: true timeout: 3600 host: - "http://127.0.0.1:2379" prefix: "/apisix"

新特性:基于 Consul 的服務發現

在 APISIX 之前的版本里,有熱心的貢獻者提供了基于 Consul KV 的服務發現實現。不過 Consul KV 跟 Consul 自身的服務發現功能有些不同,Consul 自身的服務發現支持額外的一些功能,比如對注冊服務的健康檢查,所以在使用上會更為廣泛些。本次 3.1 版本中,另一位熱心貢獻者提供了基于 Consul 的服務發現,填補了這一空缺。

基于 Consul 的服務發現和之前版本里基于 Consul KV 的服務發現有著相似的配置。首先,需要在config.yaml文件中啟用該服務發現:

discovery: consul: servers: - "http://127.0.0.1:8500"

然后在具體的 upstream 中配置對應的service_name和discovery_type:

curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -i -d "{ "service_name": "service_a", "discovery_type": "consul"}"

對應的 upstream 在使用過程中,就會根據 Consul 里面配置的值去得到真正的上游節點。

新特性:內置的調試插件

工欲善其事,必先利其器,調試是程序員日常工作的一部分。作為注重調試體驗的網關,APISIX 在 3.1 版本中以插件的形式內置了一個 Lua 調試器插件,支持動態設置斷點、添加回調等等。

默認的配置如下:

plugins: ... - inspect ...plugin_attr: inspect: delay: 3 hooks_file: "/usr/local/apisix/plugin_inspect_hooks.lua"

APISIX 在啟動后,會定期查看配置的 hooks_file (這里是 "/usr/local/apisix/plugin_inspect_hooks.lua"),如果文件中有內容,就會根據里面的內容設置斷點和回調。比如下方內容會給 limit-req.lua 的 88 行上設置一個斷點,并在該斷點上注冊了回調函數function(info) ... end。

local dbg = require "apisix.inspect.dbg"dbg.set_hook("limit-req.lua", 88, require("apisix.plugins.limit-req").access, function(info) ngx.log(ngx.INFO, debug.traceback("foo traceback", 3)) return trueend)

新功能:優化以及更多小功能

除了上面提到的幾個大的功能外,此次發布也包含許多值得述說的改動,比如:

優化 Prometheus 指標采集的資源占用

支持在 L4 的代理中,配置域名作為上游 如果你對新版本的完整更新細節感興趣,請參考 3.1.0 發布的 changelog:https://github.com/apache/apisix/blob/release/3.1/docs/zh/latest/CHANGELOG.md#310

標簽: Apache,Apache APISIX,攻略,教程