k8s集群快速部署NFS存储类

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

本文主要介绍基于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

Comments