k8s-nfs实现创建sc的两种方式

法一:基于 官方 NFS CSI 插件

法二:基于 nfs-subdir-external-provisioner

法一 官方 NFS CSI 插件

大致步骤

bash 复制代码
# 安装 NFS
sudo apt update
sudo apt install -y nfs-kernel-server
# 创建共享目录
sudo mkdir -p /data/nfs
sudo chmod 777 /data/nfs
# 配置 NFS 导出
echo "/data/nfs *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
# 应用配置
sudo exportfs -rav
# 启动并开机自启
sudo systemctl enable --now nfs-kernel-server
# 验证
showmount -e localhost

# 安装nfs csi驱动,可以通过提前将镜像下载到本地
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/v4.6.0/rbac-csi-nfs.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/v4.6.0/csi-nfs-driverinfo.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/v4.6.0/csi-nfs-controller.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/v4.6.0/csi-nfs-node.yaml

#创建sc
cat nfs-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.10.100  #你的nfs
  share: /data/nfs
reclaimPolicy: Retain
volumeBindingMode: Immediate

# 创建
kubectl apply -f nfs-sc.yaml

# 使用pod验证
cat nginx.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
      storageClassName: nfs-csi    

# 启动pod
kubectl apply -f nginx.yaml
# 验证
kubectl get pv,pvc,sc,pod

参考:https://blog.csdn.net/weixin_49343462/article/details/121831380

法二 nfs-subdir-external-provisioner

步骤:

bash 复制代码
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
cd nfs-subdir-external-provisioner/deploy
root@ubuntu-new:/tmp/nfs-subdir-external-provisioner-master/deploy# ls
class.yaml  deployment.yaml  kustomization.yaml  objects  rbac.yaml  test-claim.yaml  test-pod.yaml


# 然后编辑deploy.yaml
      containers:
        - name: nfs-client-provisioner
#         image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner  #可以修改value,修改后,需要将class.yaml文件中的provisioner也进行修改
            - name: NFS_SERVER
              value: 192.168.10.x
            - name: NFS_PATH
              value: /nfs
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.10.x
            path: /nfs

# 创建资源
kubectl apply -f rbac.yaml
kubectl apply -f deployment.yaml
kubectl apply -f class.yaml
kubectl apply -f pvc-test.yaml  # 测试文件
# 通过kubectl get pvc 查看是否成功

参考:https://www.bilibili.com/video/BV1MT411x7GH/?spm_id_from=333.788.videopod.episodes\&p=67