k8s 1.28.2 集群部署 NFS server 和 NFS Subdir External Provisioner
文章目录
- @[toc]
- 前言
- 部署 NFS server
- 镜像准备
- 节点打标签
- 启动 NFS server
- 创建 pv 验证
- 创建 pvc
- 创建 pod 挂载验证
- 部署 NFS Subdir External Provisioner
- 创建 pod 验证
- 提前创建 pvc 的方式
- 使用 volumeClaimTemplates 的方式
文章目录
- @[toc]
- 前言
- 部署 NFS server
- 镜像准备
- 节点打标签
- 启动 NFS server
- 创建 pv 验证
- 创建 pvc
- 创建 pod 挂载验证
- 部署 NFS Subdir External Provisioner
- 创建 pod 验证
- 提前创建 pvc 的方式
- 使用 volumeClaimTemplates 的方式
前言
NFS Subdir External Provisioner
可以使用现有的 NFS 服务器动态创建 pv 和 pvc
- nfs-subdir-external-provisioner
部署 NFS server
镜像准备
这块可以看我之前的博客,这里就不啰嗦了
- 使用 docker 的方式部署 NFS server 提供文件共享能力
节点打标签
采用 hostpath 的方式来持久化 NFS 的共享目录,需要绑定节点不让 NFS 飘移
k label node 192.168.22.124 nfs-server=true
启动 NFS server
- 这里记录两个问题
- NFS 的配置文件,根目录或者说第一个共享目录,需要加上 fsid=0 ,然后挂载的时候直接使用 / ,如果不加 fsid=0,挂载会报错找不到文件或目录,细节什么的,可以看一下官方的手册:exports
- 因为需要本地宿主机挂载 NFS 共享目录到 kubelet 的目录下面,宿主机就没办法使用 svc 的方式来挂载,除非本地 DNS 服务器包含了 k8s 集群内的 DNS,我这边就暂时使用指定的 clusterIP 地址来创建 svc,集群内直接使用 svc 的 ip 地址来挂载 NFS
- 关于 clusterip 的 ip 范围,需要看 apiserver 的
--service-cluster-ip-range
参数,一般都是10.96.0.0/12
,可用的范围在10.96.0.0
到10.111.255.255
之间,找一个集群内不存在的 ip 来用就行- Service ClusterIP 分配
- exports 里面要把 node 节点的 ip 网段,svc 的网段和 pod 的网段都写进去,如果嫌烦,也可以直接写
*
,只要不是对外暴露的,问题不是很大
---
apiVersion: v1
data:exports: |/nfs-share-data 192.168.22.0/24(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)/nfs-share-data 10.96.0.0/12(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)/nfs-share-data 172.22.0.0/16(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
kind: ConfigMap
metadata:name: nfs-server-cmnamespace: storage
---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/name: nfs-servername: nfs-server-svcnamespace: storage
spec:clusterIP: 10.111.111.111ports:- name: tcpport: 2049targetPort: tcpselector:app.kubernetes.io/name: nfs-servertype: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app.kubernetes.io/name: nfs-servername: nfs-servernamespace: storage
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: nfs-serverstrategy:type: RollingUpdatetemplate:metadata:labels:app.kubernetes.io/name: nfs-serverspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: nfs-serveroperator: Invalues:- "true"containers:- env:- name: SHARED_DIRECTORYvalue: /nfs-share-dataimage: nfs-server-2.6.4:alpine-3.20imagePullPolicy: IfNotPresentname: nfs-serverports:- containerPort: 2049name: tcpprotocol: TCPresources:limits:cpu: 1000mmemory: 1024Mirequests:cpu: 100mmemory: 100MisecurityContext:capabilities:add:- SYS_ADMINvolumeMounts:- mountPath: /nfs-share-dataname: nfs-share-data- mountPath: /etc/exportsname: nfs-configsubPath: exportsvolumes:- hostPath:path: /approot/k8s_data/nfs-share-datatype: DirectoryOrCreatename: nfs-share-data- configMap:name: nfs-server-cmname: nfs-config
创建 pv 验证
---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 10.111.111.111path: "/"
创建 pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi
创建 pod 挂载验证
---
apiVersion: v1
kind: Pod
metadata:name: nfs-client
spec:containers:- name: appimage: m.daocloud.io/busybox:1.37command: ["sh", "-c", "while true; do sleep 3600; done"]volumeMounts:- name: nfs-storagemountPath: /mnt/nfsvolumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc
如果 pod 启动有类似如下的报错,可以在 k8s 节点上安装一下
nfs-utils
Warning FailedMount 1s (x7 over 33s) kubelet MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t nfs nfs-server-svc.storage.svc.cluster.local:/nfs-share-data /var/lib/kubelet/pods/9e7abc6f-573c-4c3f-b023-cdceee95722a/volumes/kubernetes.io~nfs/nfs-pv
Output: mount: /var/lib/kubelet/pods/9e7abc6f-573c-4c3f-b023-cdceee95722a/volumes/kubernetes.io~nfs/nfs-pv: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
部署 NFS Subdir External Provisioner
官方也有 helm 的文档,需要用 helm 的,可以直接看官方的:NFS Subdirectory External Provisioner Helm Chart
我这边采用 yaml 编排来部署
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:app: nfs-subdir-external-provisionername: nfs-subdir-external-provisioner-sanamespace: storage
---
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:labels:app: nfs-subdir-external-provisionername: nfs-client
parameters:archiveOnDelete: "true"pathPattern: /
provisioner: cluster.local/nfs-subdir-external-provisioner
reclaimPolicy: Retain
volumeBindingMode: Immediate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:app: nfs-subdir-external-provisionername: nfs-subdir-external-provisioner-runner
rules:
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- persistentvolumesverbs:- get- list- watch- create- delete
- apiGroups:- ""resources:- persistentvolumeclaimsverbs:- get- list- watch- update
- apiGroups:- storage.k8s.ioresources:- storageclassesverbs:- get- list- watch
- apiGroups:- ""resources:- eventsverbs:- create- update- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:app: nfs-subdir-external-provisionername: run-nfs-subdir-external-provisioner
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nfs-subdir-external-provisioner-runner
subjects:
- kind: ServiceAccountname: nfs-subdir-external-provisioner-sanamespace: storage
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:labels:app: nfs-subdir-external-provisionername: leader-locking-nfs-subdir-external-provisionernamespace: storage
rules:
- apiGroups:- ""resources:- endpointsverbs:- get- list- watch- create- update- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:app: nfs-subdir-external-provisionername: leader-locking-nfs-subdir-external-provisionernamespace: storage
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: leader-locking-nfs-subdir-external-provisioner
subjects:
- kind: ServiceAccountname: nfs-subdir-external-provisioner-sanamespace: storage
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nfs-subdir-external-provisionername: nfs-subdir-external-provisionernamespace: storage
spec:replicas: 1selector:matchLabels:app: nfs-subdir-external-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-subdir-external-provisionerspec:containers:- env:- name: PROVISIONER_NAMEvalue: cluster.local/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 10.111.111.111- name: NFS_PATHvalue: /image: docker.m.daocloud.io/registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2imagePullPolicy: IfNotPresentname: nfs-subdir-external-provisionervolumeMounts:- mountPath: /persistentvolumesname: nfs-subdir-external-provisioner-rootserviceAccountName: nfs-subdir-external-provisioner-savolumes:- name: nfs-subdir-external-provisioner-rootnfs:path: /server: 10.111.111.111
创建 pod 验证
提前创建 pvc 的方式
创建 pvc
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim
spec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 1Mi
创建 pod
由于 NFS 这块是直接走的共享目录的根目录,会比较乱,因此 pod 增加了变量,再通过
volumeMounts.subPathExpr
将共享数据存到 pod 名字的目录下
---
kind: Pod
apiVersion: v1
metadata:name: test-pod
spec:containers:- name: test-podimage: m.daocloud.io/busybox:1.37command:- "/bin/sh"args:- "-c"- "touch /mnt/hello && exit 0 || exit 1"env:- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namevolumeMounts:- name: nfs-pvcmountPath: "/mnt"subPathExpr: $(POD_NAME)restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim
可以通过之前创建的 nfs-client 来验证是否创建了 hello 这个文件
kubectl exec -it nfs-client -- ls /mnt/nfs/test-pod/
使用 volumeClaimTemplates 的方式
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: test-sts
spec:replicas: 1selector:matchLabels:app: test-ststemplate:metadata:labels:app: test-stsspec:containers:- name: test-stsimage: m.daocloud.io/busybox:1.37command:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"env:- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namevolumeMounts:- name: nfs-sts-pvcmountPath: "/mnt"subPathExpr: $(POD_NAME)restartPolicy: "Always"volumeClaimTemplates:- metadata:name: nfs-sts-pvcspec:storageClassName: nfs-clientaccessModes:- ReadWriteOnceresources:requests:storage: 10Gi
同样可以通过之前创建的 nfs-client 来验证是否创建了 SUCCESS 这个文件
kubectl exec -it nfs-client -- ls /mnt/nfs/test-sts-0
相关文章:
k8s 1.28.2 集群部署 NFS server 和 NFS Subdir External Provisioner
文章目录 [toc]前言部署 NFS server镜像准备节点打标签启动 NFS server创建 pv 验证创建 pvc创建 pod 挂载验证 部署 NFS Subdir External Provisioner创建 pod 验证提前创建 pvc 的方式使用 volumeClaimTemplates 的方式 前言 NFS Subdir External Provisioner 可以使用现有的…...

前端零基础入门到上班:【Day1】什么是前端?
本来打算开付费专栏 但是想起那句话 赠人玫瑰手留余香 引言1. 什么是前端?1.1 前端的定义1.2 前端的三大核心技术1.3 前端框架和工具 2. 什么是后端?2.1 后端的定义2.2 后端的组成要素2.3 后端框架和工具 3. 前后端的区别4. 什么是前后端分离?…...

搜索二叉树 Binary Search Tree(BST)
【提醒】本章内容需掌握二叉树结构的基本概念和特性,不然可能阅读起来比较费劲。 一、 概念 什么是搜索二叉树?搜索二叉树和普通二叉树的却别是什么? 答: 二叉搜索树又称二叉排序树,它或者是一棵空树 或者是具有以下性…...
数据库表字段插入bug
瀚高数据库 目录 环境 BUG/漏洞编码 症状 触发条件 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5.1 BUG/漏洞编码 3355 症状 数据库安全版v4.5.1,安装包为:hgdb4.5.1-see-centos7-x86-64-20210804.…...

信创环境模拟:X86架构下部署搭建aarch64的ARM虚拟机
在真实系统为x86架构下,搭建arm64的虚拟开发环境。在该环境中直接下载打包项目依赖的python运行环境。 前言 随着国家信创环境的要求普及,基本和国家沾边的政企事业单位都换成了信创环境,即ARM64的cpu服务器,而且该类服务器是不…...
TSO的资料
TSO即TCP Segmentation Offload,相关资料如下: Segmentation Offloads in the Linux Networking StackWhat is TCP Segmentation OffloadUnderstanding TCP Segmentation Offload (TSO) and Large Receive Offload (LRO) in a VMware environment...

OpenCV视觉分析之目标跟踪(3)实现基于金字塔的 Lucas-Kanade 算法来进行稀疏光流计算的类SparsePyrLKOpticalFlow的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 用于计算稀疏光流的类。 该类可以使用带有金字塔的迭代 Lucas-Kanade 方法来计算稀疏特征集的光流 cv::SparsePyrLKOpticalFlow 类是 OpenCV 库…...

乐维网管平台(一):如何精准掌控 IP 管理
业网络已成为支撑业务运转的关键基础设施,而在企业网络管理中,IP 管理至关重要,它就像是网络秩序的守护者,确保网络的高效运行、安全可靠。 一、为什么企业要进行 IP 管理 1. 优化资源分配 IP 地址作为网络中的重要资源…...
React-Route新版本(v6或以上)用法示例
新版本的React-Route (v6或以上,但不排序后续版本还会有修改),移除了Switch,写法和老版本有一些区别,下面分享一个示例: JSX文件: import React, {StrictMode } from react import { createRoot } from react-dom/cli…...

卡方检验方法概述与类型——四格表和R*C表卡方检验案例
卡方检验是以卡方分布为基础,针对定类数据资料的常用假设检验方法。其理论思想是判断实际观测到的频数与有关总体的理论频数是否一致。 卡方统计量是实际频数与理论频数吻合程度的指标。卡方值越小,表明实际观察频数与理论频数越接近,反之卡…...
在浏览器和Node.js环境中使用Puppeteer的Rollup与Webpack打包指南
Puppeteer是一个Node.js库,它提供了一套高级API来通过DevTools协议控制Chrome或Chromium。虽然Puppeteer通常在服务器端使用,但有时你可能需要在浏览器环境中使用它的某些功能。本文将介绍如何使用Rollup和Webpack来打包包含Puppeteer或其轻量级版本Pupp…...
GPT论文整理提示词
论文阅读 指令1:粗读论文 请你阅读并理解这篇文献,然后将该篇文章的标题作为一级标题,将摘要和各个大标题作为二级标题,将小标题作为三级标题,将小标题下每一部分内容作为四级标题,给我以markdown的语言输出中文的翻…...

在培训班学网络安全有用吗
在当今数字化时代,网络安全问题日益凸显,成为了企业和个人关注的焦点。随着对网络安全人才需求的不断增长,各种网络安全培训班也如雨后春笋般涌现。然而,在培训班学网络安全真的有用吗? 一、网络安全的重要性与挑战 1. 信息时代的…...
Flink CDC系列之:理解学习YARN模式
Flink CDC系列之:理解学习YARN模式 准备会话模式在 YARN 上启动 Flink 会话设置 Flink CDC提交 Flink CDC Job Apache Hadoop YARN 是许多数据处理框架中流行的资源提供者。Flink 服务提交给 YARN 的 ResourceManager,后者在由 YARN NodeManagers 管理的…...
langgraph入门
使用langgraph框架搭建一个简易agent。 最近想学习一下agent相关知识,langgraph似乎挺好的,于是就来试一试。langgraph。看了官网,起核心思想是将agent中的角色和工具都当作是图的Node,整个agent流程通过增加Node之间的边来设定。…...

【Python】爬虫程序打包成exe
上一篇写了爬虫获取汽车之家配置表,师父要更方便使用甚至推广(?),反正就是他们没有环境也能用嘛,我就直接打包了,界面不会做也懒得学了、、 1、下载pyinstaller(清华镜像)…...

【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?
这里写目录标题 1、题目描述解释2、算法原理解析3、代码编写 1、题目描述解释 2、算法原理解析 3、代码编写 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int…...
埋点采集的日志数据常见的格式简介
埋点采集的日志数据通常以结构化或半结构化的格式进行记录,以便于分析和处理。常见的格式包括: 1. JSON(JavaScript Object Notation) 特点:JSON 格式是一种轻量级的数据交换格式,具有良好的可读性和兼容…...

基于SSM高考志愿辅助填报系统设计与实现
前言 近年来,由于计算机技术和互联网技术的飞速发展,所以各企事业单位内部的发展趋势是数字化、信息化、无纸化,随着这一趋势,而各种决策系统、辅助系统也就应运而生了,其中,信息管理系统是其中重要的组成…...

elasticsearch 8.x 插件安装(六)之Hanlp插件
elasticsearch 8.x 插件安装(六)之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...