將 Agent Sandbox容器版 的 API Key 儲存後端由預設的 Secret 切換為雲資料庫 RDS MySQL,適用於多租戶或 Key 數量較多的生產環境。
背景資訊
ack-sandbox-manager 支援 Secret 和 MySQL 兩種 API Key 儲存後端,由 keyStorage.mode 配置項控制,取值為 secret(預設)或 mysql。Secret 後端在開發測試和 Key 數量較少的情境下已可滿足需求;如果需要在多租戶或 Key 數量較多的生產環境中使用,可切換為 RDS MySQL,此時資料規模不再受單個 Secret 大小限制。
|
對比項 |
Secret(預設) |
MySQL |
|
外部依賴 |
無 |
需要 MySQL 執行個體,並配置 DSN 和 |
|
儲存位置 |
|
外部 MySQL 資料庫。 |
|
Key 儲存形式 |
儲存可恢複的 API Key 原文。 |
僅儲存 |
|
容量 |
受 Kubernetes 單個 Secret 1 MiB 上限約束。 |
不受單個 Secret 大小限制,容量取決於資料庫執行個體。 |
|
讀寫方式 |
每次增刪均更新整個 Secret,記錄增多後讀寫開銷上升。 |
按 Key 雜湊查詢,讀寫開銷相對穩定。 |
|
多副本 |
多個副本共用同一個 Secret。 |
多個副本共用同一個資料庫。 |
|
適用情境 |
開發測試、單租戶或 Key 數量較少的情境。 |
生產環境、多租戶或 Key 數量較多的情境。 |
根據叢集中的 API Key 總數選擇後端:
-
不超過 500 條:可以使用 Secret。
-
501~1000 條:建議規劃遷移至 MySQL。
-
超過 1000 條:應使用 MySQL,避免 Secret 因接近 1 MiB 上限而寫入失敗。
適用範圍
-
已完成 Agent Sandbox容器版 多租戶管理配置,安裝
ack-sandbox-manager(v0.6.7 及以上版本)並啟用 API Key 鑒權。具體操作,請參見多租戶管理。
建立並配置 RDS MySQL 執行個體
API Key 儲存屬於資料量小、以雜湊點查為主的 OLTP(Online Transaction Processing,聯機交易處理)負載。購買 RDS MySQL 執行個體前,可展開下方選型建議規劃執行個體配置。
-
訪問 RDS 購買頁面,建立 RDS MySQL 執行個體。建議選擇與 ACS 叢集相同的地區和 VPC,並參考上方選型建議配置執行個體。
-
建立資料庫和帳號。在 RDS 執行個體的資料庫管理和帳號管理頁面中完成以下操作。具體操作,請參見建立帳號。
-
建立一個資料庫,例如
e2b。 -
建立一個普通資料庫帳號,並記錄帳號名和密碼。
-
授予該帳號對目標資料庫的讀寫(DDL+DML)許可權。
-
-
配置 IP 白名單。
sandbox-manager等控制面組件的訪問流量從控制面交換器發出,因此需要將控制面交換器網段加入 RDS 白名單。-
登入Agent Sandbox控制台,在左側導覽列選擇,確認目的地組群。後續操作需在容器計算服務控制台完成。
-
登入容器計算服務控制台,進入目的地組群的基本資料頁面。
-
在網路區塊,單擊控制面交換器右側的編輯,複製所有勾選狀態的交換器的CIDR(網段)。
-
登入 RDS 管理主控台,進入目標執行個體的白名單與安全性群組頁面。
-
修改
default白名單分組,將控制面交換器的 IPv4 網段添加到組內白名單。
-
-
在 RDS 執行個體的資料庫連接頁面中,記錄內網地址和內網連接埠,例如:
rm-******************.mysql.rds.aliyuncs.com:3306 -
手動初始化表結構。執行 OpenKruise 社區提供的 mysql-schema.sql 指令碼初始化資料庫表結構:
mysql -h <RDS內網地址> \ -P <連接埠> \ -u <資料庫帳號> \ -p \ <資料庫名> < mysql-schema.sql該指令碼會建立
teams和team_api_keys表,並初始化內建的adminTeam。admin API Key 的雜湊無需遷移,ack-sandbox-manager啟動時會根據當前hashPepper自動計算並寫入team_api_keys。
配置 MySQL 儲存後端
-
登入Agent Sandbox控制台,在左側導覽列選擇,確認目的地組群。後續操作需在容器計算服務控制台完成。
-
登入容器計算服務控制台,進入目的地組群。
-
在組件管理頁面找到
ack-sandbox-manager,單擊配置。 -
配置以下參數:
配置項
配置值或說明
keyStorage.mode設定為
mysql。keyStorage.mysql.dsnMySQL 資料來源名稱(Data Source Name,DSN),描述串連目標資料庫的帳號、密碼、地址、連接埠及串連參數,格式見下方樣本。
keyStorage.mysql.hashPepper用於計算 API Key 雜湊的長期密鑰。
-
按以下格式填寫 DSN:
<帳號>:<密碼>@tcp(<RDS內網地址>:<連接埠>)/<資料庫名>?charset=utf8mb4&parseTime=true&loc=Local樣本:
e2b_user:********@tcp(rm-******************.mysql.rds.aliyuncs.com:3306)/e2b?charset=utf8mb4&parseTime=true&loc=Local使用以下命令產生一個 32 位元組(256 bit)的隨機字串作為
hashPepper。openssl rand -hex 32命令輸出為 64 個十六進位字元,直接作為
keyStorage.mysql.hashPepper的取值。重要請長期、安全地儲存
hashPepper,不要將其與資料庫密碼設定為相同的值。更換該值後,現有租戶 API Key 將無法通過鑒權,需要重新簽發。 -
儲存配置。
ack-sandbox-manager將自動重啟並串連 RDS MySQL。當
keyStorage.mode設定為mysql時,如果未配置 DSN 或hashPepper,組件將啟動失敗。
驗證配置
-
確認
ack-sandbox-managerPod 正常運行:kubectl get pods -n sandbox-system -l component=sandbox-manager預期輸出:
NAME READY STATUS RESTARTS AGE sandbox-manager-79b7449778-xxx 2/2 Running 0 78m sandbox-manager-79b7449778-yyy 2/2 Running 0 79m sandbox-manager-79b7449778-zzz 2/2 Running 0 78m -
建立、查詢並刪除一個臨時 API Key,以驗證 MySQL 後端可正常讀寫。執行前請根據實際環境替換以下變數:
-
BASE_URL:ack-sandbox-gateway對外訪問地址。 -
ADMIN_KEY:ack-sandbox-manager配置的 admin API Key。
以下指令碼依賴 jq(命令列 JSON 處理器)解析響應,執行前請確認本地已安裝。
BASE_URL="https://api.your.domain.com" ADMIN_KEY="your-admin-key" TEST_KEY_ID=$( curl -fsS -X POST \ -H "X-API-KEY: ${ADMIN_KEY}" \ -H "Content-Type: application/json" \ -d '{"name":"mysql-storage-verification"}' \ "${BASE_URL}/api-keys" | jq -r '.id' ) echo "Created: ${TEST_KEY_ID}" curl -fsS \ -H "X-API-KEY: ${ADMIN_KEY}" \ "${BASE_URL}/api-keys" | jq -e --arg id "${TEST_KEY_ID}" \ 'any(.[]; .id == $id)' >/dev/null && echo "Query OK" curl -fsS -X DELETE \ -H "X-API-KEY: ${ADMIN_KEY}" \ "${BASE_URL}/api-keys/${TEST_KEY_ID}" && echo "Deleted: ${TEST_KEY_ID}"預期輸出:
Created: 4f2ab49a-aced-4830-b5da-5d382xxxxxxx Query OK Deleted: 4f2ab49a-aced-4830-b5da-5d382xxxxxxx -
遷移已有 API Key(可選)
切換到 MySQL 後端後,如果原 Secret 後端中已有 API Key 需要在新後端繼續使用,可以使用 OpenKruise 社區提供的 migrate_secret_keys_to_mysql.py 指令碼產生 MySQL 遷移 SQL。遷移指令碼會:
-
通過
kubectl讀取e2b-key-storeSecret。 -
使用與
keyStorage.mysql.hashPepper相同的值計算 API Key 的 HMAC-SHA256 雜湊。 -
產生建表 DDL,以及 Team 和 API Key 的 Upsert 語句。
-
保留原有 Team、Key 名稱、建立資訊和配額配置。
遷移開始後,請暫停調用 POST /api-keys 和 DELETE /api-keys/{id},直至完成資料匯入,避免遷移期間產生的資料變更丟失。
-
校正 Secret 資料:
python3 migrate_secret_keys_to_mysql.py \ --namespace sandbox-system \ --dry-run該命令會解析 Secret 中的所有條目,校正
id、name、key等欄位的合法性,檢查 Team 中繼資料是否一致以及原始 Key 是否唯一,任何一項不通過都會中止遷移,避免產生不完整的 SQL。 -
通過隱藏輸入設定
hashPepper(值必須與已配置的keyStorage.mysql.hashPepper完全一致),並產生遷移 SQL:read -rsp "請輸入 hashPepper: " E2B_KEY_HASH_PEPPER echo export E2B_KEY_HASH_PEPPER python3 migrate_secret_keys_to_mysql.py \ --namespace sandbox-system \ --output e2b_key_migration.sql -
將遷移 SQL 匯入 RDS MySQL:
mysql -h <RDS內網地址> \ -P <連接埠> \ -u <資料庫帳號> \ -p \ <資料庫名> < e2b_key_migration.sql -
清理環境變數和遷移檔案:
unset E2B_KEY_HASH_PEPPER rm -f e2b_key_migration.sql
產生 SQL 時使用的 hashPepper 必須與已配置的 keyStorage.mysql.hashPepper 完全一致,否則遷移後的 API Key 無法通過鑒權。