You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

裸金属Kubernetes集群StatefulSet有状态应用Volume同步问题咨询

我来帮你搞定这个数据同步的问题!首先得理清你当前遇到的核心问题:你用的HostPath Volume是挂载节点本地的目录,你的两个Worker节点上的/volumes/cloud/是完全独立的,所以当两个Pod分别跑在不同Worker节点上时,它们读的是各自节点的本地数据,自然没法同步。之前你尝试的手动同步文件太繁琐且不可靠,Deployment用HostPath也会有同样问题,而普通HostPath类型的PV本质还是节点本地存储,根本解决不了跨节点共享的需求。

下面给你两个最适合你这种裸金属虚拟集群的解决方案,从易到难:

方案一:用NFS共享存储(最快上手)

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分布式存储(高可用场景)

如果你需要更可靠的存储(比如某个节点故障时数据不丢失),可以用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

火山引擎 最新活动