这篇文档介绍了KubeFATE的架构,用户的实际使用场景以及KubeFATE的使用指南。如果您只关心使用的话可以跳转到 Kubefate 使用指南 。
我们推荐在生产环境中使用Kubernetes 作为底层的基础平台支撑FATE集群的创建、管理。KubeFATE目前支持在一个Kubernetes平台上以不同的namespace部署多个FATE集群,用于开发、测试和产品等场景。考虑到不同企业的IT设计和标准各异,KubeFATE提供灵活的机制支持定制化安装、配置FATE。KubeFATE的设计架构分离了主程序服务与FATE的具体配置。
抽象从高层去表现多方(譬如两方)联邦学习的机构,如下图:
- KubeFATE: 负责在一方内编排FATE集群,提供管理API给FATE-CLoud做总体调控管理
- Harbor (可选): 负责FATE部署,相关镜像的版本管理
- Kubernetes:编排引擎
KubeFATE负责:
- Day 1初始化: 可执行二进制文件负责部署、配置FATE集群;
- Day 2运维管理:提供可执行二进制工具进行日常运维,且提供RESTful APIs以供与FATE-Cloud或者企业管理系统进行整合。
KubeFATE的架构可表现如下图:
图中所标为:
- 请求进行授权认证
- 渲染Helm模板
- 持久化任务及配置FATE的部署规范
- KubeFATE作为Kubernetes的应用部署提供服务
所以,KubeFATE由两大部分构成:
- KubeFATE命令行工具。KubeFATE命令行为可执行二进制,用作快速初始化、部署、管理FATE集群。它设计为可以在Kubernetes集群外使用,并使用独立的授权机制。在底层实现中,命令行会调用KubeFATE服务实行Kuberentes的操作;
- KubeFATE服务。KubeFATE服务向外提供RESTful APIs供管理FATE集群。它的API服务建立在Kubernetes的Ingress技术上,可以轻易与各种管理平台、网络设备进行整合。KubeFATE实现了独立的授权认证机制,基于JWT。
KubeFATE在设计上分离了服务与FATE集群的配置(基于Helm Chart),譬如版本升级等。所以在大多版本下,KubeFATE可以实现FATE集群的独立升级,往往只需要配置一行修改。
假设在一个组织内部,有两个不同角色:
- 系统管理员: 负责基础设施的管理,包括Kubernetes的管理;
- 机器学习的系统运维: 负责管理机器学习相关服务,譬如FATE的管理。
KubeFATE可以支持部署在任意k8s上,作为初次使用或者对k8s不太熟悉者建议使用Minikube上手, 可以参考这个教程:《使用Minikube部署包含两方的联邦学习网络》
依赖软件的建议版本:
Kubernetes: v1.23.5 Ingress-nginx: v1.1.3
我们的发布包提供了rbac-config.yaml作为样例。但是现实使用请与系统管理员确认权限问题,以及商量资源配额。更多请参考Kubernetes Namespace和Configure Memory and CPU Quotas for Namespace。
kubectl apply -f ./rbac-config.yaml
请务必注意,默认的用户名密码,设置在Secret->kubefate-secret->stringData
:
stringData:
kubefateUsername: admin
kubefatePassword: admin
具体参考:Overview of Cloud Native Security。
因为KubeFATE服务向外暴露RESTful APIs,所以系统管理员需要为此准备域名的DNS解析。在我们的配置样例里,使用example.com
作为域名。同时,系统管理员需要为每个FATE集群创建一个namespace,譬如party_id为9999的FATE集群,创建一个fate-9999的namespace,然后进行配额控制。准备好后,把这些信息反馈给机器学习的系统运维。
kubectl apply -f ./kubefate.yaml
kubectl create namespace fate-9999
具体创建KubeFATE服务的配置,可以参考: KubeFATE service Configuration Guild。
当系统管理员成功部署了KubeFATE服务,并准备好新的FATE集群namespace,机器学习的系统运维可以根据这些信息开始部署FATE集群。config.yaml
是使用KubeFATE命令行的配置文件,包含KubeFATE服务的访问用户名密码,以及log配置,域名。
log:
level: info
user:
username: admin
password: admin
serviceurl: example.com
safeconnect: false
名字 | 种类 | 描述 |
---|---|---|
log | scalars | 命令行的log级别.debug级别包含REST通信信息 |
user | mappings | KubeFATE的认证用户名、密码 |
serviceurl | scalars | KubeFATE服务使用的域名 |
safeconnect | scalars | 是否使用https访问KubeFATE服务URL。你可以参考 kubefate_service_tls_enable |
我们的配置样例里还包含了cluster.yaml
,是FATE集群的部署计划。更多自定义内容参考:FATE Cluster Configuration Guild
注意: 对于中国的用户,可以通过在cluster.yaml
修改registry
来加速镜像的下载,具体设置内容如下:
registry: "hub.c.163.com/federatedai"
准备好后,通过kubefate cluster install
命令进行部署FATE集群:
$ kubefate cluster install -f ./cluster.yaml
create job success, job id=d92d7a56-7002-46a4-9363-da9c7346e05a
如果想要部署使用 Spark 计算引擎的FATE集群,可以使用cluster-spark.yaml
。
使用KubeFATE部署FATE可以支持不同类型的引擎。关于不同类型的FATE的更多细节查看: 不同类型FATE的架构介绍。
如果某个部件对计算机性能(CPU和内存)有所要求,可以查看示例文件, 在其中搜索"resources"关键字了解如何进行资源配置.
我们支持定义如下部件的资源需求:
- Eggroll部件:包括cluster manager,node manager和osx。
- Spark components:包括master和worker。
- Rabbitmq。
- Pulsar。
从v1.11.1开始,KubeFATE可以部署支持GPU的FATE集群,部署支持GPU的FATE需要有一些特别准备工作和配置,可以查看这个文档KubeFATE 部署支持GPU的FATE
上面的命令会创建一个安装FATE集群的任务,用于异步部署。使用kubefate job describe
命令可以检查任务的状态,直到看到结果为install success
$ kubefate job describe d92d7a56-7002-46a4-9363-da9c7346e05a
UUID d92d7a56-7002-46a4-9363-da9c7346e05a
StartTime 2022-04-12 07:34:09
EndTime 2022-04-12 07:48:14
Duration 14m
Status Success
Creator admin
ClusterId 24bb75ff-f636-4c64-8c04-1b9073f89a2f
States - update job status to Running
- create Cluster in DB Success
- helm install Success
- checkout Cluster status [794]
- job run Success
SubJobs nodemanager-0 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:26
nodemanager-1 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:18
python ModuleStatus: Available, SubJobStatus: Success, Duration: 14m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:48:14
osx ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:24
client ModuleStatus: Available, SubJobStatus: Success, Duration: 11m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:45:22
clustermanager ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11
mysql ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime:
2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11
当我们看到上面命令的返回结果出现install success
,就可以使用kubefate cluster describe
查看FATE集群的访问信息
$ kubefate cluster describe 24bb75ff-f636-4c64-8c04-1b9073f89a2f
UUID 24bb75ff-f636-4c64-8c04-1b9073f89a2f
Name fate-9999
NameSpace fate-9999
ChartName fate
ChartVersion v2.0.0
Revision 1
Age 15m
Status Running
Spec algorithm: Basic
chartName: fate
chartVersion: v2.0.0
computing: Eggroll
device: CPU
federation: Eggroll
imagePullSecrets:
- name: myregistrykey
ingressClassName: nginx
istio:
enabled: false
modules:
- osx
- clustermanager
- nodemanager
- mysql
- python
- fateboard
- client
name: fate-9999
namespace: fate-9999
partyId: 9999
persistence: false
podSecurityPolicy:
enabled: false
pullPolicy: null
registry: ""
storage: Eggroll
Info dashboard:
- party9999.notebook.example.com
- party9999.fateboard.example.com
ip: 192.168.9.1
status:
containers:
client: Running
clustermanager: Running
fateboard: Running
fateflow: Running
mysql: Running
nodemanager: Running
nodemanager-eggrollpair: Running
osx: Running
deployments:
clustermanager: Available
osx: Available
假如安装了fateboard 和client 的组件就可以通过上一步得到的信息party9999.fateboard.example.com
和party9999.notebook.example.com
来访问 FATEBoard 和 Notebook UI,配置下这两个域名的解析就可以在浏览器打开。
http://party9999.fateboard.example.com
访问FATEBoard UI需要登录用户名和密码,这个可以在cluster.yaml
里[配置](../docs/configurations/FATE_cluster_configuration.md#fateboard mappings)。