裸金属Kubernetes集群StatefulSet有状态应用Volume同步问题咨询
我来帮你搞定这个数据同步的问题!首先得理清你当前遇到的核心问题:你用的HostPath Volume是挂载节点本地的目录,你的两个Worker节点上的/volumes/cloud/是完全独立的,所以当两个Pod分别跑在不同Worker节点上时,它们读的是各自节点的本地数据,自然没法同步。之前你尝试的手动同步文件太繁琐且不可靠,Deployment用HostPath也会有同样问题,而普通HostPath类型的PV本质还是节点本地存储,根本解决不了跨节点共享的需求。
下面给你两个最适合你这种裸金属虚拟集群的解决方案,从易到难:
NFS是裸金属集群里最容易搭建的共享存储,所有节点挂载同一个NFS服务器的目录,不管Pod调度到哪个节点,都能访问同一份数据。
1. 搭建NFS服务器
假设你把Master节点作为NFS服务器(也可以单独找个节点),以Ubuntu/Debian系统为例:
# 安装NFS服务端 sudo apt update && sudo apt install nfs-kernel-server -y # 创建共享目录 sudo mkdir -p /nfs/shared/cloud # 设置权限,让Kubernetes Pod能读写 sudo chown nobody:nogroup /nfs/shared/cloud sudo chmod 777 /nfs/shared/cloud # 配置NFS共享规则,替换成你的集群网段 echo "/nfs/shared/cloud 192.168.56.0/24(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports # 重启NFS服务 sudo systemctl restart nfs-kernel-server
然后在所有Worker节点上安装NFS客户端:
sudo apt update && sudo apt install nfs-common -y
2. 创建NFS类型的PV和PVC
创建nfs-pv.yaml:
apiVersion: v1 kind: PersistentVolume metadata: name: cloud-nfs-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany # 关键:允许多个Pod同时读写 nfs: server: 192.168.56.100 # 替换成你的NFS服务器IP(比如Master的IP) path: /nfs/shared/cloud
创建nfs-pvc.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cloud-nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi
执行创建命令:
kubectl apply -f nfs-pv.yaml kubectl apply -f nfs-pvc.yaml
3. 修改你的StatefulSet配置
把原来的HostPath配置换成引用上面的PVC,修改后的配置如下:
apiVersion: apps/v1 kind: StatefulSet metadata: name: cloud spec: selector: matchLabels: app: cloud serviceName: "cloud" replicas: 2 template: metadata: labels: app: cloud spec: containers: - name: cloud image: owncloud:v2 imagePullPolicy: Never ports: - containerPort: 80 name: web volumeMounts: - name: cloud-volume mountPath: /var/www/html/ # 替换原来的HostPath volumes,改用PVC volumes: - name: cloud-volume persistentVolumeClaim: claimName: cloud-nfs-pvc --- kind: Service apiVersion: v1 metadata: name: cloud spec: selector: app: cloud type: LoadBalancer ports: - protocol: TCP port: 80
这样两个Pod就会挂载同一个NFS共享目录,数据自然就同步了。
如果你需要更可靠的存储(比如某个节点故障时数据不丢失),可以用Longhorn,它是Kubernetes原生的分布式存储,部署简单,适合裸金属集群。
1. 部署Longhorn
你可以通过官方提供的部署清单安装Longhorn,安装完成后,它会自动在每个节点部署存储组件,提供分布式块存储。
2. 创建Longhorn类型的PVC
创建longhorn-pvc.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cloud-longhorn-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: longhorn # Longhorn默认的存储类
3. 修改StatefulSet配置
和方案一一样,把StatefulSet的volumes换成引用这个PVC即可。
- ownCloud这类应用本身需要共享存储,其实用Deployment也能跑,不过你用StatefulSet也没问题,只要共享存储配置正确。
- 绝对不要用HostPath来实现跨Pod数据同步,它的设计就是用于节点本地存储,天生不适合跨节点共享。
- 一定要确保你的存储支持
ReadWriteMany(RWX)访问模式,这样多个Pod才能同时读写同一个卷。
内容的提问来源于stack exchange,提问作者Adi Soyadi




