k8s教程(Volume篇)-k8s存储机制概述

简介: k8s教程(Volume篇)-k8s存储机制概述

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

容器内部存储的生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。如果多个容器希望共享同一份存储,则仅仅依赖容器本身是很难实现的。在Kubernetes系统中,将对容器应用所需的存储资源抽象为存储卷 (Volume)概念 来解决这些问题。

Volume是与Pod绑定的(独立于容器)与Pod具有相同生命周期的资源对象,我们可以将Volume的内容理解为目录或文件

02 volume分类

Kubernetes目前支持的Volume类型包括Kubernetes内部资源对象类型开源共享存储类型存储厂商提供的硬件存储设备公有云提供的存储等。

将Kubernetes特定类型的资源对象映射为目录或文件,包括以下类型的资源对象:

类型 描述
ConfigMap 应用配置
Secret 加密数据
DownwardAPI Pod或Container的元数据信息
ServiceAccountToken Service Account中的token数据
Projected Volume 一种特殊的存储卷类型,用于将一个或多个上述资源对象一次性挂载到容器内的同一个目录下

Kubernetes管理的宿主机本地存储类型如下:

类型 描述
EmptyDir 临时存储
HostPath 宿主机目录

持久化存储(PV))和网络共享存储类型如下:

类型 描述
CephFS 一种开源共享存储系统
Cinder 一种开源共享存储系统
CSI 容器存储接口(由存储提供商提供驱动程序和存储管理程序)
FC(Fibre Channel) 光纤存储设备
FlexVolume 一种基于插件式驱动的存储
Flocker 一种开源共享存储系统
Glusterfs 一种开源共享存储系统
iSCSI iSCSI存储设备
Local 本地持久化存储
NFS 网络文件系统
PersistentVolumeClaim 简称PVC,持久化存储的申请空间
Portworx Volumes Portworx提供的存储服务
Quobyte Volumes Quobyte提供的存储服务
RBD(Ceph Block Device) Ceph块存储

存储厂商提供的存储卷类型如下:

类型 描述
ScalelO Volumes DellEMC的存储设备
StorageOS StorageOS提供的存储服务
VsphereVolume VMWare提供的存储系统

公有云提供的存储卷类型如下:

类型 描述
AWSElasticBlockStore AWS公有云提供的Elastic Block Store
AzureDisk Azure公有云提供的Disk
AzureFile Azure公有云提供的File
GCEPersistentDisk GCE公有云提供的Persistent Disk

03 将资源对象映射为存储卷

Kubernetes中有一些资源对象可以以存储卷的形式挂载为容器内的目录或文件,目前包括ConfigMap、Secret、Downward API、ServiceAccountToken、Projected Volume。

3.1 ConfigMap

ConfigMap主要保存应用程序所需的配置文件,并且通过Volume形式挂载到容器内的文件系统中,供容器内的应用程序读取。

之前在pod篇有写过,可以参考:《k8s教程(pod篇)-配置管理》

3.2 Secret

假设在Kubernetes中已经存在如下Secret资源:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: dmFsdWUtMgOK 
  username: dmFsdWUtMOOK

ConfigMap的用法类似,在PodYAML配置中可以将Secret设置为一个

Volume,然后在容器内通过volumeMountsSecret类型的Volume挂载到/etc/foo目录下:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
  secret:
    secretName: mysecret

3.3 Downward API

通过Downward API可以将PodContainer的某些元数据信息(例如Pod名称、Pod IPNode IPLabelAnnotation、容器资源限制等)以文件的形式挂载到容器内,供容器内的应用使用。

之前在pod篇有写过,可以参考:《k8s教程(pod篇)-容器获取pod信息(Downward API)》

3.4 Projected Volume

Projected Volume是一种特殊的存储卷类型,用于将一个或多个上述资源对象(ConfigMap、Secret、Downward API)一次性挂载到容器内的同一个目录

下面是一个使用Projected Volume挂载ConfigMapSecretDownward API 共3种资源的示例:

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume" 
      readonly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
        name: mysecret
        items: 
      - key: username
          path: my-group/my-username
      - downwardAPI:
      items:  
      - path: "labels"
      fieldRef:
      fieldPath: metadata.labels 
      - path: "cpu_limit" 
      resourceFieldRef:
        containerName: container-test 
        resource: limits.cpu
    - configMap:
      name: myconfigmap
      items: 
      - key: config
          path: my-group/my-config

此外,Kubernetes从1.l1版本开始引入对ServiceAccountToken的挂载支持, 在1.l2版本时达到Beta阶段。ServiceAccountToken通常用于容器内应用访问API Server鉴权的场景中,例子如下:

apiVersion: v1
kind: Pod
metadata:
  name: sa-token-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts: 
    - name: token-vol
      mountPath: "/service-account" 
      readOnly: true
  volumes: 
  - name: token-vol
    projected:
      sources:
      - serviceAccountToken:
          audience: api # 预期受众的名称,Token的接收者必须使用其中的audience标识符来标识自己,否则拒绝该token
          expirationSeconds: 3600  # Service Account Token国企时间,默认1h
          path: token # 挂载目录下的相对路径

04 Node本地存储卷

Kubernetes管理的Node本地存储卷(Volume)的类型如下:

类型 描述
EmptyDir 与Pod同生命周期的Nodell临时存储
HostPath Node目录
Local 基于持久卷(PV))管理的Node目录

4.1 EmptyDir

