K8S配置storage-class

简介

Kubernetes支持NFS存储,需要安装nfs-subdir-external-provisioner,它是一个存储资源自动调配器,它可将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。该组件是对Kubernetes NFS-Client Provisioner的扩展, nfs-client-provisioner已经不提供更新,而且nfs-client-provisioner Github 仓库也已经处于归档状态,已经迁移到nfs-subdir-external-provisioner的仓库
rbac.yamldeployment.yaml创建在任何空间都可以,storage class是集群资源,不受名称空间限制
获取NFS Subdir External Provisioner部署文件

$ wget https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/archive/refs/tags/nfs-subdir-external-provisioner-4.0.18.zip
$ unzip -o nfs-subdir-external-provisioner-4.0.18.zip
$ cd nfs-subdir-external-provisioner-nfs-subdir-external-provisioner-4.0.18/deploy/
$ ls

在这里插入图片描述

创建名称空间

$ kubectl create ns nacos-test

创建RBAC资源

$ sed -i'' "s/namespace:.*/namespace: nacos-test/g"  rbac.yaml  deployment.yaml
$ kubectl create -f  rbac.yaml

在这里插入图片描述

$ vim deployment.yaml

注意:/data/nfs/nacos目录一定要提前创建好
在这里插入图片描述

$ kubectl apply -f  deployment.yaml

在这里插入图片描述

$ kubectl get deployment,pods -n nacos-test

在这里插入图片描述

部署Storage Class

$ vim class.yaml

在这里插入图片描述
注意:Storage class的配置参数一定要提前编辑好,Storage Class一旦被创建,则无法修改,如需更改只能删除原Storage class资源对象并重新创建。"${.PVC.namespace}/${.PVC.name}"添加后,archiveOnDelete的值为true,当删除pvc后,数据目录会被移动到nfs服务器的共享目录下和名称空间同级的以archive开头的目录

$ kubectl apply -f class.yaml

在这里插入图片描述

$ kubectl get sc

在这里插入图片描述

设置默认Storage Class

在这里插入图片描述

$ kubectl get sc

在这里插入图片描述

创建测试PVC

$ vim test-claim.yaml

在这里插入图片描述

$ kubectl apply -f test-claim.yaml
$ kubectl get pvc -n nacos-test

在这里插入图片描述

创建测试pod

$ vim test-pod.yaml

在这里插入图片描述

$ kubectl apply -f test-pod.yaml
$ kubectl get pod -n nacos-test

在这里插入图片描述

查看文件写入

在这里插入图片描述

查看pod内挂载

$ kubectl exec -it test-pod -n nacos-test -- sh -c "df -h"

在这里插入图片描述
注意:在输出结果中可以看到挂载的NFS存储的可用空间为6.1T(这是整个磁盘的大小),而不是PVC中分配的1G,所以storage class申请的是动态资源,只要空间足够大,就不会出现数据卷资源不够的情况。
PV名称格式是pvc+随机字符串,所以每次只要不删除PVC,那么Kubernetes中PV与存储绑定将不会丢失,要是删除PVC也就意味着删除了绑定的文件夹,下次就算重新创建相同名称的PVC,生成的文件夹名称也不会一致,因为PV名是随机生成的字符串,而文件夹命名又跟PV有关,所以删除PVC需谨慎

测试删除pod和pvc

$ kubectl delete -f test-pod.yaml test-claim.yaml
$ kubectl get pod -n nacos-test

在这里插入图片描述

查看NFS数据目录

在这里插入图片描述
从结果中可以看到Kubernetes删除PVC后,在NFS存储层并没有立即删除PVC对应的数据目录及数据,而是将原来的数据目录改名为archived-+原有数据目录名称的形式。 该结果与配置Storage Class时的参数archiveOnDelete的值设置为true的预期相符

Storage Class回收策略

第一种配置

archiveOnDelete: "false"
reclaimPolicy: Delete   #默认没有配置,默认值为Delete

测试结果

  1. pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  2. sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  3. 删除PVC后,PV被删除且NFS Server对应数据被删除

第二种配置

archiveOnDelete: "false"
reclaimPolicy: Retain

测试结果

  1. pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  2. sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  3. 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
  4. 重建sc后,新建PVC会绑定新的pv,旧数据可以拷贝到新的PV中

第三种配置

archiveOnDelete: "ture" 
reclaimPolicy: Retain

测试结果

  1. pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  2. sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  3. 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
  4. 重建sc后新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

