Kubernetes中常见的volumes数据卷

华子目录

  • volumes
    • k8s支持的卷的类型
    • `emptyDir`卷
      • 功能
      • `emptyDir`的使用场景
      • 示例
    • `hostPath`卷
      • 功能
      • 用法
      • 安全隐患
      • 示例
    • `nfs`卷
      • 功能
      • 应用
      • 示例:部署一台`nfs服务器`并在所有`k8s节点`中安装`nfs-utils`

volumes

  • 容器文件磁盘上临时存放的,这给容器中运行的特殊应用程序带来一些问题
    • 容器崩溃时,kubelet重新启动容器容器中的文件将会丢失,因为容器会以干净状态重建
    • 当在一个Pod同时运行多个容器时,常常需要在这些容器之间共享文件
  • Kubernetes数据卷具有明确生命周期与使用它的Pod具有相同的生命周期
  • Kubernetes数据卷Pod中运行的任何容器存活期都长,在容器重新启动数据也会得到保留
  • 当一个Pod不再存在时,Kubernetes数据卷也将不再存在
  • Kubernetes可以支持许多类型的卷Pod也能同时使用任意数量的卷
  • Kubernetes数据卷不能挂载其他Kubernetes卷,也不能其他卷硬链接
  • Pod中的每个容器必须单独指定每个挂载位置

k8s支持的卷的类型

官网:https://kubernetes.io/zh/docs/concepts/storage/volumes/
k8s支持的类型如下:

  • awsElasticBlockStore 、azureDisk、azureFile、cephfs、cinder、configMap、csi
  • downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flocker
  • gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local
  • nfs、persistentVolumeClaim、projected、portworxVolume、quobyte、rbd
  • scaleIO、secret、storageos、vsphereVolume

emptyDir

功能

  • Pod指定到某个node节点上时,首先创建的是一个emptyDir卷
  • 并且只要Pod在该节点上运行,一直存在
  • 最初是的。
  • 尽管Pod中的容器挂载 emptyDir卷路径可能相同可能不同,但是这些容器都可以读写emptyDir卷相同的文件
  • Pod因为某些原因被从节点删除时,emptyDir卷中的数据也会永久删除

emptyDir的使用场景

  • 缓存空间,例如基于磁盘归并排序
  • 耗时较长计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行
  • Web服务器容器服务数据时,保存内容管理器容器获取的文件
[root@k8s-master ~]# mkdir volume
[root@k8s-master ~]# cd volume/

示例

  • 创建一个名为testpod自主式podpod中运行一个busyboxplus和一个nginx两个容器共用同一个卷
#创建一个名为testpod的自主式pod,pod中运行一个busyboxplus和一个nginx,两个容器共用同一个卷
[root@k8s-master volume]# vim pod1.yml
[root@k8s-master volume]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: busyboxplusname: busyboxpluscommand: ["/bin/sh","-c","sleep 10000"]volumeMounts:   #声明容器的挂载点- name: vol1   #将k8s中名为vol1的卷挂载到容器中/volume1位置mountPath: /volume1- image: nginxname: nginxvolumeMounts:   #声明容器的挂载点- name: vol1   #将k8s中名为vol1的卷挂载到容器中/usr/share/nginx/html位置mountPath: /usr/share/nginx/htmlvolumes:   #定义Pod中可以使用的所有卷- name: vol1   #为卷指定了一个名称vol1,这个名称将在Pod的volumeMounts部分被引用,以便容器可以挂载这个卷。emptyDir:  #表明这个卷是一个emptyDir卷,主要用于临时数据的存储medium: Memory   #指定了emptyDir卷的存储介质为内存,这意味着卷的内容将存储在节点的RAM中,而不是磁盘上。使用内存作为存储介质可以提供更快的读写速度,但数据不是持久的,一旦Pod被删除或节点发生故障,数据就会丢失。sizeLimit: 100Mi  #为emptyDir卷设置了100MiB的大小限制。当卷中的数据量达到这个限制时,写入操作可能会被阻止
[root@k8s-master volume]# kubectl apply -f pod1.yml
pod/testpod created
[root@k8s-master volume]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
testpod   2/2     Running   0          30s   10.244.2.33   k8s-node2.org   <none>           <none>
#查看testpod的详细信息
[root@k8s-master volume]# kubectl describe pods testpod

在这里插入图片描述
在这里插入图片描述

