K8s 数据管理

news2024/11/18 7:32:49

k8s-cert


目录

    • 前言
    • 一、Volume
      • 1.1 emptyDir
        • 1.1.1 基本概念
        • 1.1.2 应用案例
      • 1.2 hostPath
        • 1.2.1 基本概念
        • 1.2.2 应用案例
      • 1.3 外部 Storage Provider
    • 二、Persistent Volume
      • 2.1 基本概念
        • 2.1.1 PersistentVolume
        • 2.1.2 PersistentVolumeClaim
      • 2.2 NFS PersistentVolume


前言

与 Docker 类似,也是通过 Volume 为容器提供存储。一般地,我们会将应用服务分为有状态和无状态,对于 K8s 中容器和 Pod 来说,其生命周期是短暂的,因为他们随时可能被销毁和创建。容器销毁时,其内部文件系统中的数据也会被删除。

如何解决这个问题?K8s 提供了 Volume 数据卷,Volume 的生命周期独立于容器,它不会因为容器的销毁而销毁。当 Volume 被 mount 到 Pod 中时,Pod 中的所有容器都可以访问这个 Volume。K8s 支持多种 backend 类型,如 emptyDir、hostPath、GCE Persistent Disk 等。

一、Volume

1.1 emptyDir

1.1.1 基本概念

从字面意思来看,它似乎表示一个空目录,其实它就是 Host 上的一个空目录(即卷最初是空的),而且是最基础的 Volume 类型。需要注意的是:当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。但如果只是容器被销毁,而 Pod 还在的情况下,这个 Volume 是不受影响的。

1.1.2 应用案例

Pod 中的所有容器都可以共享 Volume,它们可以指定各自的 mount 路径。

vim emptyDir.yml
apiVersion: v1
kind: Pod
metadata:
  name: pro-dev
spec:
  containers:
  - image: busybox
    name: pro
    volumeMounts:
    - mountPath: /pro_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world" > /pro_dir/hello; sleep 30000
  - image: busybox
    name: dev
    volumeMounts:
    - mountPath: /dev_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /dev_dir/hello; sleep 30000
  volumes:
  - name: shared-volume
    emptyDir: {}

该案例中 Pod 有两个容器 pro 和 dev,它们共享一个 volume,pro 负责往 volume 写数据,dev 则是从 volume 中读取数据。

整体流程就是:

  • 定义了一个 emptyDir 类型的 Volume - - > shared-volume;
  • pro 容器将 shared-volume mount 到 /pro_dir 目录下;
  • pro 将数据写入 /pro_dir/hello 文件里;
  • dev 容器将 shared-volume mount 到 /dev_dir 目录下;
  • dev 通过 cat 从文件 hello 读取数据。

开始创建 Pod:

kubectl apply -f emptyDir.yml

image-20221230100359487

查看 dev 输出日志:

kubectl logs pro-dev dev

image-20221230100552490

从日志可看到 dev 成功读到了 pro 写入的数据,验证了同个 Pod 中的多个容器共享了 emptyDir Volume。

emptyDir 是 Docker Host 文件系统里的目录,其效果相当于执行了 docker run -v /pro_dirdocker run -v /dev_dir。通过 docker inspect 来查看文件 Mount 情况。

docker inspect k8s_pro_pro-dev_default_479982fc-0a53-45e8-806c-38994e3f6f08_0

image-20221230101749720

docker inspect k8s_dev_pro-dev_default_479982fc-0a53-45e8-806c-38994e3f6f08_0

image-20221230101849704

看看 Host 是否有 Source 文件:

image-20221230102308120

可看到,shared-volume 已经被创建于 Host 中,且两个容器都 Mount 到了同一个目录,因此,/var/lib/kubelet/pods/479982fc-0a53-45e8-806c-38994e3f6f08/volumes/kubernetes.io~empty-dir/shared-volume/ 就是 emptyDir 在 Host 上的实际路径。

由此可看出,emptyDir 能够很方便地为 Pod 中的容器提供共享存储,不需要额外的配置。但 emptyDir 不具备持久性,只要 Pod 被销毁,那 emptyDir 也就会被销毁。因此,emptyDir 只适用于临时共享存储的场景。

