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.yaml
和deployment.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
测试结果
- pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- 删除PVC后,PV被删除且NFS Server对应数据被删除
第二种配置
archiveOnDelete: "false"
reclaimPolicy: Retain
测试结果
- pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
- 重建sc后,新建PVC会绑定新的pv,旧数据可以拷贝到新的PV中
第三种配置
archiveOnDelete: "ture"
reclaimPolicy: Retain
测试结果
- pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
- 重建sc后新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中
第四种配置
archiveOnDelete: "ture"
reclaimPolicy: Delete
测试结果
- pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
- 删除PVC后,PV不会被删除,且状态由Bound变为Released,NFS Server对应数据被保留
- 重建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
模式,比如AWSElasticBlockStore
、 AzureDisk
、 GCEPersistentDisk
和Local
在使用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
相关文章:

K8S配置storage-class
简介 Kubernetes支持NFS存储,需要安装nfs-subdir-external-provisioner,它是一个存储资源自动调配器,它可将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。该组件是对Kubernetes NFS-Client Provisioner的扩展࿰…...

多线程——线程池
目录 前言 一、什么是线程池 1.引入线程池的原因 2.线程池的介绍 二、标准库中的线程池 1.构造方法 2.方法参数 (1)corePoolSize 与 maximumPoolSize (2)keepAliveTime 与 unit (3)workQueue&am…...
VScode插件:前端每日一题
大文件上传如何做断点续传? 在前端实现大文件上传的断点续传,通常会将文件切片并分块上传,记录每块的上传状态,以便在中断或失败时只上传未完成的部分。以下是实现断点续传的主要步骤和思路: 1. 文件切片 (File Slici…...
Android跨进程通信
1、跨进程通信的几种方式 在 Android 中,跨进程通信 (IPC, Inter-Process Communication) 方式有多种,主要用于在不同的应用或进程之间传递数据。常见的跨进程通信方式包括: AIDL (Android Interface Definition Language) • 描述ÿ…...

【初阶数据结构】计数排序 :感受非比较排序的魅力
文章目录 前言1. 什么是计数排序?2. 计数排序的算法思路2.1 绝对位置和相对位置2.2 根据计数数组的信息来确认 3. 计数排序的代码4. 算法分析5. 计数排序的优缺点6.计数排序的应用场景 前言 如果大家仔细思考的话,可能会发现这么一个问题。我们学的七大…...

前后双差速轮之LQR控制
在之前的代码中,我们实现了前后两对双差速轮AGV的运动学正解和逆解。但为了实现对AGV的精确路径跟踪和姿态控制,我们需要引入控制算法。线性二次型调节器(LQR)是一种常用的最优控制方法,可以有效地将系统的状态误差最小化。本文将详细说明如何在之前的C++代码中加入LQR控制…...

Linux之远程连接服务器
1、远程连接服务器简介 (1)什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面…...
k8s 部署 nexus3 详解
创建命名空间 nexus3-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: nexus-ns创建pv&pvc nexus3-pv-pvc.yaml apiVersion: v1 kind: PersistentVolume metadata:name: nfs-pvnamespace: nexus-ns spec:capacity:storage: 3GiaccessModes:- ReadWriteM…...

从“摸黑”到“透视”:AORO A23热成像防爆手机如何改变工业检测?
在工业检测领域,传统的检测手段常因效率低下、精度不足和潜在的安全风险而受到诟病。随着科技的不断进步,一种新兴的检测技术——红外热成像技术,正逐渐在该领域崭露头角。近期,小编对一款集成红外热成像技术的AORO A23防爆手机进…...

让你的 IDEA 使用更流畅 | IDEA内存修改
随着idea使用越来越频繁,笔者最近发现使用过程中有时候会出现卡顿现象,例如,启动软件变慢,打开项目的速度变慢等: 因此如果各位朋友觉得最近也遇到了同样的困惑,不妨跟着笔者一起来设置IDEA的内存大小吧~ …...

docker run 命令解析
docker run 命令解析 docker run 命令用于从给定的镜像启动一个新的容器。这个命令可以包含许多选项,下面是一些常用的选项: -d:后台运行容器,并返回容器ID;-i:以交互模式运行容器,通常与 -t …...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第一个BOSS苍蝇之母
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、战斗场景Battle Scene相关逻辑处理 1.防止玩家走出战斗场景的门2.制作一个简单的战斗场景二、制作游戏第一个BOSS苍蝇之母 1.导入素材和制作相关动画2.制作…...

【Nginx系列】499错误
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Springboot项目控制层注释
Springboot主流的 ----------------------- 简略写法 package com.dx.wlmq.controller;import com.dx.wlmq.domain.Address; import com.dx.wlmq.service.AddresssService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.b…...
从Docker容器中备份整个PostgreSQL
问题 现在需要从Docker容器中备份整个PostgreSQL后,然后,使用备份文件在另外一个pg的docker容器中恢复过来。 步骤 备份旧容器中的PG # 登录到旧的PG容器中 docker exec -it postgres bash # 备份数据库 pg_dumpall -c -U postgres > dump_date %…...

从小需求看大格局:如何用技术智慧赢得客户信任
时间:2024年 10月 26日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频:从小需求看大格局:如何用技术智慧赢得客户信任 欢迎大家回到“小蒋聊技术”,这是一个不只是教你如何写…...

模型 支付矩阵
系列文章 分享 模型,了解更多👉 模型_思维模型目录。策略选择的收益分析工具。 1 支付矩阵的应用 1.1 支付矩阵在市场竞争策略分析中的应用 支付矩阵是一种强大的决策工具,它在多个领域的应用中都发挥着重要作用。以下是一个具体的应用案例…...

擎创科技声明
近日,我司陆续接到求职者反映,有自称是擎创科技招聘人员,冒用“上海擎创信息技术有限公司”名义,用“126.com”的邮箱向求职者发布招聘信息,要求用户下载注册APP,进行在线测评。 对此,我司郑重…...

二叉树习题其六【力扣】【算法学习day.13】
前言 书接上篇文章二叉树习题其四,这篇文章我们将基础拓展 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一…...

互联网的无形眼睛:浏览器指纹与隐私保护攻略
你是否曾有过这样的经历:在某个电商网站上搜索了某件商品,随后无论你打开哪个网页,都能看到与之相关的广告?或者当你再次访问某个网站时,它居然记得你之前的浏览记录?这一切,背后都有一只“看不…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...