第四种配置

archiveOnDelete: "ture"
reclaimPolicy: Delete 

测试结果

  1. pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  2. sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
  3. 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
  4. 重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

设置默认的Storage Class

在Kubernetes中,管理员可以为有不同存储需求的PVC创建相应的Storage Class来提供动态的存储资源(PV)供应,同时在集群级别设置一个默认的Storage Class,为那些未指定Storage Class的PVC使用。管理员要明确系统默认提供的Storage Class应满足和符合PVC的资源需求,同时注意避免资源浪费
要在集群中启用默认的Storage Class,就需要在kube-apiserver服务准入控制器–enableadmission-plugins中开启 DefaultStorageClass(从 Kubernetes 1.10版本开始默认开启)

--enable-admission-plugins=.. ., DefaultStorageClass

然后在Storage Class的定义中设置一个annotation

kind: Storageclass
apiVersion: storage.k8s.io/v1 
metadata:
    name: gold
annotations:
    storageclass.beta.kubernetes.io/is-default-class="true" 
provisioner: kubernetes.io/gce-pd
parameters:
    type: pd-ssd

存储绑定模式

Immediate绑定模式

存储绑定模式的默认值为Immediate,表示当一个PersistentVolumeClaim (PVC)创建出来时,就动态创建PV并进行PVC与PV的绑定操作。需要注意的是,对于拓扑受限 (Topology-limited) 或无法从全部Node访问的后端存储,将在不了解Pod调度需求的情况下完成PV的绑定操作,这可能会导致某些Pod无法完成调度

WaitForFirstConsumer绑定模式

WaitForFirstConsumer绑定模式表示PVC与PV的绑定操作延迟到第一个使用PVC的Pod创建出来时再进行。系统将根据Pod的调度需求,在Pod所在的Node上创建PV,这些调度需求可以通过以下条件(不限于)进行设置

  • Pod对资源的需求
  • Node Selector
  • Pod亲和性和反亲和性设置
  • Taint和Toleration设置

目前支持WaitForFirstConsumer绑定模式的存储卷包括:AWSElasticBlockStore、AzureDisk、GCEPersistentDisk。另外有些存储插件通过预先创建好的PV绑定支持WaitForFirstConsumer模式,比如AWSElasticBlockStoreAzureDiskGCEPersistentDiskLocal
在使用WaitForFirstConsumer模式的环境中,如果仍然希望基于特定拓扑信息(Topology)进行PV绑定操作,则在Storage Class的定义中还可以通过allowedTopologies字段进行设置。下面的例子通过matchLabelExpressions设置目标Node的标签选择条件(zone=us-central1-a或us-central1-b)PV将在满足这些条件的Node上允许创建

apiVersion: storage.k8s.io/v1
kind: StorageClass 
metadata:
    name: standard
provisioner: kubernetes.io/gce-pd 
parameters:
    type: pd-standard
volumeBindingMode: WaitForFirstConsumer 
allowedTopologies:
- matchLabelExpressions:
 - key: failure-domain.beta.kubernetes.io/zone 
   vallues:
   - us-central1-a
   - us-central1-b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html生成图片方案总结

动态图片生成是我们日常开发中经常遇到的需求,比如宣传海报生成,电商商品图动态生成等,本文总结出三种常见的 HTML 生成图片的方案。 一、html2canvas html2canvas库能够将 HTML 元素渲染为 Canvas,然后将其转换为图片。它的优点…

【力扣刷题实战】相同的树

大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 相同的树 题目描述 示例 1: 示例 2: 示例 3: 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码(C语言) 兄弟们共勉 &#…

如何使用AdsPower指纹浏览器克服爬虫技术限制,安全高效进行爬虫!

