云原生Kubernetes:K8S存储卷

目录

一、理论

1.存储卷

2.emptyDir 存储卷

3.hostPath卷

4.NFS共享存储

二、实验

 1.emptyDir 存储卷

2.hostPath卷

3.NFS共享存储

三、问题

1.生成pod一直pending

四、总结


一、理论

1.存储卷

(1)概念

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时, kubelet会重启它,但是容器中的文件将丢失一容器以干净的状态(镜像最初的状态)重新启动。

其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。


(2)分类

本地:例如hostPath、emptyDir;
网络:例如NFS、Ceph、GlusterFS;
公有云:例如AWS EBS;
k8s资源:例如configmap、secret。

2.emptyDir 存储卷

(1)作用

emptyDir存储卷当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除Pod时, emptyDir中的数据将被永久删除。

(2)示例

[root@master demo]# mkdir /opt/volumes
[root@master demo]# cd /opt/volumes/
[root@master volumes]# vim pod-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-emptydirnamespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80#定义容器挂载的内容volumeMounts:#使用的存储卷名称,如果跟下面的volume字段name值相同,则表示使用volume的这个卷- name: html#挂载到容器的哪个目录mountPath: /usr/share/nginx/html/- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: html#在容器内定义挂载存储名称和挂载路径mountPath: /data/command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 5;done']#定义存储卷volumes:#定义存储卷的名称- name: html#定义存储卷的类型emptyDir: {}
[root@master volumes]# kubectl  apply -f pod-emptydir.yaml[root@master volumes]# kubectl get pods -o wide 
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-emptydir   2/2     Running   0          3s    10.244.1.146   node01   <none>           <none>#在上面定义了两个容器,其中一个容器输入日期到index.html中,然后验证范围nginx的htmnl是否可以获取日期
#同时,在进入两个容器里,查看挂载数据卷的目录的数据,以验证两个容器之间挂载的emptyDir实现共享[root@master volumes]# curl  10.244.1.146
wed Sep 20 06:07:26 UTC 2023
Wed Sep 20 06:07:31 UTC 2023
Wed Sep 20 06:07:36 UTC 2023
Wed Sep 20 06:07:41 UTC 2023
Wed Sep 20 06:07:46 UTC 2023
Wed Sep 20 06:07:51 UTC 2023
[root@master volumes]# kubectl  exec  -it  pod-emptydir -c busybox sh
/ # cat /data/index.html 
wed Sep 20 06:07:26 UTC 2023
Wed Sep 20 06:07:31 UTC 2023
Wed Sep 20 06:07:36 UTC 2023
Wed Sep 20 06:07:41 UTC 2023
Wed Sep 20 06:07:46 UTC 2023
Wed Sep 20 06:07:51 UTC 2023
[root@master volumes]# kubectl  exec  -it  pod-emptydir -c myapp sh
/ # cat /usr/share/nginx/html/index.html 
Wed Sep 20 06:07:26 UTC 2023
Wed Sep 20 06:07:31 UTC 2023
Wed Sep 20 06:07:36 UTC 2023
Wed Sep 20 06:07:41 UTC 2023
Wed Sep 20 06:07:46 UTC 2023
Wed Sep 20 06:07:51 UTC 2023
Wed Sep 20 06:07:56 UTC 2023
Wed Sep 20 06:08:01 UTC 2023
Wed Sep 20 06:08:06 UTC 2023
Wed Sep 20 06:08:11 UTC 2023

3.hostPath卷

(1)作用

hostPath卷将node节点的文件系统中的文件或者目录挂载到集群中。

hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失。

(2)示例