#发现了了busyboxplus中的挂载目录/volume1
[root@k8s-master volume]# kubectl exec -it pods/testpod -c busyboxplus -- /bin/sh
/ # ls
bin      etc      lib      linuxrc  mnt      proc     run      sys      usr      volume1
dev      home     lib64    media    opt      root     sbin     tmp      var
/ # cd volume1/    #因为volume1和nginx中的/usr/share/nginx/html是共用的同一个名为vol1的卷,所以数据都是共享的
/volume1 # ls
/volume1 # echo hello world > index.html  #我们在busyboxplus中的volume1挂载目录中创建一个index.html文件,这个index.html文件就自动同步到nginx中的/usr/share/nginx/html目录下
/volume1 # ls
index.html
/volume1 # curl localhost  #因为pod中所有容器都是共享同一个pod中的所有资源,所以在busyboxplus中是可以访问到nginx的
hello world#这条命令的作用是使用/dev/zero作为输入源,创建一个名为bigfile的文件,该文件的大小为99MB
/volume1 # dd if=/dev/zero of=bigfile bs=1M count=99
99+0 records in
99+0 records out
/volume1 # dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
99+1 records out
/volume1 # dd if=/dev/zero of=bigfile bs=1M count=101  #因为我们对emptyDir卷设置的最大空间是100M,这个101M超出了,所以会报错
dd: writing 'bigfile': No space left on device
101+0 records in
99+1 records out
  • dd: 这是一个在Unix类Unix系统中用于转换复制文件命令。它可以用来创建文件副本,同时对其进行各种转换
  • if=/dev/zero: if代表输入文件input_file)。/dev/zero是一个特殊的设备文件读取它会产生无限的零0x00字节)。使用/dev/zero作为输入源意味着你正在创建一个全部零字节组成的文件
  • of=bigfile: of代表输出文件output_file)。这里指定输出文件的名称为bigfile
  • bs=1M: bs代表块大小block_size)。这里设置为1M,意味着每次读取写入操作处理的数据块大小1MB兆字节
  • count=99: count代表要复制块的数量。这里设置为99,意味着从输入文件读取99个块并写入到输出文件。由于每个块大小1MB,所以最终生成文件大小将是99MB
#回收
[root@k8s-master volume]# kubectl delete -f pod1.yml
pod "testpod" deleted

hostPath

功能

  • hostPath卷能将node主机节点文件系统上的文件目录挂载到Pod中,不会因为pod关闭而被删除
  • hostPath想当于docker -v操作
  • hostPath卷会创建在被调度node主机上

用法

  • 运行一个需要访问Docker引擎内部机制pod中的容器,挂载/var/lib/docker路径
  • 容器中运行cAdvisor监控) 时,以hostPath方式挂载/sys
  • 允许Pod指定给定的hostPath在运行Pod之前是否应该存在,是否应该创建以及应该以什么方式存在

安全隐患

  • 具有相同配置(例如从podTemplate创建)的多个Pod会由于node节点文件不同而在不同节点上有不同的行为
  • Kubernetes按照计划添加资源感知调度时,这类调度机制无法考虑hostPath使用的资源
  • 基础主机上创建的文件目录只能由root用户写入。需要在特权容器中以root身份运行进程,或者修改主机上的文件权限以便容器能够写入hostPath卷

示例

  • 创建一个名为testpod自主式pod,运行一个名为nginx容器,再声明一个hostPath类型
#创建一个名为testpod的自主式pod,运行一个名为nginx的容器,在声明一个hostPath类型的卷
[root@k8s-master volume]# vim pod2.yml
[root@k8s-master volume]# cat pod2.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: nginxname: nginxvolumeMounts:   #容器挂载点声明- name: vol2   #将k8s中名为vol2的卷挂载到容器中的/usr/share/nginx/html位置mountPath: /usr/share/nginx/html  #挂载点目录volumes:   #pod中的卷- name: vol2  #指定一个名为vol2的卷hostPath:  #这个卷的类型是hostPath类型path: /huazi   #在被调度的node节点上创建huazi这个目录type: DirectoryOrCreate   #当/huazi目录不存在时自动建立
[root@k8s-master volume]# kubectl apply -f pod2.yml
pod/testpod created
[root@k8s-master volume]# kubectl describe pods testpod

在这里插入图片描述

#我们发现调度到了node2主机上
[root@k8s-master volume]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
testpod   1/1     Running   0          17s   10.244.2.34   k8s-node2.org   <none>           <none>
#我们发现在node2节点上创建了/huazi/这个目录
[root@k8s-node2 ~]# ls /
afs  boot  etc       home   lib    media  opt   root  sbin  sys  usr
bin  dev   guangpan  huazi  lib64  mnt    proc  run   srv   tmp  var

在这里插入图片描述