随着中国开发者日益成熟,应用质量明显提升,越来越多的开发者选择出海寻找机会扩大市场。但“应用出海”说起来容易,做起来难。其中,最大的困恼就是对海外市场缺乏了解。 很多开发者会选择使用网络爬虫(Web Crawling&a…

Python小游戏18——中国象棋

首先,你需要安装Pygame库。如果你还没有安装它,可以使用以下命令进行安装: bash pip install pygame 运行结果 代码如下: python import pygame import sys # 初始化Pygame pygame.init() # 屏幕尺寸 SCREEN_WIDTH 800 SCREEN_HE…

轴承寿命预测 (Python 预测模型全家桶)

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

【IC验证_systemverilog】信号类型

IC验证_systemverilog 1.信号声明2.变量类型3.数据类型4.符号 1.信号声明 语法: 变量类型 信号类型 符号转换 位宽 信号名 深度;2.变量类型 (1)说明: systemverilog中的信号类型主要分为线网类型(wire&a…

camera和lidar外参标定

雷达和相机的外参标定(外部参数标定)指的是确定两者之间的旋转和平移关系,使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…

照片不完整?来试试智能扩图,简直不要太满意!(不是广告)

生活中有些照片拍过之后,当时觉得很满意,但过段时间就恨当初没有拍一张完整的图片! ——来自小白的感慨 当时跟家里的叮当一起去旅游,我给他拍了一张好看的照片: 今天这张照片如果是整图就好了!好气哦&am…

在银河麒麟系统中Qt连接达梦数据库

解决在银河麒麟系统中使用Qt连接达梦数据库提示:project Error library odbc is not defined问题 一、编译ODBC 下载解压unixODBC(http://www.unixodbc.org/unixODBC-2.3.1.tar.gz) 打开终端,切换到unixODBC-2.3.1目录下&#x…

【WebDriver】浏览器驱动下载及其配置

一、Windows电脑环境搭建-Chrome浏览器 行业内,Chrome (谷歌) 浏览器对于自动化程序来讲是比较稳定的. 自动化程序推荐使用 Chrome 浏览器的原因有几个: 开发者工具:Chrome 提供强大的开发者工具,方便调试和测试自动化脚本。 稳…

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解 目录 时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新独家)TTNRBO-VMD改进牛顿-拉夫逊优化算优化变分模态分解TTNRBO–VMD 优化VMD分解层数K和…

深度图和RGB图对齐

坐标系间的转换_坐标系转换-CSDN博客 深度图与彩色图的配准与对齐_彩色 深度 配准-CSDN博客 kinect 2.0 SDK学习笔记(四)--深度图与彩色图对齐_mapdepthframetocolorspace-CSDN博客 相机标定(三)-相机成像模型_相机小孔成像模型…

天润融通突破AI客服局限,三大关键提升文本机器人问答效果

近期,AI客服再次登上热搜,引发网友集体吐槽,比如AI客服虽然态度客气,但听不懂客户诉求,回答问题驴唇不对马嘴,解决不了问题...... 更有网友将这些问题升级到,企业就是不想解决问题才交给AI客服…

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景:微服务之黑马商城项目-登录拦截器在网关完成用户的校验,并将用户信息(用户id)存入请求头,假设将购物车里面的商品进行结算就会生成订单并清空购物车,这里涉及到了交易服务模块远程调用购物车模块&…

Java避坑案例 - “激进”的线程池扩容策略及实现

文章目录 问题思路线程池的默认行为自定义线程池扩容策略Code实现小结 问题 Java 线程池是先用工作队列来存放来不及处理的任务,满了之后再扩容线程池。当我们的工作队列设置得很大时,最大线程数这个参数显得没有意义,因为队列很难满&#x…

OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

C++设计模式结构型模式———适配器模式

文章目录 一、引言二、适配器模式三、类适配器四、总结 一、引言 适配器模式是一种结构型设计模式,它在日常生活中有着广泛的应用,比如各种转换接头和电源适配器,它们的主要作用是解决接口不兼容的问题。就像使用电源适配器将220V的市电转换…

【Clickhouse】客户端连接工具配置

ClickHouse 是什么 ClickHouse 是一个分布式实时分析型列式存储数据库。具备高性能,支撑PB级数据,提供实时分析,稳定可扩展等特性。适用于数据仓库、BI报表、监控系统、互联网用户行为分析、广告投放业务以及工业、物联网等分析和时序应用场…

巴西电商市场神仙打架,美客多多月蝉联访问量榜首,9月Temu位居巴西APP下载量榜首

巴西电商市场近年来呈现出强劲的增长趋势,预计2024年巴西电子商务市场的销售额将达到2043亿雷亚尔(约合373亿美元),同比增长约10%。作为拉美地区最大的经济体,巴西吸引了众多电商平台和商家,巴西电商市场竞…

Remix中struct入参

Remix中struct入参 // SPDX-License-Identifier: MIT pragma solidity 0.8.28;contract StructDemo {struct Student {uint256 id;string name;}// 初始化一个结构体Student public student;function initStudent5(Student memory _stu) public {student _stu;} }结构体最终…