K8s卷存储详解(一)

这篇具有很好参考价值的文章主要介绍了K8s卷存储详解(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

K8s 存储

什么是卷?为什么要用卷?

我们知道K8s是基于容器,对各个Pod进行管理的。Pod是由容器构成的,我也知道,容器(如Docker)有个特点就是,容器删除后,在容器中产生的数据也会随之销毁。K8s会监控容器的运行状态,当有容器崩溃或停止时,K8s的Controller会删除这些容器,并重新创建新的容器。如果容器被销毁,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。在崩溃期间,kubelet 会以干净的状态重新启动容器。

另外一个需求就是:当多个容器在一个 Pod 中运行并且需要共享文件时, 就需要跨所有容器设置和访问共享文件系统。

K8s卷分类

根据应用场景不同,和需求不同,将卷分为不同的种类

  • 临时卷

  • 持久卷

  • 投射卷

卷的相关参数

  • 卷类型

  • 卷挂载位置

卷挂载位置

卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。

注意:卷不能挂载到其他卷之上(不过存在一种使用 subPath 的相关机制),也不能与其他卷有硬链接。

K8s目前支持的卷类型

已启用的卷类型

  1. awsElasticBlockStore (已弃用)
  2. azureDisk (已弃用)
  3. cinder (已弃用)
  4. gcePersistentDisk(已弃用)
  5. gcePersistentDisk(已弃用)
  6. gitRepo (已弃用)
  7. glusterfs(已移除)
  8. portworxVolume(已弃用)
  9. vsphereVolume(已弃用)
  10. flexVolume(已弃用)

可以使用的卷类型

  1. cephfs
  2. configMap
  3. downwardAPI
  4. emptyDir
  5. fc (光纤通道)
  6. hostPath
  7. iscsi
  8. local
  9. nfs
  10. persistentVolumeClaim
  11. subPath
  12. 树外(Out-of-Tree)卷插件

常用的数据卷(Volume)有:

  • 本地:如,HostPath、EmptyDir;
  • 网络:如,NFS、Ceph、GlusterFS;
  • 公有云:如,AWS EBS;
  • K8s资源:如,Configmap、Secret。

临时卷

什么是临时卷?

临时卷的生命周期与 Pod 的生命周期相同,与 Pod 一起创建和删除,当 Pod 不再存在时,Kubernetes 也会销毁临时卷。 所以停止和重新启动 Pod 时,不会受持久卷在何处可用的限制。

应用场景1:有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。

示例:缓存服务经常受限于内存大小,而且可以将不常用的数据转移到比内存慢的存储中,对总体性能的影响并不大。

应用场景2:些应用程序需要以文件形式注入的只读数据

示例:比如配置数据或密钥。

临时卷类型

根据不同的用途,支持几种不同类型的临时卷

  • EmptyDir: Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存
  • 见投射卷:ConfigMap、 DownwardAPI、 Secret: 将不同类型的 Kubernetes 数据注入到 Pod 中
  • CSI 临时卷: 类似于前面的卷类型,但由专门支持此特性 的指定 CSI 驱动程序提供
  • 通用临时卷: 它可以由所有支持持久卷的存储驱动程序提供

emptyDirconfigMapdownwardAPIsecret 是作为 本地临时存储 提供的。它们由各个节点上的 kubelet 管理。

"本地"意味着存储介质不能是网络上的。

K8s卷存储详解(一),kubernetes,容器,云原生

EmptyDir

EmptyDir是在当 Pod 分派到某个Node节点上时创建的,它的初始内容为空,k8s自动分配一个目录,而无需指定宿主机上对应的目录文件。当Pod销毁时, EmptyDir中的数据也会被永久删除。

无论Pod 中的容器挂载 emptyDir 卷的路径是否相同,这些容器都可以读写 emptyDir 卷中相同的文件。

说明:容器崩溃并会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir 卷中的数据是安全的

emptyDir 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

设置卷挂载位置:

使用emptyDir.medium 字段用来控制 emptyDir 卷的存储位置。

挂载位置可以是基于存储介质的,也可以是基于内存的:

emptyDir 卷存储在该节点所使用的介质上; 此处的介质可以是磁盘、SSD 或网络存储,这取决于你的环境

如果是挂载 tmpfs,将 emptyDir.medium 字段设置为 "Memory", 它与磁盘不同:tmpfs 在节点重启时会被清除, 并且你所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

示例:

emptyDir 官方配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi

容器共享示例:

apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    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: {}

创建Pod

[root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml

# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-emptydir -n dev -o wide
NAME                  READY   STATUS    RESTARTS   AGE      IP       NODE   ...... 
volume-emptydir       2/2     Running   0          97s   x.x.x.x   node1  ......

# 通过podIp访问nginx
[root@k8s-master01 ~]# curl <IP>


# 通过kubectl logs命令查看指定容器的标准输出
[root@k8s-master01 ~]# kubectl logs -f volume-emptydir -n dev -c busybox

卷限制:

基于介质:通过为默认介质指定大小限制,来限制 emptyDir 卷的存储容量。

基于内存:当启用 SizeMemoryBackedVolumes 特性门控时, 你可以为基于内存提供的卷指定大小。 如果未指定大小,则基于内存的卷的大小为 Linux 主机上内存的 50%。

为本地临时性存储设置请求和限制

以指定 ephemeral-storage 来管理本地临时性存储。 Pod 中的每个容器可以设置以下属性:

  • spec.containers[].resources.limits.ephemeral-storage
  • spec.containers[].resources.requests.ephemeral-storage

表示存储容量的 方式有2种

  • 加后缀表达式(可加的后缀:E、P、T、G、M、k)
  • 2 的幂级数表达式(Ei、Pi、Ti、Gi、Mi、Ki)

官方示例:

假如,Pod 包含两个容器。每个容器请求 2 GiB 大小的本地临时性存储。 每个容器都设置了 4 GiB 作为其本地临时性存储的限制。 因此,整个 Pod 的本地临时性存储请求是 4 GiB,且其本地临时性存储的限制为 8 GiB。 该限制值中有 500Mi 可供 emptyDir 卷使用。

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        ephemeral-storage: "2Gi"			# 关键配置,注意单位
      limits:
        ephemeral-storage: "4Gi"			# 关键配置,注意单位
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:									# 挂载的卷
    - name: ephemeral
      emptyDir:
        sizeLimit: 500Mi

CSI 临时卷

使用 CSI 临时存储的 Pod 的示例清单:

kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
spec:
  containers:
    - name: my-frontend
      image: busybox:1.28
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-inline-vol
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-csi-inline-vol
      csi:
        driver: inline.storage.kubernetes.io
        volumeAttributes:
          foo: bar

通用临时卷

特性状态: Kubernetes v1.23 [stable]

临时存放Pod数据目录,创建初始为空。

通用临时卷与EmptyDir不同的功能特性:

  • 存储可以是本地的,也可以是网络连接的。

  • 卷可以有固定的大小,Pod 不能超量使用。

  • 卷可能有一些初始数据,这取决于驱动程序和参数。

  • 支持典型的卷操作,前提是相关的驱动程序也支持该操作,包括 快照、 克隆、 调整大小和 存储容量跟踪)。

官方示例:

kind: Pod
apiVersion: v1
metadata:
  name: my-app
spec:
  containers:
    - name: my-frontend
      image: busybox:1.28
      volumeMounts:
      - mountPath: "/scratch"
        name: scratch-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: scratch-volume
      ephemeral:
        volumeClaimTemplate:
          metadata:
            labels:
              type: my-frontend-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "scratch-storage-class"
            resources:
              requests:
                storage: 1Gi

参阅:

k8s存储:卷、持久卷、存储类

k8s数据存储详解

存储

K8S系列之存储文章来源地址https://www.toymoban.com/news/detail-605249.html

到了这里,关于K8s卷存储详解(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

    Kubernetes是一个开源的, 用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制 。其核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着,管理员可

    2024年02月08日
    浏览(87)
  • 【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解

    Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。 一个 Secret 可以包含 Pod 访问数据库所需的用户凭证。 例如,由用户名和密码组成的数据库连接字符串。 你可

    2024年02月02日
    浏览(66)
  • 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

    在上一篇文章中,我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,三种设置方式,本篇文章,我们将继续学习数据的传递。 有两种方式可以将 Pod 和 Container 字段传递给运行中的容器: 环境变量 卷文件 这两种呈现 Pod

    2024年01月25日
    浏览(141)
  • Kubernetes基础(二十三)-k8s持久化存储详解

    1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决。Pod只需要通

    2024年03月17日
    浏览(51)
  • 【云原生】K8S存储卷:PV、PVC详解

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

    2024年02月12日
    浏览(42)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(69)
  • 云上攻防-云原生篇&;Kubernetes&;K8s安全&;API&;Kubelet未授权访问&;容器执行

    curl -XPOST -k “https://192.168.139.132:10250/run///” -d “cmd=id” 执行的命令是test03容器里的命令,需要进行容器逃逸。 1、攻击8080端口:API Server(Master)未授权访问 旧版本的k8s的API Server默认会开启两个端口:8080和6443。 6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,

    2024年04月22日
    浏览(77)
  • 云原生Kubernetes:K8S概述

    目录 一、理论 1.云原生 2.K8S 3.k8s集群架构与组件 4.K8S网络 二、总结 (1)概念 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展,适用于各种不同的云平台。 如果要更直接通俗的来解释下上面的概念,云原生更

    2024年02月10日
    浏览(55)
  • 【云原生 • Kubernetes】认识 k8s、k8s 架构、核心概念点介绍

    目录 一、Kubernetes 简介 二、Kubernetes 架构 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服务 service 6. 发布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念总结 Kubernetes 简称 k8s,是支持云原生部署的一个平台,起源于谷歌。谷歌早在十几

    2024年02月03日
    浏览(199)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包