#当我们第一次访问的时候是403,因为nginx中/usr/share/nginx/html目录下没有index.html文件
[root@k8s-master volume]# curl 10.244.2.34
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.27.1</center>
</body>
</html>
#在node2上,进入/huazi目录中,创建index.html文件
[root@k8s-node2 ~]# cd /huazi/
[root@k8s-node2 huazi]# echo hello world > index.html
#这时再访问,就有效果了
[root@k8s-master volume]# curl 10.244.2.34
hello world
#回收
[root@k8s-master volume]# kubectl delete -f pod2.yml
pod "testpod" deleted

nfs

功能

  • nfs卷允许将一个现有的nfs服务器上的目录挂载到Kubernetes中的Pod中。这对于在多个Pod之间共享数据持久化存储数据非常有用

应用

  • 例如,如果有多个容器需要访问相同的数据集,或者需要将容器中的数据持久保存到外部存储nfs卷可以提供一种方便的解决方案

示例:部署一台nfs服务器并在所有k8s节点中安装nfs-utils

这里,我就在harbor主机上部署nfs服务器

  • 部署nfs服务端
[root@harbor ~]# yum install nfs-utils -y
  • 部署nfs客户端
[root@k8s-master ~]# yum install nfs-utils -y
[root@k8s-node1 ~]# yum install nfs-utils -y
[root@k8s-node2 ~]# yum install nfs-utils -y
  • 启动服务端
[root@harbor ~]# systemctl enable --now nfs-server
  • 服务端创建nfs共享目录
[root@harbor ~]# mkdir /nfsdata
  • 编辑服务端/etc/exports文件
[root@harbor ~]# vim /etc/exports
[root@harbor ~]# cat /etc/exports
/nfsdata  *(rw,sync,no_root_squash)
[root@harbor ~]# exportfs -rv
exporting *:/nfsdata
  • 客户端连接服务端
#172.25.254.250是nfs服务端的ip
[root@k8s-master ~]# showmount -e 172.25.254.250
Export list for 172.25.254.250:
/nfsdata *
[root@k8s-node1 ~]# showmount -e 172.25.254.250
Export list for 172.25.254.250:
/nfsdata *
[root@k8s-node2 ~]# showmount -e 172.25.254.250
Export list for 172.25.254.250:
/nfsdata *
  • 创建一个名为testpod自主式pod,运行一个nginx容器容器挂载名为vol3vol3卷的类型为nfs
#创建一个名为testpod的自主式pod,运行一个nginx容器,容器中挂载名为vol3的卷,vol3卷的类型为nfs
[root@k8s-master volume]# vim pod3.yml
[root@k8s-master volume]# cat pod3.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: nginxname: nginxvolumeMounts:- name: vol3   #将名字为vol3的卷,挂载到nginx容器中的/usr/share/nginx/html位置mountPath: /usr/share/nginx/htmlvolumes:  #pod存储卷定义的开始- name: vol3  #pod存储卷的名称nfs:   #pod存储卷的类型是NFSserver: 172.25.254.250  #NFS服务器的IP地址path: /nfsdata  #nfs服务器上的共享目录
[root@k8s-master volume]# kubectl apply -f pod3.yml
pod/testpod created
[root@k8s-master volume]# kubectl describe pods testpod

在这里插入图片描述

[root@k8s-master volume]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
testpod   1/1     Running   0          97s   10.244.2.35   k8s-node2.org   <none>           <none>
#当我们第一次访问的时候是403,因为nginx中/usr/share/nginx/html目录下没有index.html文件
[root@k8s-master volume]# curl 10.244.2.35
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.27.1</center>
</body>
</html>
#在nfs服务器上,进入/nfsdata共享目录中,创建index.html文件
[root@harbor ~]# cd /nfsdata/
[root@harbor nfsdata]# echo hello world > index.html
#再次访问,就看到效果了
[root@k8s-master volume]# curl 10.244.2.35
hello world

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

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

相关文章

PaddleNLP的FAQ问答机器人

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DDRNet模型创新实现人像分割】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

Windows的MySQL开机自动启动问题

标题 问题描述 问题描述 在Windows系统中&#xff0c;我设置好了MySQL服务为自动启动&#xff0c;但在开机后发现MySQL服务任没有自动运行。我有点苦恼&#xff0c;每次连接MySQL&#xff0c;都要进入计算机管理&#xff0c;手动打开。 解决方法&#xff1a; 1.前提安装好MySQ…

基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大&#xff0c;容错率…

计算机毕业设计 | 基于SpringBoot的健身房管理系统(附源码)

1&#xff0c;项目背景 随着人们生活水平的提高和健康意识的增强&#xff0c;健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求&#xff0c;需要一种更加高效、智能、安全的管理系…

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)

