# 可信计算服务安装部署 ## 概述 数据要素流通平台基于k3s环境部署,提供了一键部署脚本和yaml文件,用户可以根据自己的需求,选择部署对应的服务, 可根据实际情况调整适配yaml文件。 ## 环境依赖 ### 硬件要求 | 配置 | 最低配置 | 推荐配置 | | ---- | -------- | -------- | | CPU | 1.5GHz | 2.4GHz | | 内存 | 16GB | 64GB | | 核心 | 8核 | 16核 | | 带宽 | 20Mb | 40Mb | ### 软件依赖 | 名称 | 版本 | 描述 | 是否必须 | | -------------- | -------- | ---------------------------------------------------- | -------- | | docker | 24+ | 运行核心组件及服务 | 是 | | docker-compose | v2.24.6+ | 本地部署长安链服务 | 否 | | k3s | v1.28.2+ | 与 Kubernetes 集群进行交互和管理,管理核心组件及服务 | 是 | | helm | v3.14.0+ | 管理 Kubernetes 应用部署的包,管理服务任务 | 是 | ## 基础环境安装 ### 安装docker 参考官网:https://docs.docker.com/engine/install/ 安装完成后,执行以下命令进行验证: ```shell ➜ ~ docker version Client: Version: 24.0.6-rd API version: 1.43 Go version: go1.20.7 Git commit: da4c87c Built: Wed Sep 6 16:39:20 2023 OS/Arch: darwin/amd64 Context: desktop-linux Server: Docker Desktop 4.27.1 (136059) Engine: Version: 25.0.2 API version: 1.44 (minimum version 1.24) Go version: go1.21.6 Git commit: fce6e0c Built: Thu Feb 1 00:23:17 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.28 GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0 ``` [//]: # (### 2.2 docker registry部署) ### k3s集群部署 > 注:安装K3S前需要先完成Docker安装 #### 使用脚本安装 下面以 `Linux`为例进行安装, 使用K3S安装脚本进行安装,具体步骤如下: ```shell #1. 下载K3S安装脚本和依赖包 ➜ ~ wget -c "https://get.k3s.io" -O install.sh ➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s" ➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s-airgap-images-amd64.tar.gz" ➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s-images.txt" ➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/sha256sum-amd64.txt" # 2. 设置K3S配置文件 ➜ ~ mkdir -p /etc/rancher/k3s/ ➜ ~ tee /etc/rancher/k3s/config.yaml <<-'EOF' docker: true tls-san: k3s.domain.com service-node-port-range: 30000-40000 kubelet-arg: system-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1024Mi,pid=100 kubelet-arg: kube-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1024Mi,pid=100 kubelet-arg: eviction-hard=memory.available<1024Mi,nodefs.available<10%,imagefs.available<10% kubelet-arg: eviction-minimum-reclaim=memory.available=500Mi,nodefs.available=500Mi,imagefs.available=500Mi EOF # 3. 导入K3S镜像,并执行安装脚本 ➜ ~ docker load -i k3s-airgap-images-amd64.tar.gz ➜ ~ cp -f k3s /usr/local/bin/ ➜ ~ chmod 700 /usr/local/bin/k3s ➜ ~ chmod 700 install.sh ➜ ~ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh ``` 安装完成后,执行以下命令进行验证: ```shell ➜ ~ k3s -v k3s version v1.21.4+k3s- () go version go1.16.6 ➜ ~ kubectl get ns NAME STATUS AGE default Active 420d kube-system Active 420d kube-public Active 420d ``` #### 使用Rancher-Desktop安装 除命令行安装k3s外,还可使用Rancher Desktop工具进行可视化安装。 Rancher Desktop官网为:https://rancherdesktop.io/ 安装步骤:https://docs.rancherdesktop.io/getting-started/installation/#linux ### helm安装 Helm是Kubernetes的包管理工具,可以方便的在Kubernetes集群中部署应用。 Helm安装官网:https://helm.sh/docs/intro/install/ 安装Rancher后,默认会安装helm,如果未安装可以通过脚本单独安装,步骤如下: ```shell ➜ ~ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 ➜ ~ chmod 700 get_helm.sh ➜ ~ ./get_helm.sh ``` 安装完成后,使用以下命令进行验证: ```shell ➜ ~ helm version version.BuildInfo{Version:"v3.13.1", GitCommit:"3547a4b5bf5edb5478ce352e18858d8a552a4110", GitTreeState:"clean", GoVersion:"go1.20.8"} ``` ## 数据要素流通平台部署 ### 获取部署脚本 ```shell # 1. 获取数据要素流通平台部署脚本, 并切换到对应版本 ➜ ~ git clone -b v1.1.0 https://git.chainweaver.org.cn/chainweaver/mira/mira-deployment.git ``` ### 部署长安链和智能合约 #### 部署长安链 数据要素流通平台依赖长安链(需要启用docker go VM),需要先部署长安链。如果已经部署长安链,可以跳过该步骤。 - 长安链提供了多种部署方式, 可以参考官方部署文档,如: [通过Docker部署链][通过Docker部署链] #### 安装智能合约 数据要素流通平台智能合约包括数据产品登记合约与隐私计算合约两部分: - 数据产品登记合约: `ida`合约 - 隐私计算合约: `mira`合约 智能合约的部署方式与链的管理方式有关,一般有两种方式: - 通过管控台管理的链:合约可以通过管控台直接部署或升级 - 无管控台管理的链:合约需要通过命令行部署或升级 > 注:多个参与方分别部署数据要素流通平台时,合约也仅需部署一次,无需每个参与方分别部署。 下面以命令行部署为例: ```shell ## 1. 使用mira-deployment进行合约部署 ```shell # 1. 进入合约部署目录 ➜ cd mira-deployment/contract # 2. 查看合约压缩包和部署脚本 ➜ tree -L 2 . ├── contracts # mira和ida合约文件 │   ├── contract_ida.7z │   └── contract_mira.7z ├── crypto-config # 长安链用户证书,需要根据实际情况进行替换(下面为cert模式链的证书列表) │   ├── wx-org1.chainmaker.org │   ├── wx-org2.chainmaker.org │   ├── wx-org3.chainmaker.org │   └── wx-org4.chainmaker.org ├── deploy.sh # 部署合约脚本 ├── scripts # 部署合约脚本、配置文件(支持cert模式和pk模式) │   ├── cmc │   ├── create_contract.sh │   ├── create_contract_pk.sh │   ├── sdk_config.yml │   ├── sdk_config_pk.yml │   ├── upgrade_contract.sh │   └── upgrade_contract_pk.sh └── upgrade.sh # 升级合约脚本 # 3. 执行脚本部署智能合约 # 支持cert模式和pk模式, 以cert模式为例 ➜ ./deploy.sh cert # 如果是升级合约,执行upgrade.sh脚本。 # 支持cert模式和pk模式, 同时支持升级ida、mira合约以及同时升级ida和mira合约 # 以升级ida和mira合约为例: # ida:v2.0.0表示ida合约升级到v2.0.0版本 # mira:v1.1.0表示mira合约升级到v1.1.0版本 ➜ ./upgrade.sh cert ida:v2.0.0 mira:v1.1.0 ``` ### 部署公共服务和ida组件 mira-deployment提供了公共服务和ida组件的部署脚本,用户可以根据实际情况进行部署,默认使用版本为`v2.0.0` ```shell # 1. 进入安装目录 ➜ cd mira-deployment/ida # 2. 查看部署脚本 ➜ tree -L 2 . ├── ida-deployment # 执行部署脚本自动克隆 │   ├── helm │   └── k3s ├── install.sh # 公共组件和IDA部署脚本 └── uninstall.sh # 公共组件和IDA卸载脚本 # 3. 修改install.sh脚本中的配置信息,根据实际情况修改。如: # dataPath=/home/data/630/data # 数据存储路径,根据实际情况修改 # --set global.circulation.nodePort=31090 # 前端页面访问端口 # 4. 执行安装脚本 ➜ sh install.sh ``` 安装完成后,执行以下命令进行验证: ```shell # 查看public命名空间下的pod,如果以下服务正常运行,说明公共服务组件部署成功 ➜ ~ kubectl get pod -n public NAME READY STATUS RESTARTS AGE mysql-8c648b66b-4clz5 1/1 Running 0 3m18s redis-797cf49c8c-wkgvw 1/1 Running 0 3m18s key-ff87f646f-288qc 1/1 Running 0 3m18s chain-f5f7f896c-2b2nl 1/1 Running 0 3m18s minio-7cf7bfc7c-42ljh 1/1 Running 0 55s chartmuseum-chartmuseum-7d6d6887cf-44pnp 1/1 Running 0 55s # 查看ida命名空间下的pod,如果以下服务正常运行,说明ida组件部署成功 ➜ ~ kubectl get pod -n ida NAME READY STATUS RESTARTS AGE circulation-6c6cffffcc-nvkdl 1/1 Running 0 3m19s gateway-6bd8cf8c9b-7gwsb 1/1 Running 0 3m19s certification-64d8885b57-8c9qj 1/1 Running 0 3m19s registration-6db56bccc5-bxrp7 1/1 Running 0 3m19s ``` ## 部署mira组件 mira组件包含所有mira可信计算服务相关服务或组件,在使用mira-deployment部署脚本进行mira安装之前,需要配置Mira服务。 主要配置文件如下: - mira/mira/values.yaml: 服务端口、数据库、对象存储等配置 - mira/mira/custom-values.yaml: 镜像版本、集群地址等配置 在部署Mira服务前,首先需要创建mira使用的数据库(下面以mysql为例): ```shell # 需要根据mysql的命名空间和密码进行修改,默认如下 NAMESPACE=public MYSQL_PASSWORD=root123456 # 创建mysql数据库 kubectl exec -it $(kubectl get pods -n $NAMESPACE -l deployment=mysql -o jsonpath='{.items[0].metadata.name}') -n $NAMESPACE \ -- mysql -uroot -p${MYSQL_PASSWORD} -e "CREATE DATABASE mira;" ``` 另外需要注意的是,mira-scheduler调度服务需要访问集群,以便于拉起pod执行隐私计算任务,因此需要配置集群访问地址。如下: ```shell # 1. 进入mira安装目录 ➜ cd mira-deployment/mira # 2. 修改mira配置,并配置k3s集群地址 ➜ vim mira/mira/custom-values.yaml # k3s配置项需要从宿主机 ~/.kube/config或者/etc/rancher/config获取, # 然后将custom-values.yaml默认的k3s.config进行全部替换 k3s: config: |- apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTi0K... server: https://localhost:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: client-certificate-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS... client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS... ``` Mira组件使用helm进行部署,部署步骤如下: ```shell # 1. 进入mira安装目录 ➜ cd mira-deployment/mira # 2. 查看部署文件 ➜ tree -L 2 . ├── engine # 执行引擎算子对应的chart包 │   └── exec ├── install.sh # mira组件安装脚本 ├── minio # minio对象存储服务(可选) │   ├── Chart.yaml │   ├── charts │   └── values.yaml ├── mira # mira服务对应的chart包 │   ├── Chart.yaml │   ├── charts │   ├── custom-Values.yaml │   ├── templates │   └── values.yaml ├── push_charts.sh # 执行引擎算子chart包上传脚本 └── uninstall.sh # mira组件卸载脚本 # 3. 执行安装脚本 ➜ ./install.sh # 使用helm安装mira组件安装 ``` 安装完成后,执行以下命令进行验证: ```shell # 查看mira命名空间下的pod,如果以下服务正常运行,说明mira组件部署成功 ➜ ~ kubectl get pod -n mira NAME READY STATUS RESTARTS AGE mira-job-service-b6fc4745-kmqgm 1/1 Running 1 (7d3h ago) 7d3h mira-ida-access-service-b8b44cbd-xg26r 1/1 Running 0 30h mira-scheduler-fb555d7cf-m92bp 1/1 Running 0 30h mira-network-manager-58f75f459b-hwglf 1/1 Running 0 7h58m mira-backend-service-59f8bb6dd5-58qtf 1/1 Running 0 6m16s ➜ ~ ``` ## 可选组件 可选组件包括mira-tee组件、kms-adapter组件、ftp异步上链组件等。这些组件是可选的,根据实际需求进行部署和配置。 ### mira-tee组件部署 对于tee的支持,需要在集群中额外安装mira-tee相关的组件。 > 注:mira-tee用于支持TEE计算,依赖于物理机上TEE硬件计算环境,如板卡等!!! 在安装mira-tee组件之前,可以按照需求对mira-tee组件进行配置,配置文件如下: - mira/mira/values.yaml: 服务端口、数据库、对象存储等配置 - mira/mira/custom-values.yaml: 镜像版本、集群地址等配置 Mira-tee组件使用helm进行部署,部署步骤: ```shell # 1. 进入安装目录 ➜ cd mira-tee # 2. 查看部署文件 ➜ tree -L 2 . ├── engine # tee执行引擎算子对应的chart包 │   └── exec ├── install.sh # tee组件安装脚本 ├── mira # tee服务对应的chart包 │   ├── Chart.yaml │   ├── charts │   ├── custom-Values.yaml │   ├── templates │   └── values.yaml └── push_charts.sh # tee执行引擎算子chart包上传脚本 # 3. 执行安装脚本 ➜ ./install.sh # 使用helm安装mira-tee组件 ``` 安装完成后,执行以下命令进行验证: ```shell # 查看mira-tee命名空间下的pod,如果以下服务正常运行,说明mira-tee组件部署成功 ➜ ~ kubectl get pod -n mira | grep -v "mira*" NAME READY STATUS RESTARTS AGE agent-daemonset-89qtp 1/1 Running 3 34h agent-daemonset-g7wcq 1/1 Running 3 34h card-monitor-deploy-f65f77f45-qb7tk 1/1 Running 3 34h pulsar-standalone-0 1/1 Running 0 34h ``` > 注:agent是板卡的代理服务,有板卡的node节点都会起一个agent,由于我们测试环境有两个node节点携带板卡,所以有两个agent pod。 ### kms-adapter部署 kms-adapter为定制化组件,用于支持对接外部kms服务。该组件以微服务的形式部署,由上层服务调用,实现数据加解密和签名功能。 > 注:不同的kms需要部署不同的kms-adapter服务,每个kms-adapter服务对应一个外部kms服务,kms-adapter需要联系官方进行定制化开发。 **kms-adapter部署** ```shell # 1. 进入安装目录 cd mira-options # 2. 执行安装脚本, 其中public为命名空间,与key-service服务在同一命名空间 helm install kms-adapter ./kms-adapter -n public ``` **key-service配置修改** ```shell KmsConf: Enabled: true # 是否启用kms服务,true启用,false不启用 DefaultUrl: kms-adapter.public:8180 # 默认kms-adapter服务地址,如果keyJson中配置了kmsUrl,则优先使用keyJson中的kmsUrl ``` **keyJson密钥格式** 在管理员页面进行用户链账户配置时,需要上传用户链证书(或公钥)和私钥,对于kms的链私钥一般用Json格式存储,如下: ```json { "certId":1426063379, "keyId":"3da0a8885c81407093e8a8387166cace", "keySecret":"0e997edddea74a749b49016d285012d6", "algorithm":"SM3WITHSM2" } ``` 在多链多账户情况下,不同的链私钥可能来自不同的kms,可以通过在keyJson中配置kmsUrl,区分不同私钥来源。格式如下: ```json { "certId":1426063379, "keyId":"3da0a8885c81407093e8a8387166cace", "keySecret":"0e997edddea74a749b49016d285012d6", "algorithm":"SM3WITHSM2", "kmsUrl":"public.kms-adapter.svc.cluster.local:8180" } ``` 在以上的json中,kmsUrl为kms-adapter服务的地址,每个kms-adapter服务对应一个外部kms服务。 ### 开启ftp异步上链 ftp异步上链组件,用于支持异步上链功能。启用ftp异步上链功能,需要配置chain-service和tx-adapter。 #### chain-service配置 ```shell FtpConfig: # 是否启动 ftp 传输 tx Enable: true # true 启用,false 不启用 ConfFilePath: ./etc/ftp_config.yml # ftp 配置文件路径, 文件内容参考`2. ftp_config.yml配置` ``` 其中,ftp_config.yml客户端配置如下: ```shell ftp_tx_file_config: # 请求方式: RPC | FTP (client端为FTP, chain端为RPC) request_mod: "FTP" # 交易文件存储目录 request_file_dir: "./tx_request" response_file_dir: "./tx_response" # 交易文件分类方式 direct | date(year/month/week/day/hour) file_classify_mod: "month" # 交易文件写入方式: single | batch file_write_mod: "single" # 交易序列化方式: json(default) | pb file_serialize_mod: "json" # 交易容量(default 50) tx_buffer_size: 50 # 事件容量(default 50) event_buffer_size: 50 get_request_timeout: 30 ``` #### tx-adapter服务配置和启用 tx-adapter需要多个配置文件,包括ftp_config.yml和sdk_config.yml - ftp_config.yml为tx-adapter服务端配置 - sdk_config.yml为链服务配置文件。 **tx-adapter配置目录结构** ```shell ➜ tree -L 2 config config ├── crypto-config │   ├── wx-org1.chainmaker.org │   ├── wx-org2.chainmaker.org │   ├── wx-org3.chainmaker.org │   └── wx-org4.chainmaker.org ├── ftp_config.yml └── sdk_config.yml ``` 其中,ftp_config.yml服务端配置如下: ```shell #ftp_config.yml文件内容 ftp_tx_file_config: # 请求方式: RPC | FTP (client端配置为FTP, 链端配置为RPC) request_mod: "RPC" # 交易文件存储目录 # 请求目录 request_file_dir: "./tx_request" # 响应目录 response_file_dir: "./tx_response" # 交易文件分类方式 direct | date(year/month/week/day/hour) # direct为当前目录存储,不分子目录 # data为按日期分子目录存储 file_classify_mod: "month" # 交易文件写入方式: single | batch # 目前只支持single,每个请求一个文件 file_write_mod: "single" # 交易序列化方式: json(default) | pb # 目前只支持json,交易转为json字符串写入文件 file_serialize_mod: "json" # 交易容量(default 50) # 接受交易的通道大小,交易并发数较高时,可适当调高 tx_buffer_size: 50 # 事件容量(default 50) # 接受事件的通道大小,交易并发数较高时,可适当调高 event_buffer_size: 50 ``` **tx-adapter服务启动** ```shell docker run -d -v $(pwd)/config:/tx-adapter/config \ -v $(pwd)/tx_request:/tx-adapter/tx_request \ -v $(pwd)/tx_response:/tx-adapter/tx_response \ tx-adapter:latest ``` ## 服务列表 必选组件安装成功后,集群中会部署以下服务或组件: | 服务/组件名称 | 说明 | 命名空间 | 部署类型 | Docker镜像名称 | K8S Service名称 | dataPath / logPath | |:--------------------:|:--------------:|:------:|:----------:|:--------------------:|:-----------------------:|:----------------------------------:| | mysql | 公共服务-存储 | public | Deployment | mysql | mysql | /mnt/data/public/mysql (mysql存储目录) | | redis | 公共服务-缓存 | public | Deployment | redis | redis | /mnt/data/public/redis (redis存储目录) | | key | 公共服务-链密钥管理 | public | Deployment | public-key | key | /mnt/data/public/key/logs | | chain | 公共服务-链服务 | public | Deployment | public-chain | chain | /mnt/data/public/chain/logs | | chartmuseum | 公共服务-chart仓库 | public | Deployment | public-chartmuseum | chartmuseum-chartmuseum | - | | minio | 公共服务-对象存储 | public | Deployment | public-minio | minio | - | | certification | IDA-数据产品认证服务 | ida | Deployment | ida-certification | certification | /mnt/data/ida/certification/logs | | registration | IDA-数据产品登记服务 | ida | Deployment | ida-registration | registration | /mnt/data/ida/registration/logs | | gateway | IDA-网关 | ida | Deployment | ida-gateway | gateway | /mnt/data/ida/gateway/logs | | circulation | IDA-数据要素流通平台前端 | ida | Deployment | ida-circulation | circulation | /mnt/data/ida/circulation/logs | | mira-network-manager | MIRA-端口管理服务 | mira | Deployment | mira-network-manager | port-server | /mnt/data/mira | | mira-job-service | MIRA-PQL解析服务 | mira | Deployment | mira-job-service | job-service | /mnt/data/mira | | mira-backend-service | MIRA-后端web服务 | mira | Deployment | mira-backend-service | java-backendservice | /mnt/data/mira | | mira-scheduler | MIRA-调度服务 | mira | Deployment | mira-scheduler | mpc-scheduler | /mnt/data/mira | | mira-mpc-engine | MIRA-mpc执行引擎 | mira | Job | mira-mpc-engine | 无 | /mnt/data/mira | | mira-pir | MIRA-pir执行引擎 | mira | Job | mira-scheduler | 无 | /mnt/data/mira | ## 可信计算平台初始化 在创建和执行任务前,可信计算平台需要进行地址初始化。流程如下: 1. [登录管理员页面配置链账户](02_用户使用说明.html) 3. 地址初始化 > 地址初始化:在部署机上执行以下curl命令,进行可信计算平台地址初始化。如果要支持跨公网下载计算任务结果,以下IP地址需要为公网可访问地址。 注: 涉及的端口号表示:31008-可信计算平台web后端服务端口) ```shell # 部署机执行地址初始化命令 curl --location 'http://192.168.40.243:31008/v1/mira/job/SetResultServerAddr' \ --header 'Content-Type: application/json' \ --data '{"address":"192.168.40.243:31008"}' ``` 注:在计算任务结果下载时,需要使用预先注册的平台地址。平台地址注册依赖于链账户的配置,因此需要在链账户配置完成后进行平台地址注册。 ## 部署验证 部署完成后,可以通过前端页面**创建任务-任务审批-任务执行-结果下载全流程进行验证**。 详细步骤请参考: [用户使用手册链接](./02_用户使用说明.html) [通过Docker部署链]: https://docs.chainmaker.org.cn/v3.0.0/html/instructions/%E5%90%AF%E5%8A%A8%E6%94%AF%E6%8C%81Docker_VM%E7%9A%84%E9%93%BE.html [数据要素登记服务部署脚本]: https://git.chainweaver.org.cn/ChainWeaver/ida/gateway [可信计算服务部署脚本]: https://git.chainweaver.org.cn/ChainWeaver/mira/mira-deployment