k8s mysql volume_技术干货 | K8S如何引入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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值