#在node01节点上创建挂载目录
[root@node01 ~]#  mkdir -p /data/pod/volume1
[root@node01 ~]#  echo 'node01.myweb.com' > /data/pod/volume1/index.html#在node02 节点上创建挂载目录
[root@node02 ~]#  mkdir -p /data/pod/volume1
[root@node02 ~]#  echo 'node02.myweb.com' > /data/pod/volume1/index.html
[root@master volumes]# vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-hostpathnamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1#定义容器你挂载内容volumeMounts:#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷- name: html#挂载值容器中哪个目录mountPath: /usr/share/nginx/htmlreadOnly: false#volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷    volumes:#存储卷名称- name: html#路径,为宿主机存储路径hostPath:#在宿主机上目录的路径path: /data/pod/volume1#定义类型,这表示如果宿主机没有此目录则会自动创建type: DirectoryOrCreate                              
[root@master volumes]# kubectl apply -f pod-hostpath.yaml [root@master volumes]# kubectl  get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          14m   10.244.2.112   node02   <none>           <none>
#访问测试
[root@master volumes]# curl 10.244.2.112
node02.myweb.com#删除pod后,再重建,验证是否依旧可以访问原来的内容
[root@master volumes]# kubectl delete -f pod-hostpath.yaml 
pod "pod-hostpath" deleted
[root@master volumes]# kubectl apply -f pod-hostpath.yaml 
pod/pod-hostpath created
[root@master volumes]# kubectl  get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          6s    10.244.1.147   node01   <none>           <none>
[root@master volumes]# curl 10.244.1.147
node01.myweb.com

4.NFS共享存储

(1)安装配置nfs服务

#在stor01(192.168.204.177)节点上安装nfs,并配置nfs服务
mkdir /data/volumes -p
echo 'this is david' >> /data/volumes/index.html
chmod 777 /data/volumes/yum -y install nfs-utils rpcbind#给204网段用户赋予读写权限、同步内容、不压缩共享对象root用户权限
vim /etc/exports
/data/volumes 192.168.204.0/24(rw,no_root_squash,sync)systemctl  start  rpcbind nfs#监听服务
[root@stor01 ~]# ss -antp | grep rpcbind
LISTEN     0      128          *:111                      *:*                   users:(("rpcbind",pid=37036,fd=8))
LISTEN     0      128         :::111                     :::*                   users:(("rpcbind",pid=37036,fd=11))showmount -e 192.168.204.177
Export list for host10:
/data/volumes 192.168.204.0/24#所有节点配置hosts映射,或者配置DNS解析
echo '192.168.204.177 stor01' >> /etc/hosts

(2)master 节点操作

apiVersion: v1
kind: Pod
metadata:name: pod-vo1-nfsnamespace: default
spec:#指定pod到 node01节点nodeName: node01containers:- name: myappimage: ikubernetes/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:path: /data/volumesserver: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml 
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vo1-nfs   1/1     Running   0          8s    10.244.1.148   node01   <none>           <none>
#访问cluster ip 
[root@master volumes]# curl 10.244.1.148
this is david
[root@master volumes]# kubectl delete pod pod-vo1-nfs 
pod "pod-vo1-nfs" deleted[root@master volumes]# vim pod-nfs-vo1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-vo1-nfsnamespace: default
spec:#指定pod在node02节点nodeName: node02containers:- name: myappimage: ikubernetes/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:path: /data/volumesserver: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml 
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vo1-nfs   1/1     Running   0          3s    10.244.2.114   node02   <none>           <none>
#访问测试
[root@master volumes]# curl  10.244.2.114
this is david

二、实验

 1.emptyDir 存储卷

(1)示例

创建宿主机挂载目录

编写资源清单

生成资源

查看信息

在上面定义了两个容器,其中一个容器输入日期到index.html中,然后验证范围nginx的htmnl是否可以获取日期

同时,在进入两个容器里,查看挂载数据卷的目录的数据,以验证两个容器之间挂载的emptyDir实现共享

访问cluster ip

进入pod pod-emptydie里的busybox容器查看

进入pod pod-emptydie里的myapp容器查看

删除pod后,再重建,验证是否依旧可以访问原来的内容

原来内容已不在

2.hostPath卷

(1)示例

在node01节点上创建挂载目录

在node02 节点上创建挂载目录


编写资源清单文件

生成资源并查看信息


访问测试

