Kubernetes基本存储

news2024/10/5 14:03:33

Kubernetes基本存储

容器的生命周期可能很短,会被频繁地创建和销毁,容器销毁时,保存在容器中的数据也会被清除。为了持久化保存容器中数据,引入Volume概念。

Volume时Pod中多个容器共同访问的共享目录,它被定义在Pod中,被一个Pod里的多个容器挂载到具体的文件目录下,k8s通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。当容器终止或重启时,Volume中数据也不会丢失。

类似于Docker中数据卷的概念,有兴趣的同学可以通过这篇文章了解下。

Docker环境/命令/数据卷

EmptyDir

EmptyDir:最基础的Volume类型,一个EmptyDIr就是Host上一个空目录。在Pod被分配到Node时创建,初始内容为空,并且无需指定宿主机上对应目录文件,因为k8s会自动分配一个目录。Pod被销毁时,EmptyDir的数据也会被永久删除。
在这里插入图片描述

用途:

  • 临时空间,例如用于某些应用运行时所需要的临时空间,且无需永久保留

  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)

案例:

在一个Pod中准备两个容器nginx和busybox,然后声明一个Volume分别挂在到两个容器的目录中,然后nginx容器负责向Volume中写日志,busybox中通过命令将日志内容读到控制台。

创建volume-emptydir.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.14-alpine
    ports:
    - containerPort: 80
    volumeMounts:  # 将logs-volume挂在到nginx容器中,对应的目录为 /var/log/nginx
    - name: logs-volume
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,动态读取指定文件中内容
    volumeMounts:  # 将logs-volume 挂在到busybox容器中,对应的目录为 /logs
    - name: logs-volume
      mountPath: /logs
  volumes: # 声明volume, name为logs-volume,类型为emptyDir
  - name: logs-volume
    emptyDir: {}

操作过程:

[root@master ~]# vim  volume-emptydir.yaml
#创建名称空间
[root@master ~]# kubectl create ns dev
namespace/dev created
#创建Pod
[root@master ~]# kubectl create -f volume-emptydir.yaml
pod/volume-emptydir created
#查看信息
[root@master ~]# kubectl get pod -n dev -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   R
volume-emptydir   2/2     Running   0          32s   10.244.1.2   node1   <none>        
#通过PodIP访问端口 
[root@master ~]# curl 10.244.1.2:80


