kubernetes中常用的存储卷

2021-01-02 23:28

阅读:629

标签:exp   erp   字段   调度   ready   shm   使用   ash   任务   

Docker 也有 Volume 的概念,但对它只有少量且松散的管理。 在 Docker 中,Volume 是磁盘上或者另外一个容器内的一个目录。 直到最近,Docker 才支持对基于本地磁盘的 Volume 的生存期进行管理。 虽然 Docker 现在也能提供 Volume 驱动程序,但是目前功能还非常有限 (例如,截至 Docker 1.7,每个容器只允许有一个 Volume 驱动程序,并且无法将参数传递给卷)。

另一方面,Kubernetes 卷具有明确的生命周期——与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。 也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。

卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录。 特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。

使用卷时, Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).

容器中的进程能看到由它们的 Docker 镜像和卷组成的文件系统视图。 Docker 镜像 位于文件系统层次结构的根部,并且任何 Volume 都挂载在镜像内的指定路径上。 卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。

k8s官网文档地址:https://kubernetes.io/zh/docs/concepts/storage/volumes/

Volume的常用类型

  • emptyDir
  • hostPath
  • NetworkVolume
  • ConfigMap和Secret

emptyDir
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。

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

缓存空间,例如基于磁盘的归并排序。
为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 "Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容?的内存消耗,受容?内存限制约束。

比如: /dev/shm挂载点,其tmpfs文件系统可以更快提供缓存,音视频类型会用到的比较多;

[root@master1 ~]# df -hT /dev/shm
文件系统       类型   容量  已用  可用 已用% 挂载点
tmpfs          tmpfs  910M     0  910M    0% /dev/shm

示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: write
    image: centos
    command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data             
emptyDir: {}

hostPath
hostPath卷类似于 docker 中的 -v 选项,能将主机节点文件系统上的文件或目录挂载到运行的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 用户( fsGroupChangePolicy 安全上下文或者 spec.privileged 特权模式即可)写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容?能够写入 hostPath 卷。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c - sleep 36000
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    hostPath:
      path: /tmp
      type: Directory

网络存储(NFS示例)

nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。

NFS服务器地址

[root@node1 ~]# showmount -e 172.16.1.78
Export list for 172.16.1.78:
/data 172.16.0.0/16

简单的nfs示例:

[root@master1 nfs]# cat nfs.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment1
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      containers:                 #列表所以下面会有-
      - name: nginx-deployment1    #镜像
        image: nginx:1.8
        ports:
        - containerPort: 80
        volumeMounts:                      #数据卷  
        - name: wwwroot                    #名称  可以写多个通过名称来对应
          mountPath: /usr/share/nginx/html    #镜像发布路径
      volumes:
      - name: wwwroot                      #对应上面数据卷名称
        nfs:                               #类型nfs
          server: 172.16.1.78           #nfs对应IP
          path: /data                  #nfs的共享目录路径
          readOnly                      #只读 可以不写默认是读写
[root@master1 nfs]# vim nfs.yaml 
[root@master1 nfs]# kubectl apply -f nfs.yaml 
deployment.apps/nginx-deployment1 created
[root@master1 nfs]# kubectl get pods
NAME                                READY   STATUS      RESTARTS   AGE
mypod                               0/1     Completed   0          125m
nginx-deployment-9cdc9bd5c-pzzst    1/1     Running     3          3d17h
nginx-deployment1-898d6bdf6-d7tvn   1/1     Running     0          21s
secret-env-pod                      0/1     Completed   0          173m
web-nginx-dep2-66ccfd7fb7-z2x84     1/1     Running     2          9d
[root@master1 nfs]# kubectl exec -it nginn-deploment1-**** /bin/bash
root@nginx-deployment1-898d6bdf6-d7tvn:/# df -h
Filesystem               Size  Used Avail Use% Mounted on
overlay                   39G  6.1G   33G  16% /
tmpfs                     64M     0   64M   0% /dev
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   39G  6.1G   33G  16% /etc/hosts
shm                       64M     0   64M   0% /dev/shm
172.16.1.78:/data         39G  4.7G   34G  13% /usr/share/nginx/html
tmpfs                    910M   12K  910M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                    910M     0  910M   0% /proc/acpi
tmpfs                    910M     0  910M   0% /proc/scsi
tmpfs                    910M     0  910M   0% /sys/firmware
root@nginx-deployment1-898d6bdf6-d7tvn:/# ls /usr/share/nginx/html/
docker_images
root@nginx-deployment1-898d6bdf6-d7tvn:/# echo ‘Hello NFS Volume test!!!‘ > /usr/share/nginx/html/index.html
root@nginx-deployment1-898d6bdf6-d7tvn:/# ls /usr/share/nginx/html/
docker_images  index.html
root@nginx-deployment1-898d6bdf6-d7tvn:/# exit
exit
[root@master1 nfs]# kubectl get svc -o wide
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE     SELECTOR
kubernetes         ClusterIP   10.0.0.1             443/TCP        10d     
nginx-deployment   NodePort    10.0.0.238           80:32256/TCP   3d17h   app=nginx-deployment
[root@master1 nfs]# kubectl get pod  -o wide
NAME                                READY   STATUS      RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
mypod                               0/1     Completed   0          127m    10.244.1.19   node2.ljy.com     
nginx-deployment-9cdc9bd5c-pzzst    1/1     Running     3          3d17h   10.244.2.11   master1.ljy.com   
nginx-deployment1-898d6bdf6-d7tvn   1/1     Running     0          2m2s    10.244.0.19   node1.ljy.com     
secret-env-pod                      0/1     Completed   0          175m            master1.ljy.com   
web-nginx-dep2-66ccfd7fb7-z2x84     1/1     Running     2          9d      10.244.1.25   node2.ljy.com     
[root@master1 nfs]# curl  10.244.0.19
Hello NFS Volume test!!!

ConfigMap和Secret

configMap 资源提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器化应用。
StorageOS 在 Kubernetes 环境中以容?的形式运行,这使得应用能够从 Kubernetes 集群中的任何节点访问本地或关联的存储。 为应对节点失效状况,可以复制数据。 若需提高利用率和降低成本,可以考虑瘦配置(Thin Provisioning)和数据压缩。

kubernetes中常用的存储卷

标签:exp   erp   字段   调度   ready   shm   使用   ash   任务   

原文地址:https://blog.51cto.com/liujingyu/2532637


评论


亲,登录后才可以留言!