删除pod后,再重建,验证是否依旧可以访问原来的内容

查看信息并访问测试,内容依然存在

3.NFS共享存储

(1)安装配置nfs服务

在stor01(192.168.204.177)节点上安装nfs,并配置nfs服务

安装

配置文件

重启服务

监听服务

查看共享目录

所有节点配置hosts映射,或者配置DNS解析

(2)master 节点操作

生成资源

查看信息,已分配到node01节点

删除pod

指定pod在node02节点

生成资源并查看信息,已分配到node02节点

访问测试。说明nfs实现了数据持久化

三、问题

1.生成pod一直pending

(1)报错

(2)原因分析

查看pod详细信息

[root@master volumes]# kubectl describe pod pod-emptydir

node节点有污点

(3)解决方法

查看污点

[root@master volumes]# kubectl describe nodes node01 | grep -i 'taints'
Taints:             check=mycheck:NoExecute
[root@master volumes]# kubectl describe nodes node02 | grep -i 'taints'
Taints:             check=mycheck:NoExecute

去除所有node节点污点

[root@master volumes]# kubectl taint nodes node01 check:NoExecute-
node/node01 untainted
[root@master volumes]# kubectl taint nodes node02 check:NoExecute-
node/node02 untainted

成功

2.shoumount -e未显示共享目录

(1)报错

 (2)原因分析

配置文件关键词“squash”错误

(3)解决方法

修改配置文件

[root@stor01 ~]# vim /etc/exports

修改前:

修改后:

成功:

四、总结

容器崩溃会导致Pod被删除,因此容器崩溃期间emptyDir中的数据是安全的。

hostPath卷将node节点的文件系统中的文件或者目录挂载到集群中。

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

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

相关文章

如何玩转CSDN AI工具集

前言 人工智能生成内容&#xff08;AIGC&#xff09;是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容&#xff0c;完成文章翻译、代码生成、AI对话、插图创作等工作&#xff0c;带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…

Bard人工智能9月19日重大更新

1、巴德现在可以回复来自谷歌地图、航班、酒店和YouTube的实时信息&#xff0c;因此您可以在一个地方完成更多工作。 2、Bard 可能会与其他服务共享您的部分对话和其他相关信息&#xff0c;例如您的位置。这些服务可能会使用该信息进行改进&#xff0c;即使您以后删除了您的 Ba…

湖南湘潭家具3D轮廓扫描测量家居三维数字化外观逆向设计-CASAIM中科广电

随着科技的不断进步&#xff0c;CASAIM三维扫描技术在各个行业中得到了广泛应用&#xff0c;家具行业也不例外。传统的家具设计和展示方式已经无法满足现代消费者的个性化、多元化需求&#xff0c;而三维扫描技术的出现为家具行业带来了新的机遇和可能性。 家具表面有雕刻图案…

机器学习第九课--随机森林

