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 的持久化存储支持,解决 "没有存储类" 的问题。

相关推荐
qq_312920114 分钟前
K8s存储类(StorageClass)设计与Ceph集成实战
ceph·容器·kubernetes
Nazi64 分钟前
kubeadm部署k8s集群环境搭建
云原生·容器·kubernetes
Brilliantee4048 分钟前
藏在 K8s 幕后的记忆中枢(etcd)
容器·kubernetes·etcd
草明10 分钟前
docker stats 增加一列容器名称的显示
java·开发语言·docker
焯集新人2 小时前
K8S高可用集群
云原生·容器·kubernetes
楚禾Noah2 小时前
【通用常识】YAML 中的高阶语法
运维·docker·容器
东心十10 小时前
Win11安装WSL、Docker Desktop
运维·docker·容器
tb_first13 小时前
k8sday13数据存储(1.5/2)
linux·运维·服务器·云原生·容器·kubernetes
星眠海雾13 小时前
k8s集合
云原生·容器·kubernetes
hhzz15 小时前
Rancher部署的K8S集群服务节点上执行 kubectl 命令
容器·kubernetes·rancher