k8s创建默认Storage Class
文章目录
概述
安装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
评论区