一.什么是集成模型 对于几乎所有的分类问题(图像识别除外&#xff0c;因为对于图像识别问题&#xff0c;目前深度学习是标配)&#xff0c;集成模型很多时候是我们的首选。比如构建一个评分卡系统&#xff0c;业界的标配是GBDT或者XGBoost等集成模型&#xff0c;主要因为它的效…

(2) Java 8 实战第二版——补充 收集数据、并行数据处理能力与性能

第6章 用Collectors类创建和使用收集器将数据流归约为一个值汇总&#xff1a;归约的特殊情况数据分组和分区开发你的自定义收集器 对一个交易列表按货币分组&#xff0c;获得该货币的所有交易额总和&#xff08;返回一个Map<Currency, Integer>&#xff09;。将交易列表…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

【Linux基础】第31讲 Linux用户和用户组权限控制命令(三)

用户组管理命令 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同。如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组…

二叉树的操作大全

文章目录 1.通过前序遍历数组"ABD##E#H##CF##G##"构建二叉树2.前序遍历3.中序遍历4.后序遍历5.层序遍历6.二叉树结点个数及第k层结点个数7.查找为x的结点8.叶子结点个数9.销毁二叉树(二级指针)10.判断是否为完全二叉树测试代码及运行结果 1.通过前序遍历数组"AB…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果&#xff1a; 输入&#xff1a;nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3]&#xff0c;一共有2个 利用枚举法&#xff1a; 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

Unity用相机实现的镜子效果

首先登场 场景中的元素 mirror是镜子&#xff0c;挂着我们的脚本&#xff0c;Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。 镜子size是大小&#xff0c;x是-2&#xff0c;为了反转一下贴图 相机直接可以禁用掉&#xff0c;用…

负载均衡中间件---Nginx

一.nginx的好处 学习 Nginx 对于一个全栈开发者来说是非常有价值的&#xff0c;下面是一些学习 Nginx 的原因和好处&#xff1a; 反向代理和负载均衡&#xff1a;Nginx 是一个高性能的反向代理服务器&#xff0c;可以用于将客户端请求转发给多个后端服务器&#xff0c;实现负…

【Linux】文件缓冲区

目录 一、dup2 二、 引入 三、C语言FILE中的缓冲区 3.1 缓冲区的作用 3.2 缓冲区的刷新机制 3.3 对引入代码现象的解释 3.4 模拟实现C语言中的FILE 四、文件系统中的缓冲区 4.1 fsync 在本期内容正式开始之前&#xff0c;我们先介绍一个上期遗漏的知识点&#xff1a; …

【数据结构】二叉树的链式实现及遍历

文章目录 一、二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历 二、二叉树结点个数及高度1、二叉树节点个数2、二叉树叶子节点个数3、二叉树第k层节点个数4、二叉树查找值为x的节点 三、二叉树创建及销毁1、通过前序遍历数组创建二叉树2、二叉树的销毁3、判断是否为…

17.适配器模式(Adapter)

意图&#xff1a;将一个类的接口转换为Client希望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target&#xff1a;定义Client使用的与特定领域相关的接口。 Client&#xff1a;与符合Target接口的对象协同工作。 Adaptee&#xf…

vue+element plus 使用table组件,清空用户的选择项

<el-table ref"tableRef"> .... </el-table> <script lang"ts" setup> import { onMounted, reactive, ref, nextTick } from vue const clearBtn () > {console.log(清空用户的选择项)tableRef.value.clearSelection() } </scr…

CGI与FastCGI的区别在哪里,FastCGI的应用场景讲解

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

qml Combobox用法介绍与代码演示

ComboBox 是 QML 中的一个组件,用于在下拉列表中显示一组项供用户选择。它是 Qt Quick Controls 2 模块中的一个组件,经常用于创建用户界面。 下面是 ComboBox 的一些基本用法: 1. 基本使用: import QtQuick 2.15 import QtQuick.Controls 2.15ApplicationWindow {visib…

在服务器上创建git仓库

1、在服务器上创建git仓库 选择一个创建文件夹的地方&#xff0c;这个地方不会将源码存放在这里&#xff0c;只用于版本控制 # 创建一个专门放置git的文件夹&#xff0c;也可以叫其它名 mkdir git && cd git # 创建自己项目的文件夹&#xff0c;文件夹后面要带 .git…

PBR纹理的10种贴图

PBR 是基于物理的渲染的首字母缩写。它试图通过模拟材料如何吸收和反射光&#xff0c;以模仿现实世界中的光流的方式产生视觉效果。最近的游戏引擎由于其逼真的效果而越来越多地使用 PBR 纹理。对于实时渲染&#xff0c;它们被认为是真实世界场景的最佳近似值。 推荐&#xff…

iOS 17 Simulator Failed with HTTP status 400:bad request

升级 xcode 15 要 ios17 的 sdk 才能运行&#xff0c;但是更新这个 sdk 400 错误了 解决方案&#xff1a; 直接去官网下载开发者后台下载dmg文件&#xff0c;使用命令行快速安装即可 https://developer.apple.com/documentation/xcode/installing-additional-simulator-runti…