【LetMeFly】685.冗余连接 II&#xff1a;并查集&#xff08;和I有何不同分析&#xff09;——详细题解(附图) 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection-ii/ 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&…

前端请求后端接口报错(blocked:mixed-content),以及解决办法

报错原因&#xff1a;被浏览器拦截了&#xff0c;因为接口地址不是https的。 什么是混合内容&#xff08;Mixed Content&#xff09; 混合内容是指在同一页面中同时包含安全&#xff08;HTTPS&#xff09;和非安全&#xff08;HTTP&#xff09;资源的情况。当浏览器试图加载非…

SMTP协议,即简单邮件传输协议

SMTP协议&#xff0c;即简单邮件传输协议&#xff08;Simple Mail Transfer Protocol&#xff09;&#xff0c;是一种用于发送电子邮件的互联网标准。以下是对SMTP协议的详细介绍&#xff1a; 一、定义与工作原理 SMTP定义了邮件服务器之间以及邮件客户端与服务器之间的通信规…

Xss_less靶场攻略(1-18)

xss-lab-less1 ur特殊字符转义 存在url中 转义符为 %2B& 转义符为 %26空格 转义符为 或 %20/ 转义符为 %2F? 转义符为 %3F% 转义符为 %25#转义符为 %23 转义符为 %3Dimg 标签懒加载 在XSS攻击中&#xff0c;img标签的src属性是一个常见的攻击向量&#xff0c;因为它可以…

Unity humanoid 模型头发动画失效问题

在上一篇【Unity实战笔记】第二十二 提到humanoid 模型会使原先的头发动画失效&#xff0c;如下图所示&#xff1a; 头发摆动的是generic模型和动画&#xff0c;不动的是humanoid模型和动画 一开始我是尝试过在模型Optimize Game objects手动添加缺失的头发骨骼的&#xff0c;奈…

基于MATLAB的战术手势识别

手势识别的研究起步于20世纪末&#xff0c;由于计算机技术的发展&#xff0c;特别是近年来虚拟现实技术的发展&#xff0c;手势识别的研究也到达一个新的高度。熵分析法是韩国的李金石、李振恩等人通过从背景复杂的视频数据中分割出人的手势形状&#xff0c;然后计算手型的质心…

CSS学习之Grid网格布局基本概念、容器属性

网格布局 网格布局&#xff08;Grid&#xff09;是将网页划分成一个个网格单元&#xff0c;可任意组合不同的网格&#xff0c;轻松实现各种布局效果&#xff0c;也是目前CSS中最强大布局方案&#xff0c;比Flex更强大。 基本概念 容器和项目 当一个 HTML 元素将 display 属性…

Yelp 数据集进行用户画像, 使用聚类做推荐

使用 Yelp 数据集进行用户画像&#xff08;User Profiling&#xff09;是一项有趣的任务&#xff0c;可以理解用户的偏好、行为和特征。以下是总结的一个基本的步骤&#xff0c;帮助构建用户画像 pandas 加载数据&#xff1a; import pandas as pd# 加载数据 users pd.read_…

JAVA题目笔记(十) 带有继承结构的JavaBean类

一、创建带有继承结构的标准JavaBean类(1) public class Worker {private String name;private int workid;private int salary;public Worker(){}public Worker(String name,int workid,int payment){this.namename;this.salarypayment;this.workidworkid;}public void eat(){…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;我们必须保证两台Mysql数据库的数据完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库…

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1&#xff1a;zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘&#xff08;最低&#xff09; 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如&#xff0c;二维空间中的向量可以表示为 (&#x1d465;,&#x1d466;) &#xff0c;表示从原点 (0,0)到点 (&#x1d465;,&#x1d466;)的有向线段。 1.1、文本向量 1…

串口屏控制的自动滑轨(未完工)

序言 疫情期间自己制作了一个自动滑轨&#xff0c;基于无线遥控的&#xff0c;但是整体太大了&#xff0c;非常不方便携带&#xff0c;所以重新设计了一个新的&#xff0c;以2020铝型材做导轨的滑轨&#xff0c;目前2020做滑轨已经很成熟了&#xff0c;配件也都非常便宜&#x…

如何使用Get进行状态管理

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 相关组件3. 示例代码4. 内容总结我们在上一章回中介绍了"使用get进行依赖管理"相关的内容,本章回中将介绍如何使用get进行状态管理一.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在Flutter开发中状态管理…

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫&#xff0c;因为官网下载需要用公司或学校邮箱邮箱注册账号&#xff0c;等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的&#xff0c;现在我弄明白后写下这篇文章&#xff0c;用于记录…