nfs、localpath作为k8s-storage-class

背景

k8s 作为一个容器调度和管理平台,在无状态的应用调度上有着非常强大的能力。如果我们希望有状态服务也能在 k8s 中运行,那么,在存储上,就需要使用 storage class。

localpath

当我们使用 k3s 时,默认会提供 localpath 的 storage class。 如果要在 k8s 上安装,可以这么操作

  • 拉取资源清单

    1
    wget https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.23/deploy/local-path-storage.yaml
  • 部署资源

    1
    2
    3
    # 默认挂载地址为 /opt/local-path-provisioner, 可自行更改
    # k3s 自带provisioner默认地址为 /var/lib/rancher/k3s/storage
    kubectl apply -f local-path-storage.yaml
  • 测试部署一下

    参考 redis实验环境搭建

    1
    2
    3
    4
    # 添加 bitnami 的 charts 库
    helm repo add bitnami https://charts.bitnami.com/bitnami
    # 拉取 redis 的 chart
    helm fetch bitnami/redis --untar
  • 修改 redis 持久化

    1
    2
    3
    vim redis/values.yaml
    #修改 sc
    storageClass: "rancher.io/local-path"
  • 部署应用

    1
    helm install redis redis/
  • 查看服务情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@prichaos002 ~]# kg svc
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 106m
    redis-headless ClusterIP None <none> 6379/TCP 2m38s
    redis-master ClusterIP 10.43.29.39 <none> 6379/TCP 2m38s
    redis-replicas ClusterIP 10.43.83.221 <none> 6379/TCP 2m38s

    [root@prichaos002 ~]# kgp
    NAME READY STATUS RESTARTS AGE
    redis-master-0 1/1 Running 0 2m41s
    redis-replicas-0 1/1 Running 0 2m41s
  • 查看持久化情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@prichaos002 ~]# kg sc
    NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
    local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 107m

    [root@prichaos002 ~]# kg pv
    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    pvc-57b88546-33f4-4b01-a777-ad634a8fcc19 8Gi RWO Delete Bound default/redis-data-redis-replicas-0 local-path 68m
    pvc-784fdcdd-bd97-4a56-8775-a919ab90184c 8Gi RWO Delete Bound default/redis-data-redis-master-0 local-path 3m9s

    [root@prichaos002 ~]# kg pvc
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    redis-data-redis-replicas-0 Bound pvc-57b88546-33f4-4b01-a777-ad634a8fcc19 8Gi RWO local-path 68m
    redis-data-redis-master-0 Bound pvc-784fdcdd-bd97-4a56-8775-a919ab90184c 8Gi RWO local-path 3m13s
  • 查看实际磁盘情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@prichaos002 ~]# tree /var/lib/rancher/k3s/storage
    /var/lib/rancher/k3s/storage
    ├── pvc-57b88546-33f4-4b01-a777-ad634a8fcc19_default_redis-data-redis-replicas-0
    │   ├── appendonlydir
    │   │   ├── appendonly.aof.2.base.rdb
    │   │   ├── appendonly.aof.2.incr.aof
    │   │   └── appendonly.aof.manifest
    │   └── dump.rdb
    └── pvc-784fdcdd-bd97-4a56-8775-a919ab90184c_default_redis-data-redis-master-0
    └── appendonlydir
    ├── appendonly.aof.1.base.rdb
    ├── appendonly.aof.1.incr.aof
    └── appendonly.aof.manifest

    4 directories, 7 files

nfs

在 k8s 中,所有提供存储能力的组件,实际都是一套实现了 CSI (容器存储接口) 的程序。如果要使用 nfs 作为存储能力提供者,也同样要这么一个实现了接口的程序。

  • 创建 nfs server

参考 一次nfs实操记录

  • 可以使用 helm 创建,也可以直接写清单创建

有一些坑可以参考 参考 nfs-provisioner

  • 查看 sc

    1
    2
    3
    4
    [root@prichaos002 ~]# kg sc
    NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
    local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 132m
    managed-nfs-storage nfs/provisioner Delete Immediate false 39s
  • 修改 redis storageclass

    1
    storageClass: "nfs-client"
  • 在新的 namespace 创建 redis

1
helm install redis-nfs --namespace redisnfs --create-namespace redis/
  • 查看 sc

    1
    2
    3
    4
    [root@prichaos002 ~]# kg sc
    NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
    local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 175m
    nfs-client cluster.local/nfsprovisioner-nfs-provisioner Delete Immediate true 6m5s
  • 查看 nfs 下的目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@prichaos002 data]# tree nfs/
    nfs/
    ├── redisnfs-redis-data-redis-nfs-master-0-pvc-54312889-47cd-45ac-8cc9-582cfb57aedc
    │   └── appendonlydir
    │   ├── appendonly.aof.1.base.rdb
    │   ├── appendonly.aof.1.incr.aof
    │   └── appendonly.aof.manifest
    └── redisnfs-redis-data-redis-nfs-replicas-0-pvc-a61c1d54-c38c-4db7-80db-39a2bc4d1715
    └── appendonlydir
    ├── appendonly.aof.1.base.rdb
    ├── appendonly.aof.1.incr.aof
    └── appendonly.aof.manifest

    4 directories, 6 files

更详细的信息,可以参考 nfs-provisioner

小结

以上两种是最简单的 k8s 持久化方式。当然,如果在公有云上,则有公有云提供的各种存储方案,例如 阿里云的 nas 等。

上述两种均为集中式的存储方案,还有一些分布式的存储方案,后续可以记录一下,例如: rook、 longhorn、ceph 等等。

其他

存储插件是可扩展的,其拓展方式有两种: CSI 和 FlexVolume,一些简单介绍可以查看 存储插件 FlexVolume


Happiness resides not in possessions, and not in gold, happiness dwells in the soul.
Democritus


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!