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

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会自动创建存储桶,如果双方有数据则为成功

