打開鏈接即可點亮社區Star,照亮技術的前進之路。
Github 地址:https://github.com/secretflow/kuscia
前言
本教程幫助您在多台機器上使用 點對點組網模式 來部署 Kuscia 集羣。
當前 Kuscia 節點之間只支持 Token 的身份認證方式,在跨機器部署的場景下流程較為繁瑣,後續本教程會持續更新優化。
前置準備
在部署 Kuscia 之前,請確保環境準備齊全,包括所有必要的軟件、資源、操作系統版本和網絡環境等滿足要求,以確保部署過程順暢進行,詳情參考部署要求。
部署流程(基於 TOKEN 認證)
部署 alice 節點
登錄到安裝 alice 的機器上,本文為敍述方便,假定節點 ID 為 alice ,對外可訪問的 PORT 是 11080 。
指定 Kuscia 使用的鏡像版本,這裏使用 1.1.0b0 版本
export KUSCIA_IMAGE=secretflow-registry.cn-hangzhou.cr.aliyuncs.com/secretflow/kuscia:1.1.0b0
指定 Secretflow 版本:
# Using Secretflow image, version 1.11.0b1 is used here
export SECRETFLOW_IMAGE=secretflow-registry.cn-hangzhou.cr.aliyuncs.com/secretflow/secretflow-lite-anolis8:1.11.0b1
獲取部署腳本,部署腳本會下載到當前目錄:
docker pull ${KUSCIA_IMAGE} && docker run --rm ${KUSCIA_IMAGE} cat /home/kuscia/scripts/deploy/kuscia.sh > kuscia.sh && chmod u+x kuscia.sh
生成 alice 節點配置文件,kuscia init 參數請參考 Kuscia 配置文件:
# The --domain parameter specifies the node ID
docker run -it --rm ${KUSCIA_IMAGE} kuscia init --mode autonomy --domain "alice" > autonomy_alice.yaml 2>&1 || cat autonomy_alice.yaml
建議檢查生成的文件,避免配置文件錯誤導致的部署啓動問題。
啓動節點,默認會在當前目錄下創建 ${USER}-kuscia-autonomy-alice/data 目錄用來存放 alice 的數據。部署節點需要使用 kuscia.sh 腳本並傳入節點配置文件:
# -p: Specifies the mapping of the HTTPS port from the node container to the host. Ensure this port does not conflict with existing ports on the host.
# -k: Specifies the mapping of the MTLS port for the Kuscia API from the node container to the host. Ensure this port does not conflict with existing ports on the host.
# -a: Specifies auto-import of engine images. Use -a none to disable auto-import. Use -a secretflow (default) to auto-import the SecretFlow engine image.
# -m or --memory-limit: Sets appropriate memory limits for node containers. For example, '-m 4GiB or --memory-limit=4GiB' means limiting max memory to 4GiB, '-m -1 or --memory-limit=-1' means no limit. If not set, defaults are: master 2GiB, lite node 4GiB, autonomy node 6GiB.
./kuscia.sh start -c autonomy_alice.yaml -p 11080 -k 11081
:::{tip}
- 節點 ID 需要全局唯一併且符合 RFC 1123 標籤名規則要求,詳情請參考這裏。
default、kube-system、kube-public、kube-node-lease、master以及cross-domain為 Kuscia 預定義的節點 ID,不能被使用。 - 目前 kuscia.sh 腳本僅支持導入 SecretFlow 鏡像,scql、serving 以及其他自定義鏡像請移步至註冊自定義算法鏡像
- 如果節點之間的入口網絡存在網關時,為了確保節點與節點之間通信正常,需要網關符合一些要求,詳情請參考這裏
- alice、bob 節點默認使用 SQLite 作為存儲,如果生產部署,需要配置鏈接到 MySQL 數據庫的連接串,具體配置可以參考這裏
- 需要對合作方暴露的 Kuscia 端口,可參考 Kuscia 端口介紹。如果多個 Autonomy 節點部署在同一個物理機上,可以用 -p -k -g -q -x 參數指定下端口號(例如:./kuscia.sh start -c autonomy_alice.yaml -p 11080 -k 11081 -g 11082 -q 11083 -x 11084),防止出現端口衝突。
- 非 root 用户部署請參考這裏
- 升級引擎鏡像請參考指南
:::
部署 Bob 節點
您可以選擇在另一台機器上部署 bob 節點,詳細步驟參考上述 alice 節點部署的流程,唯一不同的是在部署前準備參數時配置 bob 節點相關的參數。假定節點 ID 為 bob ,對外可訪問的 PORT 是 21080 。
配置證書
在兩個 Autonomy 節點建立通信之前,您需要先給這兩個節點互換證書。
Alice 頒發證書給 Bob
準備 Alice 的公鑰,在 Alice 節點的機器上,可以看到包含公鑰的 crt 文件:
# [alice machine] Copy domain.crt from inside the container and rename it to alice.domain.crt
docker cp ${USER}-kuscia-autonomy-alice:/home/kuscia/var/certs/domain.crt alice.domain.crt
將 alice 的公鑰 alice.domain.crt 拷貝到 bob 容器的 /home/kuscia/var/certs/ 目錄中:
# [bob machine] Make sure alice.domain.crt is in the /home/kuscia/var/certs/ directory of bob container
docker cp alice.domain.crt ${USER}-kuscia-autonomy-bob:/home/kuscia/var/certs/
在 Bob 裏添加 Alice 的證書等信息:
# [bob machine] Add alice's certificate and other information
docker exec -it ${USER}-kuscia-autonomy-bob scripts/deploy/add_domain.sh alice p2p
Bob 頒發證書給 Alice
準備 Bob 的公鑰,在 Bob 節點的機器上,可以看到包含公鑰的 crt 文件:
# [bob machine] Copy domain.crt from inside the container and rename it to bob.domain.crt
docker cp ${USER}-kuscia-autonomy-bob:/home/kuscia/var/certs/domain.crt bob.domain.crt
將 Bob 的公鑰 bob.domain.crt 拷貝到 alice 容器的 /home/kuscia/var/certs/ 目錄中:
# [alice machine] Make sure bob.domain.crt is in the /home/kuscia/var/certs/ directory of alice container
docker cp bob.domain.crt ${USER}-kuscia-autonomy-alice:/home/kuscia/var/certs/
在 Alice 裏添加 Bob 的證書等信息:
# [alice machine] Add bob's certificate and other information
docker exec -it ${USER}-kuscia-autonomy-alice scripts/deploy/add_domain.sh bob p2p
配置授權
如果要發起由兩個 Autonomy 節點參與的任務,您需要給這兩個節點之間建立授權。
創建 Alice 到 Bob 的授權
# [alice machine]
# Assuming bob's external IP is 2.2.2.2, 21080 is bob's exposed access port mentioned above
# To reduce troubleshooting costs for authorization errors, it's recommended to test connectivity to bob's address from within the alice container (using curl) before authorizing
# Example: curl -kvvv https://2.2.2.2:21080 should return HTTP error code 401 normally
docker exec -it ${USER}-kuscia-autonomy-alice scripts/deploy/join_to_host.sh alice bob https://2.2.2.2:21080
創建 Bob 到 Alice 的授權
# [bob machine]
# Assuming alice's external IP is 1.1.1.1, 11080 is alice's exposed access port mentioned above
# To reduce troubleshooting costs for authorization errors, it's recommended to test connectivity to alice's address from within the bob container (using curl) before authorizing
# Example: curl -kvvv https://1.1.1.1:11080 should return HTTP error code 401 normally
docker exec -it ${USER}-kuscia-autonomy-bob scripts/deploy/join_to_host.sh bob alice https://1.1.1.1:11080
檢查節點之間網絡通信狀態
-
方法一:
[Alice 機器] 執行以下命令:
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get cdr alice-bob[Bob 機器] 執行以下命令:
docker exec -it ${USER}-kuscia-autonomy-bob kubectl get cdr bob-alice
當 "READR" 列為 "True" 時,説明 Alice 和 Bob 之間授權建立成功。
-
方法二:
[alice 機器] 執行以下命令:
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get cdr alice-bob -o=jsonpath="{.status.tokenStatus.sourceTokens[*]}"[bob 機器] 執行以下命令:
docker exec -it ${USER}-kuscia-autonomy-bob kubectl get cdr bob-alice -o=jsonpath="{.status.tokenStatus.sourceTokens[*]}"
當命令執行成功得到返回結果時表示授權成功
:::{tip}
- 如果節點之間的入口網絡存在網關時,為了確保節點與節點之間通信正常,需要網關符合一些要求,詳情請參考這裏
- 授權失敗,請參考授權錯誤排查文檔
:::
準備測試數據
-
Alice 節點準備測試數據
登錄到安裝 Alice 的機器上,將默認的測試數據拷貝到之前部署目錄的 ${USER}-kuscia-autonomy-alice/data 下
docker pull ${KUSCIA_IMAGE} && docker run --rm ${KUSCIA_IMAGE} cat /home/kuscia/var/storage/data/alice.csv > /tmp/alice.csv docker cp /tmp/alice.csv ${USER}-kuscia-autonomy-alice:/home/kuscia/var/storage/data/ rm -rf /tmp/alice.csv為 Alice 的測試數據創建 domaindata
docker exec -it ${USER}-kuscia-autonomy-alice scripts/deploy/create_domaindata_alice_table.sh alice為 Alice 的測試數據創建 domaindatagrant
docker exec -it ${USER}-kuscia-autonomy-alice curl -X POST 'https://127.0.0.1:8082/api/v1/domaindatagrant/create' --header "Token: $(docker exec -it ${USER}-kuscia-autonomy-alice cat /home/kuscia/var/certs/token)" --header 'Content-Type: application/json' -d '{ "grant_domain": "bob", "description": {"domaindatagrant":"alice-bob"}, "domain_id": "alice", "domaindata_id": "alice-table" }' --cacert /home/kuscia/var/certs/ca.crt --cert /home/kuscia/var/certs/ca.crt --key /home/kuscia/var/certs/ca.key -
Bob 節點準備測試數據
登錄到安裝 Bob 的機器上,將默認的測試數據拷貝到之前部署目錄的 ${USER}-kuscia-autonomy-alice/data 下
docker pull ${KUSCIA_IMAGE} && docker run --rm ${KUSCIA_IMAGE} cat /home/kuscia/var/storage/data/bob.csv > /tmp/bob.csv docker cp /tmp/bob.csv ${USER}-kuscia-autonomy-bob:/home/kuscia/var/storage/data/ rm -rf /tmp/bob.csv為 Bob 的測試數據創建 domaindata
docker exec -it ${USER}-kuscia-autonomy-bob scripts/deploy/create_domaindata_bob_table.sh bob為 Bob 的測試數據創建 domaindatagrant
docker exec -it ${USER}-kuscia-autonomy-bob curl -X POST 'https://127.0.0.1:8082/api/v1/domaindatagrant/create' --header "Token: $(docker exec -it ${USER}-kuscia-autonomy-bob cat /home/kuscia/var/certs/token)" --header 'Content-Type: application/json' -d '{ "grant_domain": "alice", "description": {"domaindatagrant":"bob-alice"}, "domain_id": "bob", "domaindata_id": "bob-table" }' --cacert /home/kuscia/var/certs/ca.crt --cert /home/kuscia/var/certs/ca.crt --key /home/kuscia/var/certs/ca.key
執行作業
創建並啓動作業(兩方 PSI 任務), 以 Alice 節點機器上執行命令為例
docker exec -it ${USER}-kuscia-autonomy-alice scripts/user/create_example_job.sh
查看作業狀態
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get kj -n cross-domain
任務運行遇到網絡錯誤時,可以參考這裏排查