步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

news2024/11/28 0:46:10

在这里插入图片描述
博客原文

文章目录

    • 前言
    • 集群环境
    • nfs 环境搭建
    • pod 挂载 nfs
      • 架构图
    • pvc 方式挂载 nfs
      • 架构图
    • storageclass 方式动态申请 pv
      • 架构图
    • 参考

前言

持久化卷(Persistent Volume, PV)允许用户将外部存储映射到集群,而持久化卷申请(Persistent Volume Claim, PVC)则类似于许可证,使有授权的应用(Pod)可以使用PV。

  • 持久化卷(Persistent Volume,PV)。

  • 持久化卷申请(Persistent Volume Claim,PVC)。

  • 存储类(Storage Class,SC)。

概括地说,PV代表的是Kubernetes中的存储;PVC就像许可证,赋予Pod访问PV的权限;sc则使分配过程是动态的。

集群环境

操作系统: Ubuntu 20.04

IPHostname配置
192.168.254.130master012C 4G 30G
192.168.254.131node012C 4G 30G
192.168.254.132node022C 4G 30G
192.168.254.133nfs-tools2C 4G 30G

nfs 环境搭建

安装 nfs

sudo apt-get install -y nfs-kernel-server  # 安装 NFS服务器端
sudo apt-get install -y nfs-common         # 安装 NFS客户端

nfs服务器端,只在集群中某一台安装即可

创建nfs共享目录

mkdir -p /nfs/share
chmod -R 777 /nfs/share

修改配置 vim /etc/exports

# 当登录NFS主机使用共享目录的使用者是root时,其权限将被转换成为匿名使用者,通常它的UID与GID都会变成nobody身份,添加no_root_squash参数,确保root账户能用
/nfs/share *(rw,sync,no_root_squash)     # * 表示允许任何网段 IP 的系统访问该 NFS 目录

配置生效

exportfs -r
exportfs  # 查看生效

启动服务

