温馨提示×

Kubernetes与Ubuntu的存储集成方法

小樊
42
2025-08-31 21:50:52
栏目: 云计算

Kubernetes与Ubuntu存储集成方法

1. HostPath存储(适用于小型集群/测试环境)

HostPath存储将数据保存在Ubuntu节点的本地文件系统中,配置步骤简单,但无法跨节点共享,不推荐生产环境使用。

  • 创建HostPath PersistentVolume (PV):定义PV的容量、访问模式及本地路径(如/mnt/data)。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: ubuntu-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/data"
      persistentVolumeReclaimPolicy: Retain
    
  • 创建PersistentVolumeClaim (PVC):声明所需的存储容量(如10Gi)及访问模式。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ubuntu-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: hostpath
    
  • 在Pod中使用PVC:通过volumeMounts将PVC挂载到容器内的指定路径(如/usr/share/nginx/html)。

2. NFS存储(适用于跨节点共享场景)

NFS通过网络共享存储,支持多Pod同时读写,适合需要共享数据的场景(如WordPress、Jenkins)。

  • 在Ubuntu上部署NFS服务器:安装nfs-kernel-server,配置共享目录(如/path/to/shared/folder),并重启服务。
    sudo apt update
    sudo apt install nfs-kernel-server
    echo "/path/to/shared/folder *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
    sudo systemctl restart nfs-kernel-server
    
  • 在Kubernetes中创建NFS PV:定义PV的NFS服务器地址及共享路径。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nfs-pv
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      nfs:
        server: <ubuntu-nfs-server-ip>
        path: "/path/to/shared/folder"
    
  • 创建NFS PVC:声明存储需求(如1Gi),并通过storageClassName关联PV。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
    
  • 在Pod中挂载NFS PVC:将PVC挂载到容器内的目标路径(如/usr/share/nginx/html)。
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pod
    spec:
      containers:
      - name: nfs-container
        image: nginx
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nfs-volume
      volumes:
      - name: nfs-volume
        persistentVolumeClaim:
          claimName: nfs-pvc
    

3. 动态存储(以NFS为例,适用于生产环境)

动态存储通过StorageClass自动创建PV,无需手动预先定义,提升存储管理效率。

  • 安装NFS客户端工具:在Ubuntu节点上安装nfs-common,用于访问NFS服务器。
    sudo apt update
    sudo apt install nfs-common
    
  • 创建NFS StorageClass:定义存储插件的provisioner(如kubernetes.io/nfs)及NFS服务器参数(serverpath)。
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
    provisioner: kubernetes.io/nfs
    parameters:
      server: <ubuntu-nfs-server-ip>
      path: "/path/to/nfs/share"
    
  • 创建PVC并关联StorageClass:通过storageClassName指定动态存储类,Kubernetes会自动创建PV。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: dynamic-nfs-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: nfs-storage
      resources:
        requests:
          storage: 2Gi
    
  • 在Pod中使用动态PVC:将PVC挂载到容器内,存储卷会自动创建并绑定。
    apiVersion: v1
    kind: Pod
    metadata:
      name: dynamic-nfs-pod
    spec:
      containers:
      - name: dynamic-nfs-container
        image: nginx
        volumeMounts:
        - mountPath: "/data"
          name: dynamic-nfs-volume
      volumes:
      - name: dynamic-nfs-volume
        persistentVolumeClaim:
          claimName: dynamic-nfs-pvc
    

4. 分布式存储(以Rook-Ceph为例,适用于企业级场景)

Rook-Ceph是Kubernetes原生的分布式存储解决方案,提供高性能、高可用的块存储、对象存储及文件存储,适合大规模生产环境。

  • 在Ubuntu上部署Rook-Ceph:通过Helm或YAML文件安装Rook Operator及Ceph集群。
    kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
    kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml
    
  • 创建StorageClass:使用Rook提供的存储类(如rook-ceph-block),支持动态创建Ceph RBD卷。
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: rook-ceph-block
    provisioner: rook-ceph.rbd.csi.ceph.com
    parameters:
      clusterID: <rook-cluster-id>
      pool: replicapool
      imageFeatures: layering
      csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
      csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
      csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
      csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
    
  • 创建PVC并使用:通过storageClassName关联Rook存储类,Pod可直接挂载分布式存储卷。

5. 对象存储(以S3为例,适用于大规模非结构化数据)

S3对象存储适合存储大规模非结构化数据(如图片、视频、日志),Kubernetes可通过CSI驱动集成S3。

  • 安装S3 CSI驱动:部署S3 CSI驱动到Kubernetes集群,支持动态创建S3存储卷。
    git clone https://github.com/kubernetes-incubator/external-storage.git
    cd external-storage/s3
    kubectl create -f deploy/kubernetes-s3-csi-driver.yaml
    
  • 创建S3 StorageClass:配置S3存储桶名称、区域、访问密钥等参数。
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: s3-storage
    provisioner: s3.csi.k8s.io
    parameters:
      type: s3
      bucket: <s3-bucket-name>
      prefix: ""
      region: <s3-region>
      secretKey: <s3-access-key>
      accessKey: <s3-secret-key>
    
  • 创建PVC及Deployment:通过PVC关联S3存储类,Deployment将S3卷挂载到容器内(如/data)。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: s3-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: s3-storage
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: s3-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: s3-app
      template:
        metadata:
          labels:
            app: s3-app
        spec:
          containers:
          - name: s3-container
            image: busybox
            command: ["sleep", "3600"]
            volumeMounts:
            - mountPath: "/data"
              name: s3-storage
          volumes:
          - name: s3-storage
            persistentVolumeClaim:
              claimName: s3-pvc
    

0