在TKG上使用KubeFATE部署FATE - FederatedAI/KubeFATE GitHub Wiki
TKG(Tanzu Kubernetes Grid) 集群是由 VMware 构建、签名和支持的开源 Kubernetes 容器编排平台的完整分发版。可以通过使用 Tanzu Kubernetes Grid 服务在主管集群上置备和运行 Tanzu Kubernetes 集群。主管集群是启用了 vSphere with Tanzu 的 vSphere 集群。
接下来我们一起看下如何在TKG上运行FATE。
| item | version |
|---|---|
| Kubernetes | v1.18.15+vmware.1 |
| KubeFATE | v1.6.0-a |
由于我们会在两个集群分别安装FATE,所有操作都在同一个host上,所以我们首先分别准备两个工作目录,分别是PartyA和PartyB。
(PartyA)$ # 这个代表运行在PartyA的命令(PartyB)$ # 这个代表运行在PartyB的命令$ # 这个代表在两个工作目录同时运行| 项 | PartyA | PartyB |
|---|---|---|
| PartyID | 9999 | 10000 |
| KubeFATE serviceurl | partya.example.com | partyb.example.com |
| Kubernetes context | tkc-1 | tkc-2 |
| ingress IP | 192.168.18.131 | 192.168.20.135 |
Kubernetes context通过登录到TKC获得,ingress IP通过安装ingress-controller后查看。
这里,我们已经准备了两个TKC集群,使用kubectl vsphere login 登录后,分别查看对应的k8s版本信息。
(PartyA)$ kubectl --context=tkc-1 version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.1", GitCommit:"c4d752765b3bbac2237bf87cf0b1c2e307844666", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.15+vmware.1", GitCommit:"9a9f80f2e0b85ce6280dd9b9f1e952a7dbf49087", GitTreeState:"clean", BuildDate:"2021-01-19T22:59:52Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}(PartyB)$ kubectl --context=tkc-2 version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.1", GitCommit:"c4d752765b3bbac2237bf87cf0b1c2e307844666", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.15+vmware.1", GitCommit:"9a9f80f2e0b85ce6280dd9b9f1e952a7dbf49087", GitTreeState:"clean", BuildDate:"2021-01-19T22:59:52Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}如果无法访问dockerhub,需要下载镜像上传到对应的worknode或者自己harbor上。我们本次安装直接使用dockerhub下载。
由于我们可以直接访问GitHub也可以不用手动下载chart。如果是离线环境则需要下载并上传chart文件,fate-v1.6.0-a.tgz。
安装一个ingress-controller(例如ingress-nginx)。安装完成后分别通过kubectl get svc -n ingress-nginx获得ingress IP。
(PartyA)$ kubectl --context=tkc-1 get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.108.42.103 192.168.18.131 80:32250/TCP,443:32437/TCP 1d
ingress-nginx-controller-admission ClusterIP 10.99.180.187 <none> 443/TCP 1d(PartyB)$ kubectl --context=tkc-2 get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.102.226.6 192.168.20.135 80:30036/TCP,443:30941/TCP 1d
ingress-nginx-controller-admission ClusterIP 10.104.177.237 <none> 443/TCP 1d上面的环境全部准备完毕,我们就可以开始在TKG上安装KubeFATE和FATE了。
下载安装包文件
$ curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/v1.6.0/kubefate-k8s-v1.6.0.tar.gz && tar -xzf ./kubefate-k8s-v1.6.0.tar.gz
$ ls
cluster-serving.yaml cluster-spark.yaml cluster.yaml config.yaml examples kubefate kubefate-k8s-v1.6.0.tar.gz kubefate.yaml rbac-config.yaml安装KubeFATE命令工具。
$ chmod +x ./kubefate && sudo mv ./kubefate /usr/binKubeFATE命令行工具使用golang编写,你也可以自己编译。
分别在两个TKC kubernetes上安装KubeFATE service。
(PartyA)$ kubectl --context=tkc-1 apply -f ../rbac-config.yaml(PartyB)$ kubectl --context=tkc-2 apply -f ../rbac-config.yaml修改KubeFATE serviceurl
(PartyA)$ cat ./kubefate.yaml
...
spec:
rules:
- host: partya.example.com
http:
paths:
...(PartyB)$ cat ./kubefate.yaml
...
spec:
rules:
- host: partyb.example.com
http:
paths:
...写入hosts文件
(PartyA)$ echo "192.168.18.131 partya.example.com" >> /etc/hosts(PartyB)$ echo "192.168.20.135 partyb.example.com" >> /etc/hosts如果使用私有镜像仓库,就需要修改kubefate.yaml中镜像相关的字段。
修改config.yaml的serviceurl。
(PartyA)$ cat config.yaml
# TODO
# persistent layer
log:
level: info
user:
username: admin
password: admin
serviceurl: partya.example.com(PartyB)$ cat config.yaml
# TODO
# persistent layer
log:
level: info
user:
username: admin
password: admin
serviceurl: partyb.example.com操作完上面的步骤,我们通过kubefate version查看KubeFATE环境是否安装完成。
(PartyA)$ kubefate version
* kubefate commandLine version=v1.4.1
* kubefate service version=v1.4.1(PartyB)$ kubefate version
* kubefate commandLine version=v1.4.1
* kubefate service version=v1.4.1如果出现kubefate service version=说明安装成功。
两方的KubeFATE环境已经完成接下来,就可以安装FATE了。
我们TKC是支持LoadBalancer的,所以我们的FATE暴露通过LoadBalancer。
(PartyA)$ cat cluster.yaml
name: fate-9999
namespace: fate-9999
chartName: fate
chartVersion: v1.6.0-a
partyId: 9999
registry: ""
imageTag: ""
pullPolicy:
imagePullSecrets:
- name: myregistrykey
persistence: false
istio:
enabled: false
podSecurityPolicy:
enabled: true # TKC 集群默认是开启podSecurityPolicy验证的,这里需要配置true
modules:
- rollsite
- clustermanager
- nodemanager
- mysql
- python
- fateboard
- client
backend: eggroll
rollsite:
type: LoadBalancer
nodePort: 30091(PartyB)$ cat cluster.yaml
name: fate-10000
namespace: fate-10000
chartName: fate
chartVersion: v1.6.0-a
partyId: 10000
registry: ""
imageTag: ""
pullPolicy:
imagePullSecrets:
- name: myregistrykey
persistence: false
istio:
enabled: false
podSecurityPolicy:
enabled: true # TKC 集群默认是开启podSecurityPolicy验证的,这里需要配置true
modules:
- rollsite
- clustermanager
- nodemanager
- mysql
- python
- fateboard
- client
backend: eggroll
rollsite:
type: LoadBalancer
nodePort: 30101部署FATE前需要先创建对应namespace。
(PartyA)$ kubectl --context=tkc-1 create namespace fate-9999(PartyB)$ kubectl --context=tkc-2 create namespace fate-10000然后kubefate命令部署
(PartyA)$ kubefate cluster install -f cluster.yaml(PartyB)$ kubefate cluster install -f cluster.yaml等待部署成功
(PartyA)$ kubefate job describe <jobID> # 上一步安装cluster会获得<jobID>(PartyB)$ kubefate job describe <jobID> # 上一步安装cluster会获得<jobID>等待job状态成为Success,表示部署成功。
也可以通过kubefate cluster list、kubefate cluster describe <clusterID>查看cluster的状态为Running,表示部署成功。
由于LoadBalancer的IP是LoadBalancer服务实时分配的,所以需要安装完成FATE后,然后再互相配置对方的地址信息。
(PartyA)$ kubectl --context=tkc-1 get svc/rollsite -n fate-9999
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rollsite LoadBalancer 10.103.75.93 192.168.18.132 9370:30091/TCP 12m(PartyB)$ kubectl --context=tkc-2 get svc/rollsite -n fate-10000
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rollsite LoadBalancer 10.99.31.113 192.168.20.136 9370:30101/TCP 12m通过上述命令分别获得双方的rollsite的LoadBalancer的IP。
在cluster.yaml互相配置对方信息
(PartyA)$ cat cluster.yaml
...
rollsite:
type: LoadBalancer
nodePort: 30091
partyList:
- partyId: 10000
partyIp: 192.168.20.136
partyPort: 9370(PartyB)$ cat cluster.yaml
...
rollsite:
type: LoadBalancer
nodePort: 30101
partyList:
- partyId: 9999
partyIp: 192.168.18.132
partyPort: 9370接着更新配置信息
(PartyA)$ kubefate cluster update -f cluster.yaml(PartyB)$ kubefate cluster update -f cluster.yaml等待job状态为Success或者cluster状态为Running表示更新成功。
运行toy_example检查
(PartyA)$ kubectl --context=tkc-1 exec -it svc/fateflow -c python -n fate-9999 -- bash
(app-root) bash-4.2# cd /data/projects/fate/examples/toy_example/
(app-root) bash-4.2# python run_toy_example.py 9999 10000 1
...最后日志出现类似success to calculate secure_sum, it is 2000.0000000000002则表示toy_example互通测试成功
我们在前边的部署中部署了fateboard组件,那么默认情况下可以通过访问http://.fateboard.example.com来查看fateboard页面。
当然在查看之前需要写入hosts文件
(PartyA)$ echo "192.168.18.131 party9999.fateboard.example.com" >> /etc/hosts(PartyB)$ echo "192.168.20.135 party10000.fateboard.example.com" >> /etc/hosts然后就可以通过URL查看fateboard页面页面了。

notebook页面与FATEBoard类似,我们也在前边的部署中部署了client组件,那么默认情况下可以通过访问http://.notebook.example.com来查看notebook页面。
当然在查看之前需要写入hosts文件
(PartyA)$ echo "192.168.18.131 party9999.notebook.example.com" >> /etc/hosts(PartyB)$ echo "192.168.20.135 party10000.notebook.example.com" >> /etc/hosts然后就可以通过URL查看notebook页面页面了。

前边的配置都是使用默认URL,我们也可以通过配置使用自定义的URL。类似如下配置:
(PartyA)$ cat cluster.yaml
...
host:
fateboard: party9999.fateboard.vmware.com
client: party9999.notebook.vmware.com
...(PartyB)$ cat cluster.yaml
...
host:
fateboard: party10000.fateboard.vmware.com
client: party10000.notebook.vmware.com
...然后配置hosts文件。
(PartyA)$ echo "192.168.18.131 party9999.notebook.vmware.com" >> /etc/hosts(PartyB)$ echo "192.168.20.135 party10000.notebook.vmware.com" >> /etc/hosts然后我们更新kubefate cluster update更新cluster配置。更新完成之后,就可以通过 自定义的URL访问UI界面了。