这种类型的Volume将在Pod被调度到Node时进行创建,在初始状态下目录中是空的,所以命名为“空目录”(Empty Directory)。它与Pod具有相同的生命周期,当Pod被销毁时,Node上相应的目录也会被删除。同一个Pod中的多个容器都可以挂载这种Volume

由于EmptyDir类型的存储卷的临时性特点,它通常可以用于以下应用场景中:

  • 基于磁盘进行合并排序操作时需要的暂存空间;
  • 长时间计算任务的中间检查点文件;
  • 为某个Web服务提供的临时网站内容文件。

在默认情况下,kubelet会在Node的工作目录下为Pod创建EmptyDir目录,这

个目录的存储介质可能是本地磁盘、SSD磁盘或者网络存储设备,取决于环境的

配置。

另外,EmptyDir可以通过medium字段设置存储介质为“Memory”,表示使用基于内存的文件系统(tmpfsRAM-backed filesystem)。虽然tmpfs的读写速度非常快,但与磁盘中的目录不同,在主机重启之后,tmpfs的内容就会被清空。此外,写入tmpfs的数据将被统计为容器的内存使用量,受到容器级别内存资源上限 (Memory Resource Limit)的限制。

下面是使用EmptyDir类型的存储卷的Pod的YAML配置示例,该类型的存储卷的参数只有一对花括号“{}”:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes: 
  - name: cache-volume 
    emptyDir: {}

4.2 HostPath

HostPath类型的存储卷用于将Node文件系统的目录或文件挂载到容器内部使用

对于大多数容器应用来说,都不需要使用宿主机的文件系统,适合使用HostPath存储卷的一些应用场景如下:

  • 容器应用的关键数据需要被持久化到宿主机上;
  • 需要使用Docker中的某些内部数据,可以将主机的/var/ib/docker目录挂载到容器内;
  • 监控系统,例如cAdvisor需要采集宿主机/sys目录下的内容;
  • Pod的启动依赖于宿主机上的某个目录或文件就绪的场景。

HostPath存储卷的主要配置参数为path,设置为宿主机的目录或文件路径; 还可以设置一个可选的参数type,表示宿主机路径的类型,目前支持的type配置参数和校验规则如下所示:

type配置参数 校验规则
系统默认值,为向后兼容的设置,意为系统在挂载path时不做任何校验
DirectoryOrCreate path指定的路径必须是目录,如果不存在,则系统将自动创建该目录,将权限设置为0755,与kubelet具有相同的owner和group
Directory path指定的目录必须存在,否则挂载失败
FileOrCreate path指定的路径必须是文件,如果不存在,则系统将自动创建该文件,将权限设置为0644,与kubelet具有相同的owner和group
File path指定的文件必须存在,否则挂载失败
Socket path指定的UNIX socket必须存在,否则挂载失败
CharDevice path指定的字符设备(character device)必须存在,否则挂载失败
BlockDevice path指定的块设备(block device)必须存在,否则挂载失败

下面是使用HostPath类型的存储卷的PodYAML配置示例,其中将宿主机的/data目录挂载为容器内的/host-data目录:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-container
    volumeMounts:
    - mountPath: /host-data
      name: test-volume
  volumes: 
  - name: test-volume
    hostPath:
      path: /data #宿主机目录
      type: Directory #可选,"Directory"表示该目录必须存在

由于HostPath使用的是宿主机的文件系统,所以在使用时有以下注意事项:

  • 对于具有相同HostPath设置的多个Pod(例如通过podTemplate创建的)来说,可能会被Master调度到多个Node上运行,但如果多个NodeHostPath中的文件内容(例如是配置文件)不同,则各Pod应用的运行可能出现不同的结果;
  • 如果管理员设置了基于存储资源情况的调度策略,则HostPath目录下的磁盘空间将无法计入Node的可用资源范围内,可能出现与预期不同的调度结果;
  • 如果是之前不存在的路径,则由kubelet自动创建出来的目录或文件的 owner将是root,这意味着如果容器内的运行用户(User)不是root,则将无法对该目录进行写操作,除非将容器设置为特权模式(Privileged),或者由管理员修改HostPath的权限以使得非root用户可写。
  • HostPath设置的宿主机目录或文件不会随着Pod的销毁而删除,在Pod不再存在之后,需要由管理员手工删除。

05 文末

由于篇幅有限,关于持久卷的内容,后续再出相关的文章,谢谢大家的阅读,希望能帮助到大家,本文完!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
276 0
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
715 263
|
存储 Kubernetes 容器
Kubernetes 存储选项:持久化卷与存储类
【8月更文第29天】随着容器化的普及,越来越多的应用程序需要持久化数据以保持状态信息。Kubernetes 提供了一套完整的解决方案来管理和配置持久化存储,包括持久卷 (Persistent Volume, PV)、持久卷声明 (Persistent Volume Claim, PVC) 和存储类 (StorageClass)。本文将详细介绍这些概念,并通过实际示例来演示如何在 Kubernetes 中配置存储。
1044 3
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
357 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
276 1
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
12月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
655 13
|
Kubernetes Cloud Native 持续交付
Kubernetes全面概述
Kubernetes(K8s)是2014年由Google开源的容器编排平台,基于其内部大规模容器管理系统Borg打造。它简化了容器化应用的部署、扩展与管理,具备高度可移植性、可扩展性及自动化特性。Kubernetes的核心组件包括Master节点与Node节点,涵盖kube-apiserver、etcd等关键子系统。其应用场景广泛,适用于微服务架构、大数据处理、DevOps及云原生应用等领域,并支持多种部署方式,如Minikube、Kubeadm等。
380 4

推荐镜像

更多