1.2 hostPath

1.2.1 基本概念

hostPath Volume 的作用就是将 Docker Host 文件系统中已经存在的目录 mount 给 Pod 的容器,但大部分应用都不会使用 hostPath Volume,因为这会增加 Pod 与节点的耦合,限制了 Pod 的使用。不过那些需要访问 k8s 或 Docker 的内部数据的应用则需要使用到 hostPath

1.2.2 应用案例

有哪些典型的应用案例呢?比如 kube-apiserver、kube-controller-manager 就是这样的应用,我们可以查看一下 kube-apiserver 的 Pod 配置。

kubectl edit pod kube-apiserver-k8s-master --namespace=kube-system

image-20221230104301893

上图中定义了三个 hostPath:ca-certs、etc-pki 和 k8s-certs,他们分别对应了 Host 目录下的 /etc/ssl/certs/etc/pki/etc/kubernetes/pki。如果 Pod 被销毁了,hostPath 对应的目录还是会保留,相比于 emptyDir 来说持久性更强,但如果 Host 崩溃,hostPath 也就无法访问了。

1.3 外部 Storage Provider

当然,K8s 也可以使用主流的分布式存储,如 Ceph、GlusterFS 等,如使用 Ceph 分布式存储。

apiVersion: v1
kind: Pod
metadata:
  name: Ceph-Storage
spec:
  containers:
    - image: busybox
      name: Ceph-Storage
      mountPath: /test-ceph
  volumes:
    - name: ceph-volume
      cephfs:
        path: /home/data/cephfs
        monitors: "192.168.56.190:6789"
        secretFile: "/etc/ceph/admin.secret"

这种外部分布式存储的特点就是:它们不依赖于 K8s,Volume 的底层基础设施由独立的存储系统管理,与 K8s 集群是分离,数据持久化后,即使整个 K8s 集群崩溃了,持久化的数据也不会受到影响。

二、Persistent Volume

2.1 基本概念

尽管 Volume 已经为 K8s 提供了更好的数据持久化方案,但在存储管理上任然是欠缺的,尤其是在大规模集群环境下,需要考虑到效率和安全性问题。K8s 给出的解决方案就是 PersistentVolume,PVPersistentVolumeClaim,PVC

2.1.1 PersistentVolume

持久卷(PersistentVolume,PV)是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。

2.1.2 PersistentVolumeClaim

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与 Pod 类似。Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载)。

有了 PersistentVolumeClaim,用户只需要告诉 K8s 需要什么样的存储资源,而不必真正关心真正的空间是从哪里分配、如何访问底层信息等。

2.2 NFS PersistentVolume

K8s 支持多种类型的 PersistentVolume,比如 Ceph、AWS EBS、NFS 等,我们就通过 NFS 来实验 PersistentVolume

1、安装 NFS

在 K8s-Master 上部署 NFS

# 安装工具/服务
yum -y install rpcbind
yum -y install nfs-utils

# 启动服务
systemctl start nfs-server
systemctl enable nfs-server
systemctl start rpcbind
systemctl enable rpcbind

# 编辑共享文件
vim /etc/exports
/home/data/app 192.168.56.0/24(rw,no_root_squash,sync)

# 创建共享目录
mkdir -p /home/data/app

# 重启NFS
systemctl restart nfs-server

查看 NFS 共享目录

image-20221230170957898

2、K8s 创建 PV 对象

vim pv-test.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-test
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /home/data/app
    server: 192.168.56.160

参数说明

capacity: 指定PV的容量为1GB
accessModes: 指定访问模式为ReadWriteOnce,支持三种访问模式
             ReadWriteOnce: 表示PV能以读写模式mount到单个节点
             ReadOnlyMany: 表示PV能以只读模式mount到多个节点
             ReadWriteMany: 表示PV能以读写模式mount到多个节点
persistentVolumeReclaimPolicy: 指定PV回收策略为Recycle,支持三种回收策略
             Retain: 表示需要管理员手动回收
             Recycle: 表示清除PV中的数据,相当于 rm -rf
             Delete: 表示删除Storage Provide 上对应的存储资源
