Title

juicefs的介绍及部署

1、juicefs简介

在研发环境中如果使用的是hostpath存储类作为存储的话,在遇到节点宕机的时候会导致容器无法读取本地hostpath的数据,这时候"nfs"与"juicefs"等存储类就可以发挥作用了,相对于服务器来说,专门存储数据不跑主要服务的机器除非断电,不然是很少宕机的,这个时候假设你研发环境
的机器宕机的话,上面的mysql就会转移到其他节点上去,数据仍然是读取存储服务器上的数据,并不会对服务产生影响,若是使用的企业版nas存储之类的设备的话,还能对数据起到管理作用并实现备份

但是相对于nfs存储类,juicefs读取数据的速度比nfs要快,juicefs属于分布式架构,他将元数据存储在redis中(不一定非要redis),真实数据落在了S3对象存储中,在小文件特别多的时候nfs读取数据的速度是完全不及juicefs的,juicefs会将这些文件当成一个文件块,然后通过读取
redis的元数据信息去寻找需要的数据,redis也能做AOF或RDB去保证元数据信息的持久化,且支持高可用,拓展能力强,但是需要一定的学习成本

2、juicefs部署

# 添加repo仓库地址
helm repo add juicedata https://juicedata.github.io/charts/
helm repo update
helm pull juicedata/juicefs-csi-driver --untar
kubectl create ns juicefs

# values.yaml
···
···
  ingress:
    enabled: true
    className: "traefik"                # 有存储类的按照自己的存储类填写,没有的也可以使用NodePort
    annotations:
      traefik.ingress.kubernetes.io/router.entrypoints: websecure
      traefik.ingress.kubernetes.io/router.tls: "true"
      traefik.ingress.kubernetes.io/router.tls.certresolver: stepca
      traefik.ingress.kubernetes.io/redirect-entry-point: websecure
    hosts:
    - host: "juicefs.xwk.local"
      paths:
      - path: /
        pathType: ImplementationSpecific

# 直接部署,确保服务的状态
helm install juicefs -n juicefs -f values.yaml .
[root@master-11 juicefs-csi-driver]# kubectl get pods -n juicefs
NAME                                     READY   STATUS    RESTARTS      
juicefs-csi-controller-0                 3/3     Running   0              
juicefs-csi-controller-1                 3/3     Running   0              
juicefs-csi-dashboard-7f89f9cb9f-vljpb   1/1     Running   0  
juicefs-csi-node-4h6qq                   3/3     Running   0              
juicefs-csi-node-r5nsg                   3/3     Running   0              
juicefs-csi-node-tswn5                   3/3     Running   0  

# 访问dashboard

fe940f53-d046-4ff6-870b-105ff3104b87

3、配置juicefs(其中使用了redis作为元数据存储点,minio作为s3存储桶,需要提前部署)

# juicefs-secret.yaml 将连接信息写成密钥文件
apiVersion: v1
kind: Secret
metadata:
  name: juicefs-sc-secret
  namespace: juicefs
type: Opaque
stringData:
  name: "myjfs"
  metaurl: "redis://:<REDIS_PASSWORD>@redis.juicefs.svc.cluster.local:6379/1"     # redis连接信息,要是redis没有密码的话就不用写":<REDIS_PASSWORD>@"
  storage: "s3"
  bucket: "http://minio.juicefs.svc.cluster.local:9000/mybucket"     # minio桶地址
  access-key: "minioadmin"       # minio用户
  secret-key: "miniopassword"    # minio密码


# juicefs-sc.yaml 创建存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: juicefs
provisioner: csi.juicefs.com
reclaimPolicy: Retain                       # 回收策略
volumeBindingMode: Immediate
allowVolumeExpansion: true                  # 允许扩容
parameters:
  csi.storage.k8s.io/provisioner-secret-name: juicefs-sc-secret
  csi.storage.k8s.io/provisioner-secret-namespace: juicefs
  csi.storage.k8s.io/node-publish-secret-name: juicefs-sc-secret
  csi.storage.k8s.io/node-publish-secret-namespace: juicefs
  csi.storage.k8s.io/controller-expand-secret-name: juicefs-sc-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: juicefs

4、验证

# 确保存储类存在
root@master-11:/etc/kubernetes/charts/juicefs-csi-driver# kubectl get sc | grep juicefs
juicefs              csi.juicefs.com                         Retain          Immediate              true                   19s

# 创建一个pvc
root@master-11:~# kubectl  create ns aaa
namespace/aaa created

root@master-11:~# cat pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-jfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: juicefs

root@master-11:~# kubectl apply -f pvc-test.yaml -n aaa
persistentvolumeclaim/test-jfs-pvc created

# 此处看到pvc绑定即可
root@master-11:~# kubectl get pvc -n aaa
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-jfs-pvc   Bound    pvc-ed5d8243-95a9-4284-99c7-ac3fe5a5a68c   1Gi        RWX            juicefs        5s

# 创建一个测试pod
[root@master-11 ~]# cat pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: juicefs-test-pod
spec:
  containers:
  - name: test
    image: registry.cn-beijing.aliyuncs.com/xwk123/busybox:latest
    command: ["sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: jfs-vol
      mountPath: /data
  volumes:
  - name: jfs-vol
    persistentVolumeClaim:
      claimName: test-jfs-pvc

[root@master-11 ~]# kubectl apply -f pod-test.yaml -n aaa
pod/juicefs-test-pod created

[root@master-11 ~]# kubectl get pods -n aaa
NAME               READY   STATUS    RESTARTS   AGE
juicefs-test-pod   1/1     Running   0          8s

[root@master-11 ~]# kubectl get pods -n juicefs
NAME                                                              READY   STATUS    RESTARTS      
juicefs-csi-controller-0                                          3/3     Running   0            
juicefs-csi-controller-1                                          3/3     Running   0            
juicefs-csi-dashboard-7f89f9cb9f-vljpb                            1/1     Running   0 
juicefs-csi-node-4h6qq                                            3/3     Running   0            
juicefs-csi-node-r5nsg                                            3/3     Running   0             
juicefs-csi-node-tswn5                                            3/3     Running   0             
juicefs-node-12-pvc-ed5d8243-95a9-4284-99c7-ac3fe5a5a68c-jytwgc   1/1     Running   0                      # 会在容器所在节点产生一个新的pod


# 此时查看dashboard和minio,dashboard会显示出pods、pvc与pv的状态,minio会自动创建存储桶,如果双方有数据则为成功

8090d901-83f1-4417-a94e-adee58b02ca6

8ceaf3b6-4176-4cab-80c6-07f9847b48c0

posted @ 2026-01-16 16:46  xwk123  阅读(2)  评论(0)    收藏  举报