系列文章目录
FATE联邦学习框架之KubeFATE部署(基于K8S)最详细过程_顿顿有鱼有虾的博客-优快云博客_kubefate
K8s初探入门详细教程(一)_顿顿有鱼有虾的博客-优快云博客_k8s入门教程
快速安装docker和docker-comopose_顿顿有鱼有虾的博客-优快云博客
提示:以上文章有助于帮助部署完成此网络。
前言
本文记录如何使用KubeFATE部署一个以exchange为中央节点的联邦学习网络,这个网络包含一个exchange和若干个Party。由于官方文档年久失修BUG不断,因此自己记录一下配置过程。
部署结构图
一、预备条件
环境:CentOS7
KubeFATE版本: v1.8.0
kubernetes部署请参考K8s初探入门详细教程(一)_顿顿有鱼有虾的博客-优快云博客_k8s入门教程
docker、和docker-compose 部署请参考快速安装docker和docker-comopose_顿顿有鱼有虾的博客-优快云博客
二、安装步骤
1.安装docker和docker-compose(略)
2.安装kubernetes
3.安装kubernetes插件
3.1安装calico插件
#使用此命令下载calico的yaml配置文件
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
下载完成后需要对其进行修改
在 (1条消息) K8s初探入门详细教程(一)_顿顿有鱼有虾的博客-优快云博客_k8s入门教程的init阶段我们在master节点进行了初始化主节点,其中重点强调了还有就是-pod-network-cidr=193.31.0.0/16 这个地址必须确保不会与自己的ip网络范围重叠。因此我们也需要修改calico.yaml的配置文件
vi calico.yaml
#进入calico.yaml文件后接下来执行
%s/192.168.0.0/193.31.0.0/gc
这里注意要去掉这一行的注释以及上一行 -name的注释 并注意格式对齐
修改完成之后使用
kubectl apply -f calico.yaml
#此命令将会开始部署calico插件。部署完成后可以进行查看,如果部署running过一段时间再来看
[root@k8s-master fate01]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default mynginx 1/1 Running 0 85m
kube-system calico-kube-controllers-577f77cb5c-qnjb5 1/1 Running 0 107m
kube-system calico-node-4qgkl 1/1 Running 0 107m
kube-system calico-node-74hf7 1/1 Running 0 107m
kube-system calico-node-h5hk4 1/1 Running 0 107m
kube-system coredns-5897cd56c4-5zbcn 1/1 Running 0 3h4m
kube-system coredns-5897cd56c4-qzfgk 1/1 Running 0 3h4m
kube-system etcd-k8s-master 1/1 Running 0 3h4m
kube-system kube-apiserver-k8s-master 1/1 Running 0 3h4m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 3h4m
kube-system kube-proxy-4ffq9 1/1 Running 0 132m
kube-system kube-proxy-bc7lq 1/1 Running 0 112m
kube-system kube-proxy-s4shd 1/1 Running 0 3h4m
kube-system kube-scheduler-k8s-master 1/1 Running 0 3h4m
当显示如上之后说明calico部署成功了。
3.2部署nginx服务
由于在此集群中我只设置了一个节点,因此需要执行以下命令,否则nginx的pod会一直处于pending状态
kubectl taint nodes --all node-role.kubernetes.io/master-
执行完成之后,过一会检查状态如下所示 ,则部署成功。
4.下载kubefate
# 下载对应版本的KubeFATE,这里可以自己选择所需要的版本
$ wget https://github.com/FederatedAI/KubeFATE/releases/download/v1.8.0/kubefate-k8s-v1.8.0.tar.gz
KubeFATE安装包可以从GitHub的KubeFATE release下载(Releases · FederatedAI/KubeFATE · GitHub)
解压之后安装就可以使用。
$ mkdir kubefate
$ tar -zxvf kubefate-k8s-v1.8.0.tar.gz
$ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin
查看文件发现以下内容
$ ls
cluster-serving.yaml cluster-spark.yaml cluster.yaml config.yaml examples kubefate kubefate.yaml rbac-config.yaml
换国内源
sed 's/mariadb:10/hub.c.163.com\/federatedai\/mariadb:10/g' kubefate.yaml > kubefate_163.yaml
sed 's/registry: ""/registry: "hub.c.163.com\/federatedai"/g' cluster.yaml > cluster_163.yaml
部署kubefate
kubectl apply -f ./kubefate_163.yaml
部署成功后查看
kubectl get all,ingress -n kube-fate
#显示如下则说明成功
NAME READY STATUS RESTARTS AGE
pod/kubefate-5d97d65947-7hb2q 1/1 Running 0 51s
pod/mariadb-69484f8465-44dlw 1/1 Running 0 51s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubefate ClusterIP 192.168.0.111 <none> 8080/TCP 50s
service/mariadb ClusterIP 192.168.0.112 <none> 3306/TCP 50s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kubefate 1/1 1 1 51s
deployment.apps/mariadb 1/1 1 1 51s
NAME DESIRED CURRENT READY AGE
replicaset.apps/kubefate-5d97d65947 1 1 1 51s
replicaset.apps/mariadb-69484f8465 1 1 1 51s
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/kubefate example.com 192.168.100.123 80 50s
接下来
sudo -- sh -c "echo \"192.168.100.123 example.com\" >> /etc/hosts"
#ip 地址换为你自己的IP
添加完毕后,可以验证是否生效:
kubefate@machine:~/demo$ ping -c 2 example.com
PING example.com (192.168.100.123) 56(84) bytes of data.
64 bytes from example.com (192.168.100.123): icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from example.com (192.168.100.123): icmp_seq=2 ttl=64 time=0.054 ms
--- example.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1006ms
rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms
验证KubeFATE服务:
这时候虽然看着是部署成功了,但是如果你使用kubefate version命令验证则会发现问题
kubefate version
会给你报个错,80端口连接失败。
解决办法:
ls 发现当前文件下有个config.yaml文件
使用vi修改config.yaml的内容。只需要修改serviceurl: example.com:31476加上映射的端口,这个在前面有说过,如果忘记了重新查看一下80端口对应的映射端口(31476是我的映射端口你需要换成你自己的)
#查看映射端口
kubectl -n ingress-nginx get svc
[root@control-plane demo]# kubectl -n ingress-nginx get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.100.227.20 <none> 80:31476/TCP,443:32344/TCP 23h
ingress-nginx-controller-admission ClusterIP 10.111.26.99 <none> 443/TCP 23h
再次验证发现成功。
5. 部署exchage节点
进入当前目录下的examples文件夹中可以看到三个文件夹,其中有一个是party-exchage
在部署exchage节点之前,记得创建一下fate-exchage的命名空间
kubectl create namespace fate-exchage
下面开始修改exchange节点的配置文件,编辑 vi rollsite.yaml
name: fate-exchange
namespace: fate-exchange
chartName: fate-exchange
chartVersion: v1.8.0 #注意这个一定要写,一开始没写会报错
partyId: 1
registry: "hub.c.163.com/federatedai" #换成国内镜像仓库,也可以不换,我感觉换了会快一点
imageTag: "1.8.0-release"
pullPolicy:
imagePullSecrets:
- name: myregistrykey
persistence: false
istio:
enabled: false
modules:
- rollsite
rollsite:
type: NodePort
nodePort: 30000
partyList:
- partyId: 10000
partyIp: 192.168.100.10 #自己需要添加的参与方10000的IP
partyPort: 30101
- partyId: 9999
partyIp: 192.168.100.9 #自己需要添加的参与方9999的IP
partyPort: 30091
- partyId: 8888
partyIp: 192.168.100.8 #自己需要添加的参与方8888的IP
partyPort: 30081
修改完成后执行部署,注意这时候的执行目录要退回到kubefate目录下,不应该是在examples/party-exchage目录下
kubefate cluster install -f ./examples/party-exchage/rollsite.yaml
#查看cluster的状态是否是Running确认是否成功运行。
kubefate cluster ls
下载镜像可能需要一些时间,过一会会发现,状态已经是running了,说明已经部署好了exchge节点。
添加Party
对应已经运行的exchange集群,新的Party加入,需要新增加Party信息,那么你可以修改rollsite.yaml 文件添加新的Party。然后呢使用kubefate的update命令更新到exchange集群。
kubefate cluster update -f ./examples/party-exchage/rollsite.yaml
然后稍等片刻就可以生效(这是因为程序对party信息的加载有一个小的时间周期)。
配置Party
刚刚已经配置好了exchange节点,现在需要配置参与方party,下面以9999为例子。
在一台新的虚拟机中重复上述(一直到部署exchege节点之前)步骤,然后开始配置party节点的配置文件。进入当前目录下的examples文件夹中可以看到三个文件夹,其中有一个是party-9999
进入该文件夹下,打开cluster.yaml文件,修改配置文件内容
$ cat cluster.yaml
name: fate-9999
namespace: fate-9999
chartName: fate
chartVersion: v1.8.0
partyId: 9999
registry: ""
imageTag: "1.8.0-release"
pullPolicy:
persistence: false
istio:
enabled: false
modules:
- rollsite
- clustermanager
- nodemanager
- mysql
- python
- fateboard
- client
backend: eggroll
rollsite:
type: NodePort
nodePort: 30091
exchange:
ip: 192.168.100.1 #修改为自己刚配置的exchange节点的ip
port: 30000
配置完成后验证
kubefate cluster install -f ./examples/party-9999/cluster.yaml
#查看cluster的状态是否是Running确认是否成功运行。
kubefate cluster ls
配置10000和8888的步骤同上,至此三个party就全部配置完成了。
验证
通过上边的部署,我们已经成功部署了通过exchange互联的联邦学习网络,包含三个Party,计算引擎为eggroll。下面我们通过一些测试检查联邦学习网络的可用性。
多方连接测试
每个不同的两方测试toy_example确认双方互通。
-
Party-9999和Party-10000
通过命令行进入Party-9999的python container。然后运行toy命令
kubectl -n fate-9999 exec -it ${python容器名称} -c python -- bash cd ../examples/toy_example/ python run_toy_example.py 9999 10000 1
-
Party-10000和Party-8888
kubectl -n fate-10000 exec -it ${python容器名称} -c python -- bash cd ../examples/toy_example/ python run_toy_example.py 10000 8888 1
-
Party-8888和Party-9999
kubectl -n fate-8888 exec -it ${python容器名称} -c python -- bash cd ../examples/toy_example/ python run_toy_example.py 8888 9999 1
最后日志出现类似success to calculate secure_sum, it is 2000.0000000000002
则表示toy_example互通测试成功。
总结
欢迎大家一起交流学习。