k8s 卷存储

应用场景

pod 中的容器的数据随着pod 的重启,删除就会消失,有的应用场景需要持久化数据,这时就需要卷挂载。

Tips:

volumes  是 pod 的一个组成部分, 因此像容器一样在 pod 的规范中就定义了。 它们不是独立的 Kubernetes 资源对象, 也不能单独创建或删除。 pod 中的所有容器都可以使用卷, 但必须先将它挂载在每个需要访问它的容器中。 在每个容器中, 都可以在其文件系统的任意位置挂载卷。

常见的类型

empty   一  用于存储临时数据的简单空目录。
 
hostPath — 用于将目录从工作节点的文件系统挂载到pod中
 
gitRepo  一 通过检出Git仓库的内容来初始化的卷。
 
nfs  —  挂载到pod中的NFS共享卷。
 
configMap secret downwardAPI 一 用于将 Kubemetes 部分资源和集群信息公开给 pod 的特殊类型的卷

配置操作

empty 配置

emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

在Pod中的定义

apiVersion: vl 
kind: Pod 
metadata: 
    name: fortune 
spec: 
  containers: 
- image: luksa/fortune                       #第一个容器名为 html-asdf
  name: html-asdf 
  volumeMounts: 
  - name: html                               #容器挂载的本地卷为 html
    mountPath: /var/htdocs                   #挂载到容器的此目录
    
- image: nginx:alpine 
  name: web-server                           #第二个容器称为 web-server
  volumeMounts : 
  - name: html                               #容器挂载的本地卷为 html
    mountPath: /usr/share/nginx/html         #设为只读 
    readOnly: true 
  ports: 
  - containerPort: 80 
    protocol: TCP 

volumes 
- name: html                                 #命名为html
  emptyDir: {}                               #卷的类型为emptyDir
View Code
指定用于 EMPTYDIR 的介质
作为卷来使用的 emptyDir ,是在承载 pod 工作节点的实际磁盘上创建的,此其性能取决于节点的磁盘类型。 但我们可以通知 Kubemete tmfs 文件系统存在内存而非硬盘创建 emptyDir 。因 此,将emptyDir medium 设置为  Memory
volumes: 
- name: html
  emptyDir
    medium: Memory
View Code

使用 Git 仓库作为存储卷

gitRepo 卷基本上也是 emptyDir 卷,它通过克隆 Git 仓库并在 pod启动时(但在创建容器之前 检出特定版本来填充数据)。gitRepo 容器就像 emptyDir 卷一样, 基本上是一个专用目录, 专门用于包含卷的容器并单独使用。
 
当 pod 被删除时, 卷及其内容被删除。 然而, 其他类型的卷并不创建新目录, 而是将现有的外部目录挂载到 pod 的容器文件系统中。 该卷的内容可以保存多个 pod 实例化

Notice:

在创 gitRepo 卷后,它并不能和对应 repo 保持同步,当向Git 仓库推送新增的提交时,卷中的文件将不会被更新。然而,如果所用 pod 是由 ReplicationController 管理的,删除这个 pod 将触发新建一个新的 pod ,而这个新 pod的卷中将包含最新的提交
apiVersion: vl 
kind: Pod 
metadata: 
  name: gitrepo-vol-pod
spec: 
  containers: 
  - image: nginx:alpine 
    name: web-server 
    volumeMounts : 
    - name : html
      mountPath: /usr/share/nginx/html 
      readOnly: true 
    ports: 
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html                                 #容器挂载的本地卷为 html
    gitRepo:
    repository: https://github.com/kzf/asdf-website-example.git
    revision: master 
    directory: . 
View Code

Tips: 

为了实现pod  gitrepo 目录与git 仓库实时同步可以通过 sidecar 容器

猜你喜欢

转载自www.cnblogs.com/fanggege/p/12188123.html