技术干货 | K8S如何引入Volumes?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Number1 为什么引入Volume? 当container crash的时候,kubelet将会重启它,里面之前运行的数据将会丢失,容器将以一个clean state的状态来启动。 运行在pod中的containers通常会共享数据,volumes的概念就是为了解决这些问题。

Number1

为什么引入Volume?   

  • 当container crash的时候,kubelet将会重启它,里面之前运行的数据将会丢失,容器将以一个clean state的状态来启动。

  • 运行在pod中的containers通常会共享数据,volumes的概念就是为了解决这些问题。

Number2

现状

kubernetes中的volume有完整的lifetime,在pod中可以脱离Container而存在。container重启的时候,volume中的pod会被保存;pod消失的时候,volume也会消失。 kubernetes支持多种volumes的类型,pod可以使用同时使用多个volume。类型如下:

emptyDir 

hostPath 

gcePersistentDisk 

awsElasticBlockStore 

nfs 

iscsi 

flocker 

glusterfs 

rbd 

cephfs 

gitRepo 

secret 

persistentVolumeClaim 

downwardAPI 

projected 

azureFileVolume 

azureDisk 

vsphereVolume 

Quobyte 

PortworxVolume 

ScaleIO 

Number3

常用存储类型

emptyDir

emptyDir卷当pod分配给Node的时候会被创建,伴随这pod在该Node上运行整个过程。开始的时候为空的, pod中的containers可以读写emptyDir volume中的同一个文件,这个volume可以被挂载到容器相同或者不同的目录。但是如果pod在该node上被removed,那么emptyDir中的数据将会被永远的删除。注意:如果容器crashing pod没有从node上remove,emptyDir中的volume数据是safe的。

emptyDir的用途

  • 暂存空间,如基于磁盘的合并排序

  • 检查一个长时间的计算以恢复崩溃

  • 持有内容管理器容器在Web服务器容器提供数据时提取的文件

默认情况下,根据您的环境,emptyDir卷存储在任何介质中,可能是磁盘或SSD或网络存储。 但是,您可以将emptyDir.medium字段设置为“Memory”,以告诉Kubernetes为您安装tmpfs(RAM支持的文件系统)。 虽然tmpfs非常快,但请注意,与磁盘不同,tmpfs在机器重新启动时被清除,您写入的任何文件都会计入您的容器的内存限制。

Pod的例子:

apiVersion: v1

kind: Pod

metadata:

  name: test-pd

spec:

  containers:

  – image: gcr.io/google_containers/test-webserver

    name: test-container

    volumeMounts:

    – mountPath: /cache

      name: cache-volume

  volumes:

  – name: cache-volume

    emptyDir: {}

Hostpath

hostPath卷将文件或目录从主机节点的文件系统挂载到您的pod中。 这不是大多数Pods需要的,但它为某些应用提供了强大的逃生舱。 

比如,一些使用hostPath的例子:

运行需要访问Docker内部的容器; 使用/ var / lib / docker的hostPath

在容器中运行cAdvisor; 使用/ dev / cgroups的hostPath

使用的时候需要注意:

1. 具有相同配置的pod(例如从podTemplate创建的),可能因节点上的不同文件在不同节点上的行为不同。 

2. 当Kubernetes按计划添加资源感知调度时,它将无法解决hostPath使用的资源。 

3. 在底层主机上创建的目录只能由root写入。 您需要以特权容器的身份运行您的进程,或修改主机上的文件权限,以便能够写入hostPath卷。

apiVersion: v1

kind: Pod

metadata:

  name: test-pd

spec:

  containers:

  – image: gcr.io/google_containers/test-webserver

    name: test-container

    volumeMounts:

    – mountPath: /test-pd

      name: test-volume

  volumes:

  – name: test-volume

    hostPath:

      # directory location on host

      path: /data

gcePersistentDisk

awsElasticBlockStore

Nfs

nfs卷允许现有的NFS(网络文件系统)共享挂载到您的pod中。 不同于在删除Pod时被清除的emptyDir,nfs卷的内容将被保留,并且卷仅被卸载。 这意味着NFS卷可以预先填充数据,并且该数据可以在pod之间“切换”。 NFS可以同时由多个写入器安装。

nfs例子:

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/nfs

iSCSI

iscsi卷允许将现有iSCSI(基于IP的SCSI)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,将保留iscsi卷的内容,并且该卷仅被卸载。 这意味着可以使用数据预先填充一个iscsi卷,并且该数据可以在pod之间“切换”。

iSCSI的一个特点是它可以同时由多个消费者以只读方式安装。 这意味着您可以使用数据集预先填充卷,然后根据需要从多个pod中并行提供。 不幸的是,iSCSI卷只能由读写模式的单个消费者进行装载——不允许同时写入。

iSCSI例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/iscsi

Flocker

Flocker是一个开源的集群容器数据卷管理器。它提供由各种存储后端支持的数据卷的管理和编排。