storageClassName: 指定PV的class为NFS,相当于为PV设置了一个分类,PVC可以指定class申请相应class的PV
nfs.path: NFSf服务的共享目录
nfs.server: NFS服务IP地址

创建 PV 对象

kubectl apply -f pv-test.yml

查看 PV 资源

kubectl get pv

image-20221230173207185

上图中,STATUS 状态为 Available,表示该 PV 资源已经就绪,可以被 PVC 申请。

3、创建 PVC

对于 PVC 来说,只需要指定 PV 的容量、访问模式和 class 即可。

vim pvc-test.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: pv-test

# selector标签选择器,选择pv资源的标签:pv-test

创建 PVC 对象

kubectl apply -f pvc-test.yml

查看 PVC 资源

image-20221230180255467

从输出结果来看,PVC 已经 Bound 到 PV 了,申请成功。

image-20221230180521984

4、Pod 中使用存储

PVC 申请成功后,接下来就可以在 Pod 中使用存储了,配置 Pod 文件。

vim pod-test.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
    - name: pod-test
      image: busybox
      args:
      - /bin/sh
      - -c
      - sleep 30000
      volumeMounts:
      - mountPath: "/mydata"
        name: mydata
  volumes:
    - name: mydata
      persistentVolumeClaim:
        claimName: pvc-test

其实就与普通的 Volume 格式类似,在 volume 中通过 persistentVolumeClaim 指定使用 pvc-test 申请的 Volume。

创建 Pod

kubectl apply -f pod-test.yml

查看 Pod 状态

image-20230102001214287

5、验证

Pod pod-test 容器中创建一个测试文件testfile,看看 NFS 共享文件中是否数据同步。

image-20230102003109834

在 NFS 共享目录中创建一个测试文件,在去 Pod 对应容器中看看是否有刚刚创建的 helloWrld

image-20230102003913619

如果都同步了,证明 Pod 共享了 NFS 的资源。

image-20230102003406954

从实验结果来看,Pod 中创建的文件同步到了 NFS 共享目录,同样,在 NFS 共享目录中创建的文件也同步到了 Pod 中了。


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

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

相关文章

QML教程(一)基础语法

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

面向对象设计原则概述

面向对象设计原则概述 软件的可维护性和可复用性 软件工程和建模大师Peter coad认为&#xff0c;一个好的系统设计与应该具备如下三个性质 可扩展性 灵活性 可插入性 软件的可维护性和可复用性 软件的复用和重用拥有众多优点&#xff0c;如可以提高软件的开发效率&#xf…

Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk

翻译&#xff1a; 给定一个数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;&#xff0c;由&#x1d45b;个正整数组成。 最初&#xff0c;您位于索引1&#xff0c;分数等于&#x1d44e;1。你可以执行两种动作: 向右移动…

CDN

CDN——Content Delivery Network&#xff0c;内容分发网络。 具体来说&#xff0c;CDN就是采用更多的缓存服务器&#xff08;CDN边缘节点&#xff09;&#xff0c;布放在用户访问相对集中的地区或网络中。当用户访问网站时&#xff0c;利用全局负载技术&#xff0c;将用户的访…

【CSP】邻域均值

邻域均值 邻域均值 题意比较好理解&#xff0c;就是算一些数字。如果采用暴力方法的话&#xff0c;就是用一个边长为 2∗r12*r12∗r1 的正方形框框住大矩阵&#xff0c;然后遍历这个框&#xff0c;求出其平均值&#xff0c;然后移动正方形框&#xff0c;直到大矩阵内所有像…

