# Fluid开发文档

# 环境需求

  • Git
  • Golang (version >= 1.13)
  • Docker (version >= 19.03)
  • Kubernetes (version >= 1.14)
  • GNU Make

对于Golang的安装与配置,请参考此处 (opens new window)

对于Docker的安装与配置,请参考此处 (opens new window)

Fluid需要使用make命令进行项目构建,使用以下命令安装make

  • Linux
    • sudo apt-get install build-essential

# 编译、运行和调试

# 安装controller-gen

$ go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.3.0
$ cp $GOPATH/bin/controller-gen /usr/local/bin/

通过以上方式安装controller-gen时,如果出现如下错误:

go: cannot use path@version syntax in GOPATH mode

你需要在执行安装之前,首先设置GO111MODULE=on:

export GO111MODULE=on

安装完成后,删除环境变量GO111MODULE:

unset GO111MODULE

# 获取Fluid源码

$ mkdir -p $GOPATH/src/github.com/fluid-cloudnative/
$ cd $GOPATH/src/github.com/fluid-cloudnative
$ git clone https://github.com/fluid-cloudnative/fluid.git

注意:本文在非Go Module模式下完成Fluid的编译、运行和调试。

有关Go module可以参阅 Golang 官方文档 (opens new window) 获取更多信息。

# 编译

Fluid项目根目录下的Makefile文件已经包含了项目开发中的编译、构建、部署等基本逻辑

# 构建dataset-controller, alluxioruntime-controller和csi Binary
$ make build

构建得到的Binary程序位于./bin目录下。

# 镜像构建

  1. 设置镜像名称

    # 为dataset-controller镜像命名
    $ export DATASET_CONTROLLER_IMG=<your-registry>/<your-namespace>/<img-name>
    # 为alluxioruntime-controller镜像命名
    $ export ALLUXIORUNTIME_CONTROLLER_IMG=<your-registry>/<your-namespace>/<img-name>
    # 为CSI插件镜像命名
    $ export CSI_IMG=<your-registry>/<your-namespace>/<csi-img-name>
    # 为init-user镜像命名
    $ export INIT_USERS_IMG=<your-registry>/<your-namespace>/<csi-img-name>
    

    在运行Fluid之前,需要构建镜像并推送到可以访问的镜像仓库中

  2. 登录镜像仓库:

    $ sudo docker login <docker-registry>
    
  3. 构建镜像然后推送到仓库:

    $ make docker-push-all
    

# 运行

接下来的内容将假设在本地环境中已经通过KUBECONFIG环境变量或是在~/.kube/config文件中配置好了可以访问的Kubernetes集群,您可以通过kubectl cluster-info对该配置进行快速检查。更多有关kubeconfig的信息可以参考 Kubernetes官方文档 (opens new window)

以下内容将使用kustomizekubectl 1.14+已经内置了kustomize工具,正在使用kubectl 1.14版本以下的开发者请参考 此处 (opens new window) 获取有关kustomize的更多信息

  1. 将构建的镜像上传到Kubernetes集群可以访问的镜像仓库

    如果构建并上传的镜像在私有仓库中,请确保在kubernetes集群的各个结点上已经成功执行了sudo docker login <docker-registry>操作

  2. 修改config/fluid/patches中各文件的镜像名

    # config/fluid/patches/controller/injections_in_alluxioruntime_controller.yaml
    ...
    ...
    containers:
      - name: manager
        image: <your-registry>/<your-namespace>/<img-name>:<img-tag>
        env:
          - name: DEFAULT_INIT_IMAGE_ENV
    	    value: <your-registry>/<your-namespace>/<img-name>:<img-tag>
    ...
    ...
    
    # config/fluid/patches/controller/injections_in_data_controller.yaml
    ...
    ...
    containers:
      - name: manager
        image: <your-registry>/<your-namespace>/<img-name>:<img-tag>
    ...
    ...
    
    # config/fluid/patches/csi/injections_in_csi_plugin.yaml
    ...
    ...
    containers:
      # change the following two images if necessary
      - name: node-driver-registrar
        image: registry.cn-hangzhou.aliyuncs.com/acs/csi-node-driver-registrar:v1.2.0
      - name: plugins
        image: <your-registry>/<your-namespace>/<img-name>:<img-tag>
    ...
    ...
    
  3. 创建CRD

    $ kubectl apply -k config/crd
    

    检查CRD:

    $ kubectl get crd | grep fluid
    alluxioruntimes.data.fluid.io       2020-11-28T06:20:36Z
    dataloads.data.fluid.io             2020-11-28T06:20:36Z
    datasets.data.fluid.io              2020-11-28T06:20:36Z
    
  4. 创建Fluid各组件

    $ kubectl apply -k config/fluid
    

    检查Fluid组件:

    $ kubectl get pod -n fluid-system
    NAME                                         READY   STATUS    RESTARTS   AGE
    alluxioruntime-controller-5f9d4b899f-6h8xp   1/1     Running   0          8s
    csi-nodeplugin-fluid-hngkl                   2/2     Running   0          8s
    dataset-controller-6bcf4fc7b9-9rm84          1/1     Running   0          8s
    
  5. 编写样例或使用提供的样例

    $ kubectl apply -k config/samples
    

    检查样例pod:

    $ kubectl get pod
    NAME                   READY   STATUS    RESTARTS   AGE
    dataset-fuse-5sz2c             1/1     Running   0          61s
    dataset-master-0               2/2     Running   0          93s
    dataset-worker-nbvrm           2/2     Running   0          61s
    et-operator-769b7864d4-glk7v   1/1     Running   0          11d
    nginx-0                        1/1     Running   0          2m3s
    

    注意: 上述命令可能随您组件的不同实现或是不同的样例产生不同的结果。

  6. 通过日志等方法查看您的组件是否运作正常

    $ kubectl logs -n fluid-system <controller_manager_name>
    
  7. 环境清理

    $ kubectl delete -k config/samples
    $ kubectl delete -k config/fluid
    $ kubectl delete -k config/crd
    

# 单元测试

# 基本测试

在项目根目录下执行如下命令运行基本单元测试(工具类测试和engine测试):

$ make unit-test

# 集成测试

kubebuilder基于envtest (opens new window)提供了controller测试的基本框架,如果您想运行controller测试,您需要执行如下命令安装kubebuilder

$ os=$(go env GOOS)
$ arch=$(go env GOARCH)
$ curl -L https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C /tmp/
$ sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
$ export PATH=$PATH:/usr/local/kubebuilder/bin

接下来,您可以在项目根目录下运行所有的单元测试:

$ make test

如果您在macOS等非linux系统开发,运行测试时若提示exec format error,则需要检查运行测试命令时是否设置了与开发环境不一致的GOOS

# 调试

前提条件

确保环境中已经安装了go-delve,具体安装过程可以参考go-delve安装手册 (opens new window)

本地调试

$ dlv debug cmd/alluxio/main.go

远程调试 在开发Fluid时,通常情况下更为常用的方式是远程调试,确保本机和远程主机均已正确安装了go-delve

在远程主机上:

$ dlv debug --headless --listen ":12345" --log --api-version=2 cmd/alluxio/main.go

这将使得远程主机的调试程序监听指定的端口(e.g. 12345)

在本机上:

$ dlv connect "<remote-addr>:12345" --api-version=2

注意:要进行远程调试,请确保远程主机指定的端口未被占用并且已经对远程主机的防火墙进行了适当的配置