K8s存储对象的使用

背景和概念

  容器中的文件在磁盘上是临时存放的,这给在容器中运行较重要的应用带来一些问题: 当容器崩溃或停止时,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时, 跨所有容器设置和访问共享文件系统也有一定的挑战性;
  有docker使用经历的人应该知道,docker内有一个数据卷的概念,可以持久化容器内的文件数据;同样,在k8s体系内,使用的也是卷的概念;
  Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同, 但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。
  卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
  使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers.volumeMounts 字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们容器镜像的初始内容以及挂载在容器中的卷所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。
  卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置;

常见的卷类型

常见的卷有如下几种类型:

  • configMap :configMap 卷提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被 Pod 中运行的容器化应用使用(注意环境变量也可以使用configMap)。
  • hostPath:将主机节点文件系统上的文件或目录挂载到你的 Pod 中,但是官网现在不推荐使用这个了;
  • nfs:将 NFS (网络文件系统) 挂载到你的 Pod 中。nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载;使用nfs可以可以在 Pod 之间做到数据共享。
  • persistentVolumeClaim: 简称PVC,是用户在不知道特定云环境细节的情况下申领持久存储(例如 iSCSI 卷)的一种方法。
  • secret:用来给 Pod 传递敏感信息,例如密码。你可以将 Secret 存储在 Kubernetes API 服务器上,然后以文件的形式挂载到 Pod 中,无需直接与 Kubernetes 耦合
    当然也有其他类型的卷,详细的可查阅k8s官网;

案例

一、nfs原生方式挂载卷

企业级生产环境一般会由基础设施部门提供一个nfs地址和目录。受限于我本地测试环境的资源,我只能在虚拟机上随意找一台节点,来模拟nfs文件系统;这里我使用了k8s集群的master节点模拟搭建一个nfs;
(这里解释一下nfs,他的全称就是网络共享文件系统,他可以挂载到任何机器的磁盘目录下,做到几台机器间的文件数据同步共享;)
步骤
1、在所有机器上安装nfs工具

#所有机器安装
yum install -y nfs-utils

2、master主节点模拟配置为nfs服务端

#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
 
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r

3、worker节点查询nfs服务

showmount -e nfs服务ip

在这里插入图片描述
可以看到我上一个步骤创建的目录可以查到了
4、挂载到worker节点指定的目录下

# 创建/nfs/data目录,执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /nfs/data
mkdir -p /nfs/data
 
mount -t nfs 192.168.xxx.xxx:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test2.txt

查看同步的test2.txt文件
在这里插入图片描述
5、pod挂载nfs

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 192.168.xxx.xxx
            path: /nfs/data/nginx-pv

这里的意思就是将nfs的/nfs/data/nginx-pv目录挂载到容器内的/usr/share/nginx/html目录,这样两边的目录文件就可以做到实时同步了;无论任何一个地方的文件有变动,对方的目录也会跟着一起变动,并且数据始终一致;
在这里插入图片描述
在这里插入图片描述
可以看到上边两个图片中,两边目录中的文件已经同步了;

二、PV&PVC的使用

  持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统;
  持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod)
  PV 卷的制备有两种方式:静态制备或动态制备。静态制备是事先已经创建好的pv,动态制备则是基于 StorageClass 来实现,为 PVC 申领动态制备一个存储卷;
  本案例使用静态制备的方式

1、在模拟的nfs服务端,创建几个静态的资源空间

#主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2、创建PV,分别使用上述的几个目录;

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 192.168.xxx.xxx
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.xxx.xxx
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 192.168.xxx.xxx

在这里插入图片描述

3、创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

pvc会找到和所需容量相符的PV资源进行绑定,并且这种绑定也是一对一的关系;
在这里插入图片描述
可以看到,我们申领的是200M的存储,那最接近这个要求的就是pv02-1gi这个资源,那此次申领就使用了这个pv卷;
4、pod绑定pvc

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

这里pod是将容器内的/usr/share/nginx/html目录挂载到name=html的卷内,html卷使用的是我创建的nginx-pvc;也就是/usr/share/nginx/html目录内的文件会同步到/nfs/data/02目录;
在这里插入图片描述
在这里插入图片描述
从上述截图中可以看到,容器内的目录下的文件在nfs中也有了;

三、ConfigMap

  ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
  ConfigMap 可以将你的环境配置信息和容器镜像解耦,便于应用配置的修改。
  ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性;
  ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可考虑挂载存储卷或者使用独立的数据库或者文件服务。
  本案例使用configMap抽离容器的配置信息;
1、创建一个配置文件,名称为edis.conf;查看该配置文件内的信息:
在这里插入图片描述
2、基于此文件创建CM;

kubectl create cm redis-conf --from-file=redis.conf

3、创建pod,使用上述已经建好的configMap

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

4、查看配置信息
在这里插入图片描述
在这里插入图片描述

# 登录redis,查看配置同步信息
kubectl exec -it redis -- redis-cli -a yes

登录redis,查看配置项

可以看到我CM中的配置已同步到了redis容器内;并且登录redis也能看到配置的信息;

四、secret

  Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
  由于创建的Secret 可以独立于使用它们的Pod,因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施,例如避免将敏感数据写入非易失性存储。
  Secret类似于ConfigMap,但是前者专门用于保存机密数据;
本案例使用阿里云作为镜像仓库,来通过设置的secret登录阿里云,并拉取镜像仓库的私有镜像;
1、首先在阿里云服务中要先上传镜像文件,并确保镜像文件是私有状态;
在这里插入图片描述
2、拉取镜像时,需要docker login命令登录阿里云服务,涉及到账号和密码,这里将登录账号信息存储在secret中;