【免费开放源码】审批类小程序项目实战(预约审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

6.5 特殊用途语言特性

文章目录默认实参使用默认实参调用函数默认实参声明默认实参初始值内联函数和constexpr函数内联函数constexpr 函数把内联函数和constexpr函数声明在头文件内调试帮助assert预处理宏NDEBUG预处理变量默认实参 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同…

电子游戏销售之缺失值检测与处理

电子游戏销售之缺失值检测与处理 文章目录电子游戏销售之缺失值检测与处理0、写在前面1、数据缺失值预处理1.1 表的形状1.2 原始数据每个特征缺失和非缺失的数目1.3 每个特征缺失的率1.4 处理后各特征缺失值的数目1.5 删除缺失值后的数据展示2、替换法处理缺失值2.1 替换法2.2 …

1.Springboot配置细节

一、参考资料 13-SpringBoot配置-项目外部配置加载顺序_哔哩哔哩_bilibili 二、配置 2.1 配置文件 注意变量后面是:&#xff0c;而不是等号 2.2 读取配置文件 2.2.1 Value 比如配置文件application.properities中定义了一个name&#xff0c;其值为abc。 代码里面只需按照如…

一、软件安装与配置

一、PyTorch环境软件安装与配置 1.安装anaconda参考 anaconda老版本下载方法&#xff08;如何查看anaconda与python版本对应关系&#xff09;及安装教程_breadth_的博客-CSDN博客_anaconda旧版本下载 2.在anconda下安装和激活pytorch环境 此步并没有下载pytorch 3.下载pyto…

云计算运营—03 KVM虚拟化技术方案介绍

KVM虚拟化技术方案介绍 1.背景介绍 KVM&#xff08;Kernel-based Virtual Machine&#xff09; 开源全虚拟化方案 支持体系结构 x86(32位,64位)、IA64、PowerPC、S390 依赖x86硬件支持&#xff1a;Intel VT-x/ AMD-V内核模块&#xff0c;使得linux内核成为hypervisor XEN架构 …

《B-树》

tips&#xff1a;B-树读成b树&#xff0c;并不是b减树 【一】基本搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索树无要求O(N)二叉平衡树&#xff08;AVL和红黑树&#xff09;无要求&#xff0c;最后随机O(log2N)哈希无要求O(1)位图无要求O…

linux系统中SPI驱动框架的基本原理与实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中SPI驱动ICM-20608六轴传感器的操作。 目录 第一&#xff1a;linux系统下SPI驱动框架简介 第二&#xff1a;SPI设备驱动编写 第三&#xff1a;SPI设备和驱动匹配过程 第一&#xff1a;linux系统下SPI驱…

MySQL数据库高级面试题(1)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

CSDN年度征文 | 你好,2023

祝大家新年快乐~&#x1f9e7;&#x1f9e7;&#x1f9e7;⭐过去的2022⭐2022已成过去&#xff0c;2023慢步向我们走来。回首2022&#xff0c;这一年不是平凡的一年。这一年&#xff0c;有苦也有乐。冬奥会的成功举办、香港回归25周年、二十大胜利召开、航天任务圆满成功等等都…

设计 | 分享5个好用的PPT模板网站

第一PPT 这个老牌的模板网站了&#xff0c;全站都是免费下载&#xff0c;还是不错的 但是素材质量嘛&#xff0c;免费所以不太高。 第一PPT下载https://www.1ppt.com/ 模板狗 这个是最近发现的一个网站&#xff0c;其中内容比较精美。 而且不用开会员也能单独购买&#x…

【Android】APT

引言&#xff1a; 安卓中APT又叫Annotation Processing Tool&#xff0c;即注解处理器。Java中注解分为编译时注解和运行时注解&#xff0c;编译时注解无法通过反射的方式进行获取和处理&#xff0c;所以我们可以利用APT处理编译时注解。比如常见的三方库ButterKnife、ARouter…

mysql删除重复记录并且只保留一条

准备的测试表结构及数据 插入的数据中A,B,E存在重复数据,C没有重复记录 CREATE TABLE tab ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETutf8; -- --------------------…

使用root用户和普通用户完成分配任务案例 ansible(1)

目录 案例一&#xff1a; 控制主机和受控主机通过root用户通过免密验证方式远程控制受控主机实施对应任务。 案例二&#xff1a; 控制主机连接受控主机通过普通用户以免密验证远程控制受控主机实施特权指定操作。 案例一&#xff1a; 控制主机和受控主机通过root用户通过免…

<网络概述>——《计算机网络》

目录 1.网络基础 1.1 计算机网络背景 1.2 网络发展 1.3 软件分层 1.4 网络和操作系统的关系 1.5 局域网通信的原理 2. 网络协议 2.1 网络协议初识 2.1.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程 3.1 网络传输流程图 3.2 数据包…