快速搭建K8S集群NFS存储方案

nfs安装步骤

1. 服务器准备

k8s服务器

ip角色系统主机名cpumem
192.168.133.133mastercentos8master28
192.168.133.131node1centos8k8s-node128
192.168.133.128node1centos8k8s-node228

nfs服务器

ip角色系统主机名cpumem用途
192.168.133.133mastercentos8master28k8s主节点

nfs服务器
192.168.133.131node1centos8k8s-node128工作节点
192.168.133.128node1centos8k8s-node228工作节点

创建公共卷

# 创建NFS共享文件夹
mkdir -p /data/nfs/redis/pv{1..6}
#配置共享文件夹
vim  /etc/exports
/data/nfs/redis/pv1  *(rw,sync,no_root_squash)
/data/nfs/redis/pv2  *(rw,sync,no_root_squash)
/data/nfs/redis/pv3  *(rw,sync,no_root_squash)
/data/nfs/redis/pv4  *(rw,sync,no_root_squash)
/data/nfs/redis/pv5  *(rw,sync,no_root_squash)
/data/nfs/redis/pv6  *(rw,sync,no_root_squash)
# 生效
exportfs -r
# 启动NFS
systemctl start nfs-server
systemctl enabled nfs-server
systemctl start rpcbind
systemctl enabled rpcbind

2. 安装nfs

# 192.168.133.133
yum -y install  nfs-utils rpcbind
# 其他工作节点
yum -y install  nfs-utils

3. 创建命名空间(非必要):根据具体业务来。比如部署redis的时候

kubectl create ns redis-cluster

对命名空间设置账号和角色(非必要)

rm -rf redis-nfs-client-sa.yaml
cat > redis-nfs-client-sa.yaml<<EOF
 
# ========== ServiceAccount 配置 ==========
apiVersion: v1
kind: ServiceAccount
metadata:
  # 服务账户名称,将被Provisioner Pod使用
  name: redis-nfs-client
  # 必须与后续资源同一命名空间
  namespace: redis-cluster

--- 
# ========== ClusterRole 集群角色配置 ==========
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 集群角色名称(全局有效)
  name: nfs-client-runner
  namespace: redis-cluster
rules:
	# 核心API组
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    # PV全生命周期管理
    verbs: ["get","list","watch","create","delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    # PVC联动操作权限
    verbs: ["get","list","watch","create","delete"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    # 需读取SC配置
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["events"]
    # 事件记录
    verbs: ["get","list","watch","create","update","patch"]
  - apiGroups: [""]
    resources: ["endpoints"]
    # NFS服务依赖
    verbs: ["create","delete","get","list","watch","patch","update"]

--- 
# ========== ClusterRoleBinding 配置 ==========
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 绑定名称
  name: run-nfs-provisioner
  namespace: redis-cluster
subjects:
  - kind: ServiceAccount
    name: redis-nfs-client
    # 指定服务账户来源命名空间
    namespace: redis-cluster
roleRef:
  kind: ClusterRole
  # 必须与ClusterRole名称一致
  name: nfs-client-runner
  apiGroup: rbac.authorization.k8s.io

EOF

4. 创建nfs客户端(不同的命名空间都需要单独创建)

rm -rf redis-nfs-client.yaml
cat > redis-nfs-client.yaml<<EOF
# ========== 基础部署配置 ==========
apiVersion: apps/v1
kind: Deployment
metadata:
  # 部署名称
  name: redis-nfs-client
  labels:
    # 用于Service/Selector匹配
    app: redis-nfs-client
  # 必须与ServiceAccount同命名空间
  namespace: redis-cluster
# ========== 部署策略配置 ==========
spec:
  # 单副本部署(NFS Provisioner建议单实例)
  replicas: 1
  strategy:
  	# 更新策略:先删除旧Pod再创建新Pod(避免PV冲突)
    type: Recreate
  selector:
    matchLabels:
      # 必须与template.metadata.labels一致
      app: redis-nfs-client
# ========== Pod模板配置 ==========
  template:
    metadata:
      labels:
        # 必须与selector.matchLabels一致
        app: redis-nfs-client
    spec:
      # 关联之前创建的SA
      serviceAccountName: redis-nfs-client
      containers:
        - name: redis-nfs-client
          # 使用阿里云镜像仓库的NFS Provisioner
          image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
          # ========== 存储卷挂载 ==========
          volumeMounts:
            - name: redis-nfs-client-root
              # Provisioner工作目录
              mountPath: /persistentvolumes
          # ========== 关键环境变量 ==========
          env:
            # 必须与StorageClass的provisioner字段完全一致
            - name: PROVISIONER_NAME
              value: my-redis-nfs
            # 即使单副本也建议开启(兼容后续扩展)
            - name: ENABLE_LEADER_ELECTION
              value: "True"
            # NFS服务器地址(需替换为实际IP)
            - name: NFS_SERVER
              value: 192.168.133.133
            # NFS共享路径(需确保目录已存在且有权限)
            - name: NFS_PATH
              value: /data/nfs/redis
      # ========== NFS卷声明 ==========
      volumes:
        - name: redis-nfs-client-root
          nfs:
            # 必须与env.NFS_SERVER一致
            server: 192.168.133.133
            # 必须与env.NFS_PATH一致
            path: /data/nfs/redis
EOF

5. 创建SC(storeclass)存储类

rm -rf redis-sotreclass.yaml
cat > redis-storeclass.yaml<<EOF
 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redis-nfs-storage
  namespace: redis-cluster
provisioner: my-redis-nfs
EOF

6. 执行命令

执行命令使其生效
kubectl apply -f  redis-nfs-client-sa.yaml
 
kubectl apply -f  redis-nfs-client.yaml
 
kubectl apply -f  redis-storeclass.yaml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值