Flocker卷允许将Flocker数据集挂载到pod中。如果Flocker中尚未存在数据集,则需要首先使用Flocker CLI或使用Flocker API创建数据集。如果数据集已经存在,它将被Flocker重新连接到调度盒的节点,这意味着数据可以根据需要在pod之间“切换”。

Flocker例子:

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/flocker

glusterfs

glusterfs卷允许将Glusterfs(开源网络文件系统)卷安装到您的pod中。不同于在删除Pod时被清除的emptyDir,保留了一个glusterfs卷的内容,并且该卷只是被卸载。这意味着可以使用数据预先填充一个glusterfs卷,并且该数据可以在pod之间“切换”。GlusterFS可以同时由多个写入器安装。

Rbd

cephfs

gitRepo

secret

秘密卷用于将敏感信息(如密码)传递给pod。 您可以将秘密存储在Kubernetes API中,并将其作为文件安装在pod上,而不直接与Kubernetes连接。 秘密卷由tmpfs(RAM支持的文件系统)支持,因此它们永远不会写入非易失性存储。

PersistentVolumeClaim

persistentVolumeClaim卷用于将PersistentVolume安装到pod中。PersistentVolumes是用户在不知道特定云环境的细节的情况下“声称”持久存储(如GCE PersistentDisk或iSCSI卷)的一种方式。

downwardAPI

一个向下的API卷被用于使向下的API数据可用于应用程序。它安装一个目录,并将所请求的数据写入纯文本文件。

https://kubernetes.io/docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information/

projected

A projected volume可以映射很多volume源到相同的目录下, 当前,下面类型的volume sources支持的有:

secret

downwardAPI

configMap

例子:

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

SubPath

有时,在一个pod中共享一个卷用于多个用途是有用的。 volumeMounts.subPath属性可用于指定引用卷而不是根的子路径。 

下面是一个LAMP stack的例子,Html内容映射到html文件目录下,databases存储在MySQL文件目录下:

apiVersion: v1

kind: Pod

metadata:

  name: my-lamp-site

spec:

    containers:

    – name: mysql

      image: mysql

      volumeMounts:

      – mountPath: /var/lib/mysql

        name: site-data

        subPath: mysql

    – name: php

      image: php

      volumeMounts:

      – mountPath: /var/www/html

        name: site-data

        subPath: html

    volumes:

    – name: site-data

      persistentVolumeClaim:

        claimName: my-lamp-site-data


本文转移K8S技术社区-技术干货 | K8S如何引入Volumes?

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
13天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
22 3
|
1月前
|
Kubernetes Cloud Native 云计算
云原生时代的技术演进:Kubernetes与微服务架构的完美融合
随着云计算技术的飞速发展,云原生概念逐渐深入人心。本文将深入探讨云原生技术的核心——Kubernetes,以及它如何与微服务架构相结合,共同推动现代软件架构的创新与发展。文章不仅剖析了Kubernetes的基本工作原理,还通过实际案例展示了其在微服务部署和管理中的应用,为读者提供了一条清晰的云原生技术应用路径。
64 2
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes的奇妙之旅
【9月更文挑战第34天】在数字化浪潮中,云原生技术如Kubernetes已经成为IT行业的重要力量。本文旨在通过浅显易懂的方式,向初学者揭示Kubernetes的核心概念、架构设计及其在实际业务中的应用价值,帮助读者快速理解并掌握这一技术,为进一步深入学习和实践打下坚实基础。
51 1
|
2月前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
60 4
|
2月前
|
Kubernetes 负载均衡 Cloud Native
探索云原生技术:Kubernetes的魔法
【9月更文挑战第24天】 在数字化浪潮中,云原生技术如同现代航海的罗盘,指引着企业航向灵活、高效的未来。本文将深入剖析云原生世界的璀璨明星——Kubernetes,揭秘其如何在容器化的基础上,实现复杂应用的自动化部署、扩展和管理。从概念到实践,我们将一同领略Kubernetes如何简化运维、提高资源利用率,并推动微服务架构的发展。通过实际的代码示例,我们将手把手教你如何在云上构建和运行第一个Kubernetes集群,让理论与实践相结合,开启云原生之旅。
|
28天前
|
Kubernetes Cloud Native 调度
深入探讨容器化技术:Kubernetes 的魅力
【10月更文挑战第6天】深入探讨容器化技术:Kubernetes 的魅力
58 0
|
2月前
|
Kubernetes 负载均衡 监控
深入云原生技术:Kubernetes集群部署与管理
【9月更文挑战第17天】在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为企业新宠。本文将引导读者探索云原生的核心组件——Kubernetes,通过实际案例分析其部署与管理流程,旨在帮助技术从业者和企业决策者理解如何利用Kubernetes提升应用的可用性和性能。从基础概念到操作实践,我们将一同见证云原生技术的变革力量。
|
2月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
2月前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
67 0
|
2月前
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
38 0