k8s集群快速部署NFS存储类

本文最后更新于 1153 天前, 如有失效请评论区留言.

本文主要介绍基于 CFS 或者 NFS 来实现 k8s 存储类功能

由于 TKE 集群 CSI 功能相对 ACK 比较鸡肋, 相对阿里云 NAS CSI. 我们只需要 SC 自动改创建 CFS 类型的 PV 和 PVC.
我们的使用场景是不同 PV 使用同一个 CFS 不同路径, 或者不同 CFS 可以共享资源包(成本问题,创建 PV 数目比较多), 恰恰这两点 TKE 都不支持。 对此使用社区的 nfs-client-provisioner 项目来实现动态创建 CFS 文件系统中的子路径

CFS 部署实践

CFS 是腾讯云自研的分布式文件系统, 与 NFS 类似, 由腾讯云提供 SLA 保证

提前创建 CFS 实例并配置好资源包

NFS 部署实践

简单记录一下在 Linux 部署 NFS

服务端部署

在Debian上安装NFS
apt-get -y install nfs-common nfs-kernel-server
mkdir /k8sshare
chmod 777 /k8sshare
echo "/k8sshare/ *(insecure,rw,sync,no_root_squash,no_subtree_check)" > /etc/exports
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
exportfs -r
# 测试是否生效
showmount -e 127.0.0.1
Export list for 127.0.0.1:
/k8sshare *
在CentOS上安装NFS 类似哈, 只是安装的包不一样
yum install nfs-utils
systemctl enable rpcbind --now
systemctl enable nfs --now

客户端安装

# Debian
apt install nfs-common
# CentOS
yum install nfs-utils

部署存储类

这里简单操作, 使用 helm 部署

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm upgrade -i nfs -n kube-system nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set image.repository=ccr.ccs.tencentyun.com/k7scn/nfs-subdir-external-provisioner \
    --set nfs.server=<ip> \
    --set nfs.path=<path> \
    --set storageClass.defaultClass=true \
    --set storageClass.name=opencfs

参数说明

nfs.server: cfs或者nfs的ip nfs.path: cfs或者nfs的路径, 如上面的nfs的`/k8sshare`
storageClass.defaultClass: 默认存储类
storageClass.name: 存储类名称

默认这些参数已经足够了,如果需要更多参数, 请参考 kubernetes-sigs/nfs-subdir-external-provisioner

查看动态存储类

kubectl get sc
NAME                PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
opencfs (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   4s

测试

测试前提: 每个节点都需要安装 nfs 客户端哦

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cfs-volume-test
spec:
  storageClassName: opencfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: cfs-volume-test

Chapters

Sponsor

Like this article? $1 reward

Comments