CI/CD(三) 安装nfs并指定k8s默认storageClass

一、NFS 服务端安装(主节点 10.60.0.20)

1. 安装 NFS 服务端

sudo apt update

sudo apt install -y nfs-kernel-server

2. 创建共享目录并配置权限

sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s

# 允许匿名访问

sudo chmod 777 /data/k8s

3. 配置 NFS 导出规则

编辑 /etc/exports 文件:

sudo nano /etc/exports

添加以下内容(允许从节点读写):

/data/k8s *(rw,sync,no_subtree_check,no_root_squash)

4. 启动并验证 NFS 服务

sudo systemctl restart nfs-kernel-server

sudo systemctl enable nfs-kernel-server

# 检查导出列表

sudo exportfs -v

二、NFS 客户端安装(所有节点)

1. 所有节点安装 NFS 客户端

sudo apt update sudo apt install -y nfs-common

2. 手动挂载测试(可选)

# 在从节点测试挂载

sudo mkdir -p /mnt/nfs

sudo mount 10.60.0.20:/data/k8s /mnt/nfs

# 验证挂载

df -h | grep nfs

3. 配置持久化挂载(所有节点)

sudo nano /etc/fstab

添加:

10.60.0.20:/data/k8s /mnt/nfs nfs defaults 0 0

执行挂载:

sudo mount -a

三、Kubernetes 配置 NFS 存储类

1. 创建 ServiceAccount 和 RBAC 权限
bash 复制代码
# nfs-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nfs-provisioner-binding
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

应用配置:

bash 复制代码
kubectl apply -f nfs-rbac.yaml
2. 部署 NFS Provisioner
bash 复制代码
# nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-provisioner
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
        - name: nfs-client
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 10.60.0.20  # 主节点 IP
            - name: NFS_PATH
              value: /data/k8s    # 共享目录路径
          volumeMounts:
            - name: nfs-root
              mountPath: /persistentvolumes
      volumes:
        - name: nfs-root
          nfs:
            server: 10.60.0.20
            path: /data/k8s
应用配置:
bash 复制代码
kubectl apply -f nfs-provisioner.yaml
3. 创建默认 StorageClass
bash 复制代码
# nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs
parameters:
  archiveOnDelete: "false"

应用配置:

bash 复制代码
kubectl apply -f nfs-storageclass.yaml

四、验证存储类

检查存储类状态

bash 复制代码
kubectl get sc
# 输出应显示 nfs-storage 为 DEFAULT

测试 PVC 创建

bash 复制代码
# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 1Gi

应用并验证:

bash 复制代码
kubectl apply -f test-pvc.yaml
kubectl get pvc test-pvc  # 状态应为 Bound

常见问题处理

  • 挂载失败 :检查主节点防火墙是否开放 2049(NFS)、111(RPC)端口

  • PVC 未绑定 :检查 nfs-provisioner Pod 日志:

    bash 复制代码
    kubectl logs -l app=nfs-provisioner
  • 权限拒绝 :确保共享目录权限为 777,且 /etc/exports 中配置了 no_root_squash

    通过以上步骤,可为 Kubernetes 集群提供基于 NFS 的持久化存储支持,解决 "没有存储类" 的问题。

相关推荐
别骂我h2 小时前
容器技术技术入门与Docker环境部署
java·spring cloud·docker
最不会程序的程序猿2 小时前
docker执行yum报错Could not resolve host: mirrorlist.centos.org
docker·容器·centos
蚊子不吸吸2 小时前
在Docker、KVM、K8S常见主要命令以及在Centos7.9中部署的关键步骤学习备存
linux·学习·docker·kubernetes·centos·k8s·kvm
萌新小码农‍2 小时前
Docker简单介绍与使用以及下载对应镜像(项目前置)
docker·容器·eureka
风清再凯4 小时前
docker基础入门于应用的实践
运维·docker·容器
格桑阿sir4 小时前
Kubernetes控制平面组件:Kubelet详解(八):容器存储接口 CSI
kubernetes·storageclass·csi·hostpath·emptydir·存储卷·pv/pvc
惊起白鸽4505 小时前
容器技术技术入门与Docker环境部署
java·spring cloud·docker
David爱编程5 小时前
用 AppArmor 与 Seccomp 锁死容器的“危险行为”!
docker·云原生·容器
YUNYINGXIA5 小时前
Docker
docker·云原生
Bruk.Liu8 小时前
《使用IDEA插件部署Spring Boot项目到Docker》
spring boot·docker·intellij-idea