#另起一个窗口 在访问端口的同时,查看指定容器标准化输出
[root@master ~]# kubectl logs -f volume-emptydir -n dev -c busybox
10.244.0.0 - - [07/Jun/2023:00:36:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-“
#能够查看,说明共享了EmptyDir数据
#记得测试完之后删除Pod哦
[root@master ~]# kubectl delete -f volume-emptydir.yaml
pod "volume-emptydir" deleted

HostPath

EmptyDir数据不会持久化,会随着Pod的结束而销毁,如果向简单持久化数据到主机中可以使用HostPath。

HostPath就是将Node主机中一个实际目录挂载到Pod中去,提供容器使用,这样设计就算Pod被销毁,数据依然可以存在于Node主机中。

在这里插入图片描述

创建volume-hostpath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-hostpath
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"]
    volumeMounts:
    - name: logs-volume
      mountPath: /logs
  volumes:
  - name: logs-volume
    hostPath: 
      path: /root/logs
      type: DirectoryOrCreate  # 目录存在就使用,不存在就先创建后使用

关于一些配置信息(例如type)可以在官方文档中查看,这里不做详细说明。官方文档地址:Kubernetes文档/概念/存储/卷

操作过程:

[root@master ~]# vim volume-hostpath.yaml
#创建Pod
[root@master ~]# kubectl create -f volume-hostpath.yaml
pod/volume-hostpath created

#查看Pod信息
[root@master ~]# kubectl get pod -n dev -o wide
NAME              READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
volume-hostpath   2/2     Running   0          110s   10.244.1.3   node1   <none>           <none>
#访问80端口
[root@master ~]# curl 10.244.1.3:80

#与此同时 新窗口动态查看标准容器输出
[root@master ~]# kubectl logs -f volume-hostpath -n dev -c busybox
10.244.0.0 - - [07/Jun/2023:01:04:43 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

#这个Pod在node1节点下 进入node1节点查看 ssh远程连接node1 IP
[root@master ~]# ssh 'root@192.168.126.133'
The authenticity of host '192.168.126.133 (192.168.126.133)' can't be established.
ECDSA key fingerprint is SHA256:XQp99d3wLmZ8HRxWl755k0HMFfuKrio66QdSM7r507c.
ECDSA key fingerprint is MD5:24:50:b7:e7:3f:bd:a7:9c:52:4a:0a:5b:73:c1:2d:7f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.126.133' (ECDSA) to the list of known hosts.
root@192.168.126.133's password:
Last login: Tue Jun  6 20:22:25 2023
#文件存在OK
[root@node1 ~]# ls /root/logs/
access.log  error.log
#退出
[root@node1 ~]# exit
logout
Connection to 192.168.126.133 closed.
#同样的道理,如果在此目录下创建一个文件,到容器中也是可以看到的
#测试完记得删除Pod
[root@master ~]# kubectl delete -f volume-hostpath.yaml
pod "volume-hostpath" deleted

NFS

Hostpath可以解决数据持久化问题,但一旦Node节点故障,Pod如果转移到别的节点,又有新的问题,此时需要准备单独的网络存储系统。常用NFS,CIFS。

NFS是网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中存储直接连接到NFS系统上,无论Pod节点怎么转移,只要Node跟NFS的对接没问题,数据就可以访问。
在这里插入图片描述

  1. 首先准备nfs服务器,简单演示,直接使用master节点做nfs服务器

    #安装nfs服务
    [root@master ~]# yum install nfs-utils -y
    #准备共享目录
    [root@master ~]# mkdir /root/data/nfs -pv
    mkdir: created directory ‘/root/data’
    mkdir: created directory ‘/root/data/nfs’
    
    #将共享目录以读写权限暴露给集群IP网段上这里以192.168.126.0/24网段所有主机
    #/etc/exports nfs服务默认读取文件
    [root@master ~]# vim /etc/exports
    [root@master ~]# cat /etc/exports
    /root/data/nfs     192.168.126.0/24(rw,no_root_squash)
    
    #启动nfs服务
    [root@master ~]# systemctl start nfs
    
    
  2. 为了让node节点驱动nfs设备,在每个node节点上安装nfs,注意不要启动

    yum install nfs-utils -y
    
  3. 编写volume-nfs.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-nfs
      namespace: dev
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: logs-volume
          mountPath: /var/log/nginx
      - name: busybox
        image: busybox:1.30
        command: ["/bin/sh","-c","tail -f /logs/access.log"] 
        volumeMounts:
        - name: logs-volume
          mountPath: /logs
      volumes:
      - name: logs-volume
        nfs:
          server: 192.168.126.132  #nfs服务器地址
          path: /root/data/nfs #共享文件路径
    
  4. 运行Pod,观察结果

    #创建Pod
    [root@master ~]# kubectl create -f volume-nfs.yaml
    pod/volume-nfs created
    #查看Pod
    [root@master ~]# kubectl get pod -n dev -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
    volume-nfs   2/2     Running   0          46s   10.244.1.4   node1   <none>           <none>
    
    #进入共享文件 发现已经有文件了
    [root@master ~]# ls /root/data/nfs/
    access.log  error.log
    [root@master ~]# cd /root/data/nfs/
    #然后再访问一下
    [root@master ~]# curl 10.244.1.4:80
    
    #查看日志文件输出
    [root@master nfs]# tail -f access.log
    10.244.0.0 - - [07/Jun/2023:01:47:43 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    
    

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

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

相关文章

“碳”寻青蓝锦色,锦江酒店(中国区)用行动点亮酒店可持续发展

第52个世界环境日之际&#xff0c;为响应“减塑捡塑”号召&#xff0c;锦江酒店&#xff08;中国区&#xff09;以“‘碳’寻青蓝锦色”为主题&#xff0c;在6月5日至6月11日期间&#xff0c;开启第二届“绿色生活创益周”&#xff0c;通过线上线下联动&#xff0c;倡导时尚低碳…

2023智源大会议程公开丨类脑计算论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、图灵奖得主Geoffrey Hinton、OpenAI创…

Mocha AE:Clip 模块

Clip&#xff08;剪辑&#xff09;模块主要用于对素材或遮罩文件的格式进行查看或设置&#xff0c;包括视频格式、时间码格式、色彩空间等&#xff0c;还可以进行裁剪。 General 常规 Input 输入 当前图层素材。 Matte for Layer n 图层 n 的遮罩 Name 名称 显示素材的名称。 …

通信大史记:互联网的起源故事

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 朱峰 产品统筹 / bobo 这是一期“两年更”的节目&#xff0c;通信大史记录完第一期后&#xff0c;因为资料准备和主播时间的关系一直没有后续更新。今天&#xff0c;我们…

nodejs的path模块

path路径模块 path模块是Node.js官方提供的&#xff0c;用来处理路径的模块。提供一系列的方法和属性&#xff0c;用来满足用户对路径的处理需求。 例如&#xff1a; 如果在js代码中&#xff0c;使用path模块来处理路径&#xff0c;需要先导入 const pathrequire(path)常用的…

chatgpt赋能python:Python如何调成白色的SEO文章

Python 如何调成白色的 SEO 文章 介绍 Python 是一种流行的编程语言&#xff0c;在数据分析、人工智能、Web 开发以及其他许多领域都有广泛的应用。然而&#xff0c;很少有人会把 Python 与 SEO 联系起来。 事实上&#xff0c;Python 是一个强大的工具&#xff0c;可以帮助 …

软件工程师,学会封装不香么

什么是封装 从面向对象编程的角度来说&#xff0c;封装是指利用抽象数据类型将数据和基于数据的操作封装在一起&#xff0c;使其构成一个不可分割的独立实体&#xff0c;数据被保护在抽象数据类型的内部&#xff0c;尽可能地隐藏内部的细节&#xff0c;只保留一些对外接口使之与…

rk3568 TF卡启动

rk3568 SD卡启动 SD卡启动系统&#xff0c;它可以让rk3568在没有硬盘或其他存储设备的情况下启动和运行操作系统。这使得rk3568变得与树梅派一样灵活切换系统&#xff0c;与此同时进行故障排查和修复&#xff0c;而不需要拆卸设备或者使用专业的烧录工具。SD卡启动还可以方便地…

音视频同步的方法:深入探索基于FFmpeg的音视频同步策略

音视频同步艺术&#xff1a;深入探索基于FFmpeg的同步策略 &#xff08;一&#xff09;音视频同步的基本概念与重要性&#xff08;Basic Concepts and Importance of Audio-Video Synchronization&#xff09;1.1 音视频同步的定义与影响&#xff08;Definition and Impact of …

【SQL】Oracle数据库实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

【Python入门】Python循环语句(for循环的基础语法)

前言 Python循环语句 1. for循环的基础语法1.1 for循环1.2 程序中的for循环1.3 for循环语句1.4 for循环注意点1.5 总结1.6 练习案例&#xff1a;数一数有几个a 2. range语句2.1 range语句讲解2.2 for循环遍历range序列2.3 总结2.4 练习案例&#xff1a;有几个偶数 3. 变量作用域…

RFID软件:简介、功能和应用范围

在当今快节奏的商业环境中&#xff0c;RFID&#xff08;射频识别&#xff09;技术已经成为物流、供应链和库存管理等领域中不可或缺的工具。本文将向您介绍RFID软件的基本知识&#xff0c;探讨其功能和广泛应用的范围。 第一部分&#xff1a;RFID软件简介 RFID软件是一种应用…

【开源项目】SofaBoot实现Spring Bean 异步初始化的源码拆解

使用场景 在实际使用 Spring/Spring Boot 开发中&#xff0c;一些 Bean 在初始化过程中执行准备操作&#xff0c;如拉取远程配置、初始化数据源等等。在应用启动期间&#xff0c;这些 Bean 会增加 Spring 上下文刷新时间&#xff0c;导致应用启动耗时变长。 Demo展示 Spring…

苹果 Apple 发布的 AR 头显 Vision Pro 介绍

苹果今天凌晨的发布会&#xff0c;隆重推出了用了8 年时间研发的AR&#xff08;增强现实&#xff09;头戴显示器 Vision Pro。作为苹果 AR系列的最新成员&#xff0c;为用户带来了前所未有的沉浸式增强现实体验。 硬件 12个摄像头 &#xff0c;包括苹果首个 3D 相机&#xff0c…

【容器云架构】Calico 组件架构

Calico 组件 下图显示了 Kubernetes 的必需和可选 Calico 组件&#xff0c;具有网络和网络策略的本地部署。 Calico 组件 Calico API serverFelixBIRDconfdDikastesCNI pluginDatastore pluginIPAM pluginkube-controllersTyphacalicoctl 云编排器的插件 Plugins for cloud orc…

【vulnhub靶场】node 1

文章目录 前言开启靶机信息收集二层发现三层信息收集 攻击利用web信息收集权限提升后渗透 前言 描述&#xff1a;Node是一个中等级别的boot2root挑战&#xff0c;最初是为HackTheBox创建的。有两个标志可供查找&#xff08;用户和根标志&#xff09;和多种不同的技术可供使用。…

IDEA启动图片更改替换(2021.1/2022及其之后的版本)

目录 先说2022.1及其之后的版本: 2022.1之前的版本: 2022其他版本修改方法 最近一直在整理接口数据&#xff0c;盯屏幕太久了&#xff0c;然后打开IDEA突然感觉这个启动页面好刺眼&#xff0c;正好整理工作做完了&#xff0c;中午有空就找了下方法,发现了不少坑&#xff0c;…

项目管理中,如何减少项目风险?

我们公司&#xff0c;有一个项目已经做了一年多了&#xff0c;并且与客户进行了多次沟通&#xff0c;项目需求变更&#xff0c;范围扩大等&#xff0c;项目一直不能完成&#xff0c;客户生气&#xff0c;领导一直催&#xff0c;决定换一个项目经理把&#xff0c;领导让一个同事…

《vue 实践之 three.js 学习》

目录 three.js 学习包安装导包基础API学习Three.js 三要素【图文展示】 透视相机three.js 渲染器 之 WebGLRendererWebGLRenderer 实例化 three.js 学习 个人博客地址&#xff1a; 包安装 "three": "^0.153.0"命令&#xff1a;npm install --save three –…

模板初阶(C++)

目录 泛型编程 引入 模板 函数模板 函数模板的概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 引入 我们在实际编写代码中&#xff0c;经常会遇到不同的类型需要实现同一种功…