在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上,所以我们首先分别准备两个工作目录,分别是PartyAPartyB

(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下载。

准备chart

由于我们可以直接访问GitHub也可以不用手动下载chart。如果是离线环境则需要下载并上传chart文件,fate-v1.6.0-a.tgz

检查k8s支持ingress-controller

安装一个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了。

安装KubeFATE

下载安装包文件

$ 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命令行

安装KubeFATE命令工具。

$ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin

KubeFATE命令行工具使用golang编写,你也可以自己编译。

安装KubeFATE service

分别在两个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.yamlserviceurl

(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

操作完上面的步骤,我们通过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=说明安装成功。

安装FATE

两方的KubeFATE环境已经完成接下来,就可以安装FATE了。

配置cluster.yaml

我们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
部署cluster.yaml

部署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 listkubefate 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

我们在前边的部署中部署了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页面页面了。

tkg_fate_board

查看notebook

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页面页面了。

tkg_notebook

自定义UI的URL

前边的配置都是使用默认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界面了。

⚠️ **GitHub.com Fallback** ⚠️