theboyaply

学,就硬学!

  • Home
  • Archives
  • Java
  • Maven
  • Docker
  • Kubernetes
  • JavaScript
  • ES6
  • Vue
  • 踩坑记录
  • noted

  • 搜索
element ui vue wsimport webservice npm mysql redis node nginx nfs ftp es6 开发工具 vscode 前端 javascript springboot 常见问题 tomcat oracle jenkins maven k8s Linux gitlab docker java

k8s Volume介绍

发表于 2020-03-31 | 分类于 Kubernetes | 0 | 阅读次数 405
  • k8s volume介绍
  • volume 类型
  • emptyDir
    • 示例
  • hostPath
    • 示例:

参考:https://kubernetes.io/zh/docs/concepts/storage/volumes

k8s volume介绍

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。 首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建(这和 docker 容器的重启不一样,docker 容器重启不会丢失数据)。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。

volume 类型

Kubernetes 支持下列类型的卷:

  • awsElasticBlockStore
  • azureDisk
  • azureFile
  • cephfs
  • cinder
  • configMap
  • csi
  • downwardAPI
  • emptyDir
  • fc (fibre channel)
  • flexVolume
  • flocker
  • gcePersistentDisk
  • gitRepo (deprecated)
  • glusterfs
  • hostPath
  • iscsi
  • local
  • nfs
  • persistentVolumeClaim
  • projected
  • portworxVolume
  • quobyte
  • rbd
  • scaleIO
  • secret
  • storageos
  • vsphereVolume

emptyDir

当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。

Pod 中多个容器可以挂载同一个 emptyDir 卷,容器中挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。

注意:

容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。

emptyDir 的一些用途:

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

默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 "Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

示例

apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir-pod
spec:
  containers:
  - name: nginx-container
    image: hub.xixihaha.com/library/mynginx:v1
    volumeMounts:
    - mountPath: /nginx-cache
      name: cache-volume
  - name: busybox-container
    image: busybox
    command: ['sh', '-c', 'sleep 3600s']
    volumeMounts:
    - mountPath: /busybox-cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

说明:

以上资源清单定义了两个容器,一个 emptyDir 类型的 volume。nginx-container 容器将 volume 挂载到了容器中的 /nginx-cache 目录下;busybox-container 容器将 volume 挂载到了容器中的 /busybox-cache 目录下。

创建 Pod:

[root@k8s-master01 volume]# kubectl apply -f volume-emptydir-pod.yaml 
pod/volume-emptydir-pod created

[root@k8s-master01 volume]# kubectl get pod
NAME                  READY   STATUS    RESTARTS   AGE
volume-emptydir-pod   2/2     Running   0          11s

查看 nginx-container 容器中的挂载目录内容:

[root@k8s-master01 volume]# kubectl exec volume-emptydir-pod -c nginx-container -it -- bin/bash
root@volume-emptydir-pod:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  nginx-cache	opt  proc  root  run  sbin  srv  sys  tmp  usr	var
root@volume-emptydir-pod:/# cd nginx-cache
root@volume-emptydir-pod:/nginx-cache# ls
root@volume-emptydir-pod:/nginx-cache#

查看 busybox-container 容器中的挂载目录内容:

[root@k8s-master01 ~]# kubectl exec volume-emptydir-pod -c busybox-container -it -- bin/sh
/ # ls
bin  busybox-cache  dev  etc  home  proc  root  sys  tmp  usr  var
/ # cd busybox-cache
/busybox-cache # ls
/busybox-cache #

两个目录中都是空的。

在 nginx-container 容器中的挂载目录添加一个文件:

root@volume-emptydir-pod:/nginx-cache# echo "this's nginx-container add content" > a.txt
root@volume-emptydir-pod:/nginx-cache# ls
a.txt

查看 busybox-container 容器中的挂载目录内容:

/busybox-cache # ls
a.txt
/busybox-cache # cat a.txt 
this's nginx-container add content

因为两个容器共用一个 volume,所以在 busybox-container 容器中可以看见 nginx-container 容器添加的内容,反之也是一样的。

hostPath

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。

例如,hostPath 的一些用法有:

  • 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
  • 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
  • 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。

支持的 type 值如下:

取值行为
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。
Directory在给定路径上必须存在的目录。
FileOrCreate如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。
File在给定路径上必须存在的文件。
Socket在给定路径上必须存在的 UNIX 套接字。
CharDevice在给定路径上必须存在的字符设备。
BlockDevice在给定路径上必须存在的块设备。

当使用这种类型的卷时要小心,因为:

  • 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
  • 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
  • 基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。

示例:

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:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

警告:

应当注意,FileOrCreate 类型不会负责创建文件的父目录。如果挂载挂载文件的父目录不存在,pod 启动会失败。为了确保这种 type 能够工作,可以尝试把文件和它对应的目录分开挂载,如下所示:

FileOrCreate Pod 示例:

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

-- end --

# k8s
k8s Secret介绍
1-maven 介绍
  • 文章目录
  • 站点概览
theboyaply

theboyaply

好记性不如烂笔头

184 日志
13 分类
27 标签
Github E-mail
Creative Commons
0%
© 2019 — 2023 theboyaply
由 Halo 强力驱动
|
主题 - NexT.Gemini
湘ICP备19009291号

湘公网安备 43312402001034号