nfs安装步骤
1. 服务器准备
k8s服务器
ip | 角色 | 系统 | 主机名 | cpu | mem |
---|---|---|---|---|---|
192.168.133.133 | master | centos8 | master | 2 | 8 |
192.168.133.131 | node1 | centos8 | k8s-node1 | 2 | 8 |
192.168.133.128 | node1 | centos8 | k8s-node2 | 2 | 8 |
nfs服务器
ip | 角色 | 系统 | 主机名 | cpu | mem | 用途 |
---|---|---|---|---|---|---|
192.168.133.133 | master | centos8 | master | 2 | 8 | k8s主节点 兼 nfs服务器 |
192.168.133.131 | node1 | centos8 | k8s-node1 | 2 | 8 | 工作节点 |
192.168.133.128 | node1 | centos8 | k8s-node2 | 2 | 8 | 工作节点 |
创建公共卷
# 创建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