Using Fluid on ARM64 Platform
Prerequisites
Get the latest code of Fluid
The official image for multiple platforms is provided by Fluid community. You can refer to the document to deploy Fluid diretly and jump to the step of Example.
$ mkdir -p $GOPATH/src/github.com/fluid-cloudnative/
$ cd $GOPATH/src/github.com/fluid-cloudnative
$ git clone https://github.com/fluid-cloudnative/fluid.git
$ cd $GOPATH/src/github.com/fluid-cloudnative/fluid
Build AMD64 and ARM64 container images
$ export DOCKER_CLI_EXPERIMENTAL=enabled
$ docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
$ docker buildx create --use --name mybuilder
$ export IMG_REPO=<your docker image repo>
$ make docker-buildx-all-push
Get the built image address and image version
Change the image version in helm chart
$ cd $GOPATH/src/github.com/fluid-cloudnative/fluid/charts/fluid/fluid
$ vim values.yaml
Create an ARM64 based Kubernetes cluster and install helm chart
View ARM64 based nodes
kubectl get no -l kubernetes.io/arch=arm64
NAME STATUS ROLES AGE VERSION
cn-beijing.192.168.3.183 Ready <none> 6d3h v1.22.10
cn-beijing.192.168.3.184 Ready <none> 6d3h v1.22.10
cn-beijing.192.168.3.185 Ready <none> 6d3h v1.22.10
Installation
$ kubectl create ns fluid-system
$ helm install fluid fluid
NAME: fluid
LAST DEPLOYED: Sat Aug 20 21:43:27 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
Example
This example is based on JuiceFSRuntime
-
Creating an ARM64 based Kubernetes cluster
-
Refer to the document to prepare JuiceFS Community Edition
Before using JuiceFS, you need to provide parameters for metadata services (such as Redis) and object storage services (such as MinIO), and create corresponding secrets:
kubectl create secret generic jfs-secret \
--from-literal=metaurl=redis://redis:6379/0 \
--from-literal=access-key=minioadmin \
--from-literal=secret-key=minioadmin
metaurl
: Connection URL for metadata engine (e.g. Redis). Read this document for more information.access-key
: Access key of object storage.secret-key
: Secret key of object storage.
Check Dataset
to be created
$ cat<<EOF >dataset.yaml
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
name: jfsdemo
spec:
mounts:
- name: minio
mountPoint: "juicefs:///"
options:
bucket: "http://minio:9000/minio/test"
storage: "minio"
encryptOptions:
- name: metaurl
valueFrom:
secretKeyRef:
name: jfs-secret
key: metaurl
- name: access-key
valueFrom:
secretKeyRef:
name: jfs-secret
key: access-key
- name: secret-key
valueFrom:
secretKeyRef:
name: jfs-secret
key: secret-key
EOF
mountPoint
: Refers to the subdirectory of JuiceFS, which is the directory where users store data in the JuiceFS file system, starts withjuicefs://
. For example,juicefs:///demo
is the/demo
subdirectory of the JuiceFS file system.bucket
:Bucket URL。For example, using S3 as object storage, and the name of the bucket is test.storage
: Specify the type of storage to be used by the file system, e.g.s3
,gs
,oss
. Read this document for more details.
Attention: Only
name
andmetaurl
are required. If the JuiceFS has been formatted, you only need to fill in thename
andmetaurl
.
Since JuiceFS uses local cache, the corresponding Dataset
supports only one mount, and JuiceFS does not have UFS, you can specify subdirectory in mountPoint
(juicefs:///
represents root directory), and it will be mounted as the root directory into the container.
Create Dataset
$ kubectl create -f dataset.yaml
dataset.data.fluid.io/jfsdemo created
Check Dataset
status
$ kubectl get dataset jfsdemo
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE
jfsdemo NotBound 44s
As shown above, the value of the phase
in status
is NotBound
, which means that the Dataset
resource is not currently bound to any JuiceFSRuntime
resource. Next, we will create JuiceFSRuntime
resource.
Check JuiceFSRuntime
resource to be create
$ cat<<EOF >runtime.yaml
apiVersion: data.fluid.io/v1alpha1
kind: JuiceFSRuntime
metadata:
name: jfsdemo
spec:
replicas: 1
tieredstore:
levels:
- mediumtype: MEM
path: /dev/shm
quota: 4Gi
low: "0.1"
EOF
Create JuiceFSRuntime
$ kubectl create -f runtime.yaml
juicefsruntime.data.fluid.io/jfsdemo created
Check JuiceFSRuntime
$ kubectl get juicefsruntime
NAME AGE
jfsdemo 34s
Wait a while for the various components of JuiceFSRuntime
to start smoothly, and you will see status similar to the following:
$ kubectl get juicefs jfsdemo
NAME WORKER PHASE FUSE PHASE AGE
jfsdemo Ready Ready 2m15s
Then, check the Dataset
status again and find that it has been bound with JuiceFSRuntime
.
$ kubectl get dataset jfsdemo
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE
jfsdemo 0.00B 0.00B 4.00GiB 0.0% Bound 3m16s
Check Pod to be create, the Pod uses the Dataset
created above to specify the PVC with the same name.
$ cat<<EOF >sample.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-app
spec:
containers:
- name: demo
image: nginx
volumeMounts:
- mountPath: /data
name: demo
volumes:
- name: demo
persistentVolumeClaim:
claimName: jfsdemo
EOF
Create Pod
$ kubectl create -f sample.yaml
pod/demo-app created
Check Pod
$ kubectl get po |grep demo
demo-app 1/1 Running 0 31s
jfsdemo-fuse-fx7np 1/1 Running 0 31s
jfsdemo-worker-0 1/1 Running 0 10m
You can see that the pod has been created successfully, and the FUSE component of JuiceFS has also started successfully.