Kubernetes存储

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes存储相关的知识,希望对你有一定的参考价值。

参考技术A 在 Docker的设计 实现中, 容器中的数据是临时性的,当容器销毁或重新启动时存储在容器内部的数据将会全部丢失 ,但实际上很多容器化应用是需要持久化保存的数据,这就需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中以保证数据的持久化存储。在 Kubernetes中Pod重建如同Docker销毁一样,数据就会丢失 ,Kubernetes也通过挂载数据卷方式为Pod数据提供持久化能力,这些数据卷以Pod为最小单位进行存储,通过共享存储或分布式存储在各个Pod之间实现共享。

Kubernetes是由Master节点及Node节点组成的,在Master节点中通过etcd存储了Kubernetes集群的节点信息、Pod信息、容器信息、配置信息。Node节点主要对外提供容器服务,着重描述Node节点与存储相关的内容。

Kubernetes以Pod为单位对外提供容器服务,真正的服务是通过Service进行访问的。 Kubernetes中的服务按类型分成三种:无状态服务(stateless)、普通有状态服务、有状态集群服务 。

无状态服务:不需要持久化存储的,即使Pod重建也不会受影响,只要确保服务的可靠性便可,Kubernetes通过ReplicationSet来保证某个服务的实例数量。

普通有状态服务:这类服务需要保留服务的状态,通常通过Kubernetes提供的Volume及Persistent Volume、Persistent Volume Claim来保存状态。

有状态的集群服务:这类服务除了保存服务状态的同时还需要提供集群管理的功能,集群管理过程中也涉及临时数据的保存、集群内数据共享等。

Kubernetes中涉及存储的主要使用场景 :

1) 容器集群相关配置信息及运行时信息保存,这类信息存储在etcd中。

2) 服务的基本配置文件及证书文件。

3) 服务的状态存储、数据存储信息。

4) 集群内不同服务交换共享的数据信息。

1) 临时文件形式 :同一个Pod内不同容器间通过共享内存方式访问,会创建一个空目录,交换完信息后会删除这个空目录。

2) HostPath方式 :同一个Node内不同的Pod间进行信息共享使用HostPath方式(比如时区timezone)。如果Pod配置了EmptyDir数据卷,则它在Pod的生命周期内都会存在。当Pod被分配到Node上的时候,会在Node上创建EmptyDir数据卷,并挂载到Pod的容器中。

3) PV及PVC: Kubernetes的持久化存储机制的核心是PV(Persistent Volume)、PVC (Persistent Volume Claim)。PV是Volume插件,关联到真正的后端存储系统,PVC是从PV中申请资源,而不需要关心存储的提供方。PVC和PV的关系就如同Pod和Node一样,Pod是消费Node提供的资源,PVC是消费PV提供的存储资源。PVC和PV通过匹配完成绑定关系,PVC可以被Pod里的容器挂载。

4) 网络方式 :不同Node节点之间的数据共享通过网络方式使用,通常采用分布式存储方式。开源的分布式文件系统比较流行的选择有GlusterFS和Ceph,还有一些其他的分布式文件系统(NFS)选择。

5) 自定义插件方式 :Kubernetes提供了丰富的Volume的插件来进行存储管理。如果存储管理接口不够用,用户可以通过CSI或Flex Volume进行扩展。

存储管理组件(存储组件)主要是接收北向API收到的Rest请求,维护持久卷的生命周期管理。如创建、删除卷, 存储组件负责与后端存储软件交互完成实际的创建、删除卷等操作;并负责调用Kubernetes原生接口创建对应的PVC和PV 。

存储后端系统提供数据文件的实际持久化能力,不仅需要实现数据文件的读写、副本复制等存储操作,通常还需具备多节点高可用的能力。

当需要为自己的微服务应用挂载持久卷时,只需要通过存储组件创建持久卷,存储组件会在Kubernetes业务集群创建PVC/PV,并到后端存储系统(如GlusterFS)上创建真正的物理Volume,同时维护好PVC/PV/Volume之间的一一映射对应关系。这样,用户部署容器时就可以选择挂载相应的持久卷,部署后相应的卷就可以挂载到对应的容器。应用挂载持久卷后,进行读写时就类似于本地目录的读写操作。

在Pod进行重建或者迁移到其他节点时,Pod可以自动挂回原来对应的持久卷,继续使用原先的数据。多个Pod可以共享一个持久卷,从而达到容器间文件共享的目的。

摘抄自陆平的《基于Kubernetes的容器云平台实战》一书的第11章Kubernetes存储

云原生 | Kubernetes篇Kubernetes(k8s)临时存储

文章目录

Kubernetes(k8s)临时存储

一、几种临时存储

二、emptyDir

三、扩展-hostPath


Kubernetes(k8s)临时存储

一、几种临时存储

Kubernetes 为了不同的目的,支持几种不同类型的临时卷:

  • emptyDir: Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存

  • configMap、downwardAPI 、 secret: 将不同类型的 Kubernetes 数据注入到 Pod 中

  • CSI 临时卷: 类似于前面的卷类型,但由专门支持此特性的指定 CSI 驱动程序提供

  • 通用临时卷: 它可以由所有支持持久卷的存储驱动程序提供

二、emptyDir

  • 当 Pod 分派到某个 Node 上时,emptyDir 卷会被创建

  • 在 Pod 在该节点上运行期间,卷一直存在。

  • 卷最初是空的。

  • 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,这些容器都可以读写 emptyDir 卷中相同的文件。

  • 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。

  • 存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存

apiVersion: v1
kind: Pod
metadata:
  name: "multi-container-pod"
  namespace: default
  labels:
    app: "multi-container-pod"
spec:
  volumes:    ### 以后见到的所有名字 都应该是一个合法的域名方式
  - name: nginx-vol
    emptyDir:   ### docker匿名挂载,外部创建一个位置  /abc
  containers:  ## kubectl exec -it podName  -c nginx-container(容器名)-- /bin/sh
  - name: nginx-container
    image: "nginx"
    volumeMounts:  #声明卷挂载  -v
      - name: nginx-vol
        mountPath: /usr/share/nginx/html
  - name: content-container
    image: "alpine"
    command: ["/bin/sh","-c","while true;do sleep 1; date > /app/index.html;done;"]
    volumeMounts: 
      - name: nginx-vol
        mountPath: /app

 

三、扩展-hostPath

官方文档:卷 | Kubernetes

 

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 宿主上目录位置
      path: /data
      # 此字段为可选
      type: Directory
apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: k8s.gcr.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa
      name: mydir
    - mountPath: /var/local/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      # 确保文件所在目录成功创建。
      path: /var/local/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: FileOrCreate

典型应用

解决容器时间问题

apiVersion: v1
kind: Pod
metadata:
  name: busy-box-test
  namespace: default
spec:
  restartPolicy: OnFailure
  containers:
  - name: busy-box-test
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: date-config
      mountPath: /etc/localtime
    command: ["sleep", "60000"]
  volumes:
  - name: date-config
    hostPath:
      path: /etc/localtime

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于Kubernetes存储的主要内容,如果未能解决你的问题,请参考以下文章

云原生 | Kubernetes篇Kubernetes(k8s)临时存储

2个Kubernetes使用同一个Ceph存储达到Kubernetes间持久化数据迁移

Kubernetes存储之Secret

Rook:Kubernetes上提供Kubernetes云原生本地持久存储

Kubernetes版本对接对象存储几种方案

Kubernetes版本对接对象存储几种方案