sudo /etc/init.d/nfs-kernel-server restart
mount -t nfs 192.168.254.130:/nfs/share /nfsremote -o nolock
  1. 如果提示 mount.nfs: access denied by server while mounting

    在服务器端 ``/etc/exports中加入insecure`

    如: /nfs/share *(insecure,rw,sync,no_root_squash)

实例数据

echo "hello world" > /nfs/share/index.html

pod 挂载 nfs

架构图

image-20240128164131754

pod_nfs.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-testpod
  labels:
    app: nfs-testpod
spec:
  containers:
    - name: nfs-testpod
      image: nginx
      imagePullPolicy: IfNotPresent
      securityContext:
        privileged: true
      ports:
        - containerPort: 80
          hostPort: 8080   # 将该端口暴露在主机的 8080
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: datadir
  restartPolicy: Always
  volumes:
    - name: datadir
      nfs:
        server: 192.168.254.133
        path: /nfs/share

验证结果:

$ k create -f pod_nfs.yaml

$ k get po -owide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-testpod      1/1     Running   0          16m   10.244.196.134   node01   <none>           <none>

$ curl node01:8080
hello world

pvc 方式挂载 nfs

架构图

image-20240128164806076

pod_nfs_pv_pvc.yaml:

# pv 分配资源
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv01
  labels:
    pv: nfs-pv01
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  # 挂载 nfs
  nfs:
    path: /nfs/share
    server: 192.168.254.133
---
# pvc 向一个 pv 去请求资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc01
  labels:
    pv: nfs-pvc01
spec:
  # 向 pv 请求的存储大小
  resources:
    requests:
      storage: 500Mi
  accessModes:
    - ReadWriteMany
  # 通过 label 选择 pv
  selector:
    matchLabels:
      pv: nfs-pv01
---
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pv-pvc-pod
  labels:
    app: nfs-pv-pvc-pod
spec:
  containers:
    - name: nfs-pv-pvc-pod
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          hostPort: 8081   # 暴露 8081 
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: datadir
  restartPolicy: Always
  volumes:
    - name: datadir
      persistentVolumeClaim:
        claimName: nfs-pvc01

验证结果:

$ k get po -owide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-pv-pvc-pod   1/1     Running   0          97s   10.244.196.135   node01   <none>           <none>
nfs-testpod      1/1     Running   0          16m   10.244.196.134   node01   <none>           <none>

$ k get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
nfs-pv01   1Gi        RWX            Retain           Bound    default/nfs-pvc01                  <unset>                          8s
$ k get pvc
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
nfs-pvc01   Bound    nfs-pv01   1Gi        RWX                           <unset>                 10s

$ curl node01:8081
hello world

注意: 1 个 pv 能绑定一个 pvc

storageclass 方式动态申请 pv

架构图

image-20240128165511823

sc 要方式动态申请 pv, 需要一个与存储对应的 provisioner, 可以是云服务器的 provisioner. 参考

我们使用的是 nfs, 所以需要 nfs-provisioner

安装 nfs-provisioner

本次使用的是 nfs-provisionernfs subdir

# 通过 helm 安装, 安装 helm
wget https://get.helm.sh/helm-v3.7.0-linux-amd64.tar.gz 
tar zxvf helm-v3.7.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/


$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
$ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=192.168.254.133 \
    --set nfs.path=/nfs/share
# 也可以 helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner 后修改 values 的值
# 推荐 helm pull 下来后修改镜像地址 aifeierwithinmkt/nfs-subdir-external-provisioner (无法拉取镜像, 我推到 dockerhub的镜像)
NAME: nfs-subdir-external-provisioner
LAST DEPLOYED: Sun Jan 28 15:39:16 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 查看 pod
$ k get po -owide
NAME                                              READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-pv-pvc-pod                                    1/1     Running   0          50m   10.244.196.135   node01   <none>           <none>
nfs-subdir-external-provisioner-f8db66c64-cgpqk   1/1     Running   0          52s   10.244.196.137   node01   <none>           <none>
nfs-testpod                                       1/1     Running   0          65m   10.244.196.134   node01   <none>           <none>

# 我们需要从 pod 中获取 provisioner 的地址(pod 的环境变量), 用作 sc 的 provisioner 地址
k describe po nfs-subdir-external-provisioner-f8db66c64-cgpqk | grep PROVISIONER_NAME

pod_nfs_sc_pvc.yaml:

# 构建 storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-sc
provisioner: cluster.local/nfs-subdir-external-provisioner
mountOptions:
  - nfsvers=4
#parameters:
#  server: nfs-server.example.com
#  path: /share
#  readOnly: "false"
---
# pvc 向一个 pv 去请求资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc02
  labels:
    pv: nfs-pvc02
spec:
  # 向 pv 请求的存储大小
  resources:
    requests:
      storage: 500Mi
  accessModes:
    - ReadWriteMany
  # 指定 storageclass
  storageClassName: nfs-sc
  # 通过 label 选择 pv
#  selector:
#    matchLabels:
#      pv: nfs-pv01
---
apiVersion: v1
kind: Pod
metadata:
  name: nfs-sc-pvc-pod
  labels:
    app: nfs-sc-pvc-pod
spec:
  containers:
    - name: nfs-sc-pvc-pod
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          hostPort: 8082
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: datadir
  restartPolicy: Always
  volumes:
    - name: datadir
      persistentVolumeClaim:
        claimName: nfs-pvc02

验证结果:

$ k get po -owide
NAME                                              READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-sc-pvc-pod                                    1/1     Running   0          10s   10.244.196.138   node01   <none>           <none>

$ k get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
nfs-pvc02   Bound    pvc-7ebac745-38f2-4ea7-8d18-0465f6fdf2d1   500Mi      RWX            nfs-sc         <unset>                 2m4s

$ curl node01:8082
hello world

参考

  1. https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#nfs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java][算法 滑动窗口]Day 02---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

【Django】Django内建用户系统

Django内建用户系统 14.1 Django中的用户认证 Django带有一个用户认证系统系统&#xff0c;它处理用户用户账号、组、权限以及基于cookie的用户会话。 用户可以直接使用Django自带的用户表。 官方文档&#xff1a;https://docs.djangoproject.com/zh-hans/2.2/topics/auth/ …

计算机组成原理 2 数据表示

机器数 研究机器内的数据表示&#xff0c;目的在于组织数据&#xff0c;方便计算机硬件直接使用。 需要考虑&#xff1a; 支持的数据类型&#xff1b; 能表示的数据精度&#xff1b; 是否有利于软件的移植 能表示的数据范围&#xff1b; 存储和处理的代价&#xff1b; ... 真值…

ELAdmin 配置定时任务

定义方法 在自己的 Module 中写个要执行的方法。 比如获取微信公众号的 accessToken&#xff0c;每两个小时更新一次。这种的其实使用 Spring 的 Scheduled 更方便些&#xff0c;此处仅为演示。 package me.zhengjie.mp.task;import com.alibaba.fastjson.JSON; import lombo…

基于Linux的nfs、samba网络服务搭建

我学的Ubuntu&#xff0c;以它为例子 一、nfs(linux <---> linux) 1.1.nfs首先搭建服务端&#xff08;对外共享&#xff09; //安装nfs核心服务 sudo apt update sudo apt install nfs-kernel-server //配置nfs文件(指定共享文件) sudo vim /etc/exports //重启nf…

H5 渐变3D旋转个人主页引导页源码

H5 渐变3D旋转个人主页引导页源码 源码介绍&#xff1a;一款渐变3D旋转个人主页引导页源码&#xff0c;可以做个人主页/旗下网站引导 下载地址&#xff1a; https://www.changyouzuhao.cn/10392.html

第三百四十五回

文章目录 1. 概念介绍2. 方法与功能2.1 基本用法2.2 加密算法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容&#xff0c;本章回中将介绍一个加密工具包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 加密主要…

【MySQL进阶之路】通过实操理解 explain 执行计划

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

【刷题记录】——2024寒假day9编程题

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 1.目录大纲&#xff1a; 2.题目链接&#xff1a; T1:LINK T2:LINK 3.详解思路&#xff1a; T1: 思路&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/#include<…

计算机网络——11EMail

EMail 电子邮件&#xff08;EMail&#xff09; 3个主要组成部分 用户代理邮件服务器简单邮件传输协议&#xff1a;SMTP 用户代理 又名“邮件阅读器”撰写、编辑和阅读邮件输入和输出邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户的邮件输出报文队列保持待发…

【成长记录】第一次写博客入csdn榜单了 还是第一.....

庆祝一下第一次拿综合榜榜一 Java内容榜第二 总之谢谢大家支持 小苏会继续努力的 可以看看我的新作 嘻嘻&#x1f601;&#x1f924;&#x1f449;&#x1f3fb;&#x1f448;&#x1f3fb; 谢谢大家

web3知识体系汇总

web3.0知识体系 1.行业发展 2. web3的特点&#xff1a; 1、统一身份认证系统 2、数据确权与授权 3、隐私保护与抗审查 4、去中心化运行 Web3.0思维技术思维✖金融思维✖社群思维✖产业思维”&#xff0c;才能从容理解未来Web3.0时代的大趋势。 3.技术栈 Web3.jsSolidit…

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…

2.14数据结构与算法学习日记

洛谷P1934 封印 题目背景 很久以前&#xff0c;魔界大旱&#xff0c;水井全部干涸&#xff0c;温度也越来越高。为了拯救居民&#xff0c;夜叉族国王龙溟希望能打破神魔之井&#xff0c;进入人界“窃取”水灵珠&#xff0c;以修复大地水脉。可是六界之间皆有封印&#xff0c;…

洛谷_P1059 [NOIP2006 普及组] 明明的随机数_python写法

这道题的关键在于去重和排序&#xff0c;去重可以联想到集合&#xff0c;那排序直接使用sort方法。 n int(input()) data set(map(int,input().split( ))) data list(data) data.sort() print(len(data)) for i in data:print(i,end )

Python编程之旅:从入门到精通

在数字世界的无尽宇宙中&#xff0c;Python无疑是一颗璀璨的明星。其简洁易懂的语法、丰富的库和广泛的应用领域&#xff0c;使得Python成为了众多初学者的首选编程语言。那么&#xff0c;如何学习Python呢&#xff1f;本文将带你一步步踏上Python编程的旅程。 一、入门篇&…

1.Electron初始与安装

这里写目录标题 一、前言二、下载三、简要总结 一、前言 原文以及该系列后续文章请参考&#xff1a;安装Electron 随着前端的不断强盛&#xff0c;现在的前端已经不再满足于网页开发了&#xff0c;而是在尝试能否使用前端的开发逻辑来开发PC端的桌面软件。 即用html、js、css…

软件价值12-射箭游戏

射箭游戏&#xff0c;按空格键发射&#xff0c;打击移动靶&#xff0c;左上角显示成绩状态。 代码&#xff1a; import pygame import sys import random# 初始化Pygame pygame.init()# 设置窗口大小 SCREEN_WIDTH 800 SCREEN_HEIGHT 600 screen pygame.display.set_mode((…

leetcode:55.跳跃游戏

1.解题思路&#xff1a;贪心算法看最大覆盖范围 2.模拟过程&#xff1a; 1.若数组长度等于1&#xff0c;直接返回True 2.循环遍历覆盖范围&#xff0c;选取最大的覆盖范围&#xff1b;若覆盖范围覆盖到了最后一个元素&#xff0c;直接返回true. 3.代码&#xff1a;(贪心无套…

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…