文章目录
- 概述
- 安装nfs服务端
- node节点上安装
- 启动nfs
- 配置StorageClass
- 创建Deployment
- 创建ServiceAccount
- 创建StorageClass对象
- 创建资源对象
- 常见问题
- 参考文档
概述
StorageClass 为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 “配置文件”。
- 查看Kubernetes集群中的默认存储类
kubectl get storageclass
安装nfs服务端
- 找一台新的服务器,作为nfs服务端,然后进行 nfs的安装 【服务器:172.16.11.17】
- 安装nfs
yum install -y nfs-utils
- 创建存放数据的目录
mkdir -p /data/k8s
- 设置挂载路径
# 打开文件
vim /etc/exports
# 添加如下内容
/data/k8s *(rw,no_root_squash)
node节点上安装
- 在k8s集群需要部署应用的node节点安装nfs
yum install -y nfs-utils
启动nfs
- node节点上配置完成后,到nfs服务器启动nfs
systemctl start nfs
配置StorageClass
- 使用StorageClass,需要安装对应的自动配置程序,比如上面我们使用的是nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,也叫它 Provisioner,这个程序使用我们已经配置的nfs服务器,来自动创建持久卷,也就是自动帮我们创建PV。
自动创建的 PV 以 ${namespace} - ${pvcName}- ${pvName} 这样的命名格式创建在 NFS 服务器上的共享数据目录中,而当这个 PV 被回收后会以 archieved- ${namespace}- ${pvcName}- ${pvName} 这样的命名格式存在 NFS 服务器上。
- 当然在部署nfs-client之前,需要先成功安装上 nfs 服务器,上面已经安装好了,服务地址是172.16.11.17,共享数据目录是/data/k8s/,然后部署 nfs-client 即可。
创建Deployment
- 首先配置 Deployment(nfs-client.yaml)
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 172.16.11.17 #替换成自己的nfs服务器
- name: NFS_PATH
value: /data/k8s # 替换成自己的挂载目录
volumes:
- name: nfs-client-root
nfs:
server: 172.16.11.17 #替换成自己的nfs服务器
path: /data/k8s # 替换成自己的挂载目录
创建ServiceAccount
- Deployment使用了一个名为
nfs-client-provisioner
的serviceAccount,所以也需要创建一个 sa,然后绑定上对应的权限。(nfs-client-sa.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
- 新建的一个名为 nfs-client-provisioner 的ServiceAccount,然后绑定了一个名为 nfs-client-provisioner-runner 的ClusterRole,而该ClusterRole声明了一些权限,其中就包括对persistentvolumes的增、删、改、查等权限,所以我们可以利用该ServiceAccount来自动创建 PV。
创建StorageClass对象
- nfs-client 的 Deployment 声明完成后,就可以创建一个StorageClass对象。(nfs-client-class.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
- 声明了一个名为 course-nfs-storage 的StorageClass对象。
- 注意provisioner对应的值一定要和上面的Deployment下面的 PROVISIONER_NAME 这个环境变量的值一样。
创建资源对象
kubectl create -f nfs-client.yaml
kubectl create -f nfs-client-sa.yaml
kubectl create -f nfs-client-class.yaml
- 查看资源状态
kubectl get pods
# 查看存储类
kubectl get storageclass
- 可以设置这个 course-nfs-storage 的 StorageClass 为 Kubernetes 的默认存储后端,我们可以用 kubectl patch 命令来更新。
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- 执行完命令后,我们默认存储类就配置成功了。
kubectl get storageclass
常见问题
问题一
- 部署k8s动态持久卷nfs报错如下:
waiting for a volume to be created, either by external provisioner “gxf-nfs-storage” or manually created by system administrator
- 由于Kubernetes 1.20禁用了selfLink,创建的时候会报错。
vi /etc/kubernetes/manifests/kube-apiserver.yaml
- 添加一行内容
- --feature-gates=RemoveSelfLink=false
- 重新应用
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
- 持续补充中…
参考文档
- nfs-client 文档
- https://blog.csdn.net/weixin_45625174/article/details/123920122
你知道的越多,你不知道的越多。