kubectl create secret docker-registry my-secret ----docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=aliyun88000000 --docker-password=123456

这里我创建了一个my-secret的对象,在管理端查看效果如下:
在这里插入图片描述
在这里插入图片描述
3、创建pod应用


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: registry.cn-hangzhou.aliyuncs.com/wtl-test/test-nginx:1.0
      imagePullPolicy: Always
  imagePullSecrets:
    - name: my-secret  #登录密码从my-secret获取

pod创建时指定了镜像的仓库地址和密码;
4、检查pod启动情况
在这里插入图片描述
可以看到镜像已成功获取,并启动了pod应用;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理:管理项目依赖的jar包 ,避免版本冲突 2.统一项目结构:比如统一eclipse IDEA等开发工具 3.项目构建:标准跨平台的自动化项目构建方式。有标准构建流程,能快速…

VS2019创建c++动态链接库dll与调用方法

VS2019创建c动态链接库dll与调用方法 1.点击文件-》新建-》项目,输入dll,选择具有导出项的(DLL)动态链接库 2.输入一个文件名:dll2 头文件.h 3.添加加减法函数: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的…

【高频】什么是索引的下推和覆盖

面试回答: 索引的下推是指数据库引擎在执行查询时,将过滤条件尽可能地应用到索引上,以减少需要检索的数据量,从而提高查询性能。这样可以减少数据库引擎从磁盘加载的数据量,提高查询效率。覆盖索引是指一个索引包含了…

C++青少年简明教程:C++函数

C青少年简明教程:C函数 C函数是一段可重复使用的代码,用于执行特定的任务,可以提高代码的可读性和可维护性。函数可以接受参数(输入)并返回一个值(输出),也可以没有参数和返回值。 …

范闲获取到庆帝与神庙的往来信件,用AES进行破解

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在《庆余年2》中,范闲与庆帝和神庙之间的权谋斗争愈演愈烈。一次偶然的机会,范闲从庆帝的密室中获取到几封与神庙往来的密信。然而,这封信件…

算法-分治策略

概念 分治算法(Divide and Conquer)是一种解决问题的策略,它将一个问题分解成若干个规模较小的相同问题,然后递归地解决这些子问题,最后合并子问题的解得到原问题的解。分治算法的基本思想是将复杂问题分解成若干个较…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小,通常用于降低电压或升高电压,以便适应不同设备的需求。它们还可以提供隔离,使得输出电路与输入电路之间电气隔离,从而提高安全性。性能方面,电源变压器需要具有高效率、低温…

二叉树-堆的详解

一,树的概念 1,树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有…

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单,即是曾经的再现,也是未来的延伸,未来已来,就在脚下。 …

泛微开发修炼之旅--10基于Ecology实现附件上传,并将上传后的文件id存入表单附件控件中的示例及源码

文章链接:泛微开发修炼之旅--10基于Ecology实现附件上传,并将上传后的文件id存入表单附件控件中的示例及源码

微信如何防止被对方拉黑删除?一招教你解决!文末附软件!

你一定不知道,微信可以防止被对方拉黑删除,秒变无敌。只需一招就能解决!赶快来学!文末有惊喜! 惹到某些重要人物(比如女朋友),被删除拉黑一条龙,那真的是太令人沮丧了&a…

如何快速学习掌握PMP考试知识?

要快速学习掌握PMP考试知识,有几个关键的步骤和方法可以帮助大家有效地准备考试。 首先,建议你购买一本权威的PMP考试教材,例如PMBOK指南。这本教材是PMP考试的权威指南,包含了所有考试所需的知识点和内容。你可以通过系统地阅读…

Unity3D测量距离实现方法(一)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、Unity距离测量1-1 制作预制体1-2 编写测量的脚本 👉二、鼠标点击模型进行测量👉二、字体面向摄像机的方法👉二、最短距离测量方法👉三、壁纸分享…

【WP】猿人学_16_js逆向_window蜜罐

https://match.yuanrenxue.cn/match/16 抓包分析 荷载一个加密参数,一个时间戳 时间: 2024-06-07 15:52:31时间戳: 1717746751 1717746751000时间戳和现在对得上,直接生成就行。 追栈 追栈找m的生成位置。 点进去打断点,重新点击其他…

算法导论实战(三)(算法导论习题第二十四章)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀算法启示录 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十四章 24.1-3 24.1-4 2…

【TB作品】MSP430G2553单片机,MSP430 单片机读取 SHT30 传感器并显示数据

使用 MSP430 单片机读取 SHT30 传感器并显示数据 作品功能 本文介绍了如何使用 MSP430 单片机读取 SHT30 温湿度传感器的数据,并通过 OLED 屏幕显示实时的温度和湿度信息。通过此项目,您将学习如何配置 MSP430 的 I2C 接口、读取 SHT30 传感器的数据以…

Linux 中常用的设置、工具和操作

1.设置固定的ip地址步骤 1.1 添加IPADDR“所设置的固定ip地址” TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROUTE"yes" IPV4_FAILURE_FATAL"no" IPV6INIT"yes" IPV6…

【Vue】作用域插槽

插槽分类 默认插槽:组件内定制一处结构 具名插槽:组件内定制多处结构 插槽只有两种,作用域插槽不属于插槽的一种分类。作用域插槽只是插槽的一个传参语法 作用: 定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据&a…

SOA主要协议和规范

Web服务作为实现SOA中服务的最主要手段。首先来了解Web Service相关的标准。它们大多以“WS-”作为名字的前缀,所以统称“WS-*”。Web服务最基本的协议包括UDDI、WSDL和SOAP,通过它们,可以提供直接而又简单的Web Service支持,如图…

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。