kubernetes如何配置默认存储

如果不想每次都创建PV,希望k8s集群中能够配置号默认存储,然后根据你的PVC自动创建PV,就需要安装一个默认存储,也就是storageclass

什么是storageclass

Kubernetes提供了一套可以自动创建PV的机制,即:Dynamic Provisioning。而这个机制的核心在于StorageClass这个API对象。

StorageClass对象会定义下面两部分内容:

  1. PV的属性。比如,存储类型,Volume的大小等。

  2. 创建这种PV需要用到的存储插件,即存储制备器。

有了这两个信息之后,Kubernetes就能够根据用户提交的PVC,找到一个对应的StorageClass,之后Kubernetes就会调用该StorageClass声明的存储插件,进而创建出需要的PV。但是其实使用起来是一件很简单的事情,你只需要根据自己的需求,编写YAML文件即可,然后使用kubectl create命令执行即可

配置k8s集群中的默认存储

我们使用nfs来作为集群的存储,首先在master节点上安装nfs,并且创建存放数据的目录

复制代码
sudo apt install  nfs-kernel-server -y
# 建立共享目录,修改配置文件
mkdir /data
sudo vim /etc/exports
sudo cat /etc/exports
/data *(rw,sync,no_root_squash,no_subtree_check)    
/data/k8s   *(rw,sync,no_root_squash,no_subtree_check)
# 重启服务,使配置生效
sudo service rpcbind restart
sudo service nfs-kernel-server restart
systemctl enable rpcbind
systemctl enable nfs-kernel-server
exportfs -arv

然后node节点安装nfs的client

复制代码
apt install nfs-common -y

要使用StorageClass,我们就得安装对应的自动配置程序,比如上面我们使用的是nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置的nfs服务器,来自动创建持久卷,也就是自动帮我们创建PV

当然在部署nfs-client之前,我们需要先成功安装上 nfs 服务器,上面已经安装好了,服务地址是172.16.10.50(master的IP),共享数据目录是/data/volume,然后接下来我们部署 nfs-client 即可,我们也可以直接参考 nfs-client 文档,进行安装即可。

我们直接使用helm的方式来部署,提前添加stable的仓库

复制代码
#添加仓库
helm repo add stable https://charts.helm.sh/stable
#安装nfs-client-provisioner
helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=172.16.10.50 --set nfs.path=/data/volume --set storageClass.defaultClass=true --set storageClass.name=nfs-storage

如果没有报错的话,你就能在默认的namespace下看到一个nfs-client-provisioner的Pod在正常运行,后续你在yaml中直接指定PVC的storageClass为nfs-storage就能够正常使用了

报错解析

nfs-client-provisioner在运行过程中查看日志,看到如下报错,创建的一个PVC并没有自动绑定PV,storageclass没有给他创建PV,查看PVC一直处于pending的状态,然后报错信息提示selfLink was empty,这是因为kubernetes1.16版本之后就弃用了selfLink,1.20版本彻底停用,但是nfs-provisioner的实现是基于selfLink功能的,所以才会失败

报错信息如下:

复制代码
E0407 02:18:31.379377       1 controller.go:1004] provision "kubesphere-monitoring-system/prometheus-k8s-db-prometheus-k8s-0" class "nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference

解决方法:

复制代码
修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,找到如下内容后,在最后添加一项参数
spec:
  containers:
    command:
    kube-apiserver
    --advertise-address=192.168.210.20
    --.......  #省略多行内容
    --feature-gates=RemoveSelfLink=false  #添加此行
 等待一下,然后删除apiserver的那个pod,让它重启就可以了

关于storageclass的更多内容可参考博客:K8S 快速入门(十六)实战篇:StorageClass(存储类)-CSDN博客

相关推荐
悠闲蜗牛�3 小时前
人工智能时代下的全栈开发:整合AI、大数据与云原生的实践策略
大数据·人工智能·云原生
荣光波比8 小时前
K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与操作全解析
云原生·容器·kubernetes
伞啊伞8 小时前
K8s概念基础(一)
云原生·容器·kubernetes
Light609 小时前
领码方案|微服务与SOA的世纪对话(6):组织跃迁——智能架构下的团队与文化变革
微服务·云原生·ddd边界·组织双生体·pod协同·文化仪式·ai自演进
hello_2509 小时前
k8s基础监控promql
云原生·容器·kubernetes
静谧之心12 小时前
在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
云原生·容器·golang·kubernetes·开源·pd分离
Serverless 社区12 小时前
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
人工智能·阿里云·云原生·serverless·云计算
小马爱打代码13 小时前
zookeeper:一致性原理和算法
分布式·zookeeper·云原生
1024find16 小时前
Spark on k8s部署
大数据·运维·容器·spark·kubernetes
kura_tsuki17 小时前
[Docker集群] Docker 容器入门
运维·docker·容器