k8s环境使用Operator部署Seaweedfs集群(上)
@作者:闫乾苓
文章目录
- 前言
- 4.1 前置条件
- 4.2 部署seaweedfs-operator
- 4.3 准备operator镜像
- 4.4 使用operator部署Seaweedfs集群
- 4.4.1 部署StorageClass
- 4.4.2 使用StorageClass预先创建PV
前言
SeaweedFS Operator是一个Kubernetes Operator,用于自动化部署和管理SeaweedFS集群 README.md:6-8 。部署分为两个阶段:首先部署Operator本身,然后创建SeaweedFS集群资源。
4.1 前置条件
- 运行中的Kubernetes集群(v1.19+)
- 配置好的kubectl命令行工具
- 安装Kustomize或Helm 3
Helm安装步骤参考:
~# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
~# helm version
4.2 部署seaweedfs-operator
克隆seaweedfs-operator仓库
[root@master ~]# git clone https://githubfast.com/seaweedfs/seaweedfs-operator --depth=1
正克隆到 'seaweedfs-operator'...
remote: Enumerating objects: 136, done.
remote: Counting objects: 100% (136/136), done.
remote: Compressing objects: 100% (112/112), done.
remote: Total 136 (delta 20), reused 65 (delta 14), pack-reused 0 (from 0)
接收对象中: 100% (136/136), 126.64 KiB | 201.00 KiB/s, 完成.
处理 delta 中: 100% (20/20), 完成.
[root@master ~]# ll
[root@master seaweedfs-operator]# docker login -u admin 192.168.61.3
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
4.3 准备operator镜像
手动下载镜像,并复制到k8s相关node节点,并导入。
docker pull registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
docker pull chrislusf/seaweedfs-operator:1.0.2
helm部署seaweedfs-operator,如果因镜像拉取失败等原因导致helm报错,如:
[root@master seaweedfs-operator]# helm install seaweedfs-operator ./deploy/helm
Error: INSTALLATION FAILED: failed post-install: 1 error occurred:* timed out waiting for the condition
待镜像手动拉取并导入到k8s相关节点后,helm 使用—replace参数重新部署。
[root@master seaweedfs-operator]# helm install --replace seaweedfs-operator ./deploy/helm
NAME: seaweedfs-operator
LAST DEPLOYED: Thu Jul 3 13:59:22 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
seaweedfs-operator 运行状态正常
[root@master ~]# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default seaweedfs-operator-5c44d464cc-7bl8g 1/1 Running 0 11m 10.244.166.143 node1 <none> <none>
kube-system calico-kube-controllers-d569cccf-rfxkk 1/1 Running 2 (15h ago) 15h 10.244.135.12 node3 <none> <none>
4.4 使用operator部署Seaweedfs集群
4.4.1 部署StorageClass
(seaweedfs集群部署依赖k8s StorageClass)
为简单起见,本例使用local-pv 的StorageClass
local-pv-storageclass.yaml 内容如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
部署StorageClass并查看
kubectl apply -f local-pv-storageclass.yaml
[root@master ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 25h
4.4.2 使用StorageClass预先创建PV
local pv torageClass 无法根据pvc申请动态创建pv,所以需要集群规划和pvc申请,手动创建pv,本例按照集群规划创建3个volume的副本,2个filer的副本,对应创建3个volume 的pv,2个filer的pv。以下给出2个组件手动创建pv的yaml示例。
volume_local_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: seaweedfs-volume-pv-1
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/seaweedfs-volume-pv-datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node1volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:name: seaweedfs-volume-pv-2
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/seaweedfs-volume-pv-datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node2volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:name: seaweedfs-volume-pv-3
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/seaweedfs-volume-pv-datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node3volumeMode: Filesystemfiler_local_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: seaweedfs-filer-pv-1
spec:capacity:storage: 2GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/seaweedfs-filer-pv-datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node1volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:name: seaweedfs-filer-pv-2
spec:capacity:storage: 2GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/seaweedfs-filer-pv-datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node2volumeMode: Filesystem
创建pv前需要在k8s 相关node节点创建pv的实际映射的目录
mkdir /data/seaweedfs-filer-pv-data
mkdir /data/ seaweedfs-volume-pv-data
创建pv
[root@master cluster]# kubectl apply -f volume_local_pv.yaml -f filer_local_pv.yaml
persistentvolume/seaweedfs-volume-pv-1 created
persistentvolume/seaweedfs-volume-pv-2 created
persistentvolume/seaweedfs-volume-pv-3 created
persistentvolume/seaweedfs-filer-pv-1 created
persistentvolume/seaweedfs-filer-pv-2 created
查看pv状态
[root@master cluster]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
seaweedfs-filer-pv-1 2Gi RWO Retain Available local-storage 46s
seaweedfs-filer-pv-2 2Gi RWO Retain Available local-storage 46s
seaweedfs-volume-pv-1 5Gi RWO Retain Available local-storage 46s
seaweedfs-volume-pv-2 5Gi RWO Retain Available local-storage 46s
seaweedfs-volume-pv-3 5Gi RWO Retain Available local-storage 46s