zoukankan      html  css  js  c++  java
  • K8S实战(十五)| 存储卷概念

    前言

    容器中的文件在磁盘上是临时存放,容器崩溃重启后,容器将被以干净状态重建,崩溃之前创建的文件将被清除。

    K8S 使用卷的概念来管理容器生成的需持久化的文件,卷也可用于同一个 Pod 中多个容器之间共享文件。

    更新历史

    Volume 的类型

    emptyDir 卷

    1. 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
    2. 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。

    示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: nginx
        name: test-container
        volumeMounts:
        - mountPath: /cache
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}
    

    persistentVolumeClaim 卷

    persistentVolumeClaim 卷用来将持久卷(PersistentVolume)挂载到 Pod 中。
    持久卷(PV)是用户在不知道特定云环境细节的情况下"申领"持久存储(例如 NFS 或者 iSCSI 卷)的一种方法。

    cephfs 卷

    1. cephfs 允许您将现存的 CephFS 卷挂载到 Pod 中。
    2. cephfs 卷的内容在删除 Pod 时会被保留,卷只是被卸载掉了。
    3. 这意味着 CephFS 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。
    4. CephFS 卷可同时被多个写者挂载。

    configMap 卷

    1. ConfigMap 资源提供了向 Pod 注入配置数据的方法。
    2. ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器。
    3. 可以在 volumes 字段中引用 configMap 名称来生成一个卷。
    4. 可以自定义 ConfigMap 中特定条目所要使用的路径。
    5. 如果容器以 subPath 卷挂载方式使用 ConfigMap 时,将无法接收 ConfigMap 的更新。

    示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: configmap-pod
    spec:
      containers:
        - name: test
          image: busybox
          volumeMounts:
            - name: config-vol
              mountPath: /etc/config
      volumes:
        - name: config-vol
          configMap:
            name: log-config
            items:
              - key: log_level
                path: log_level
    

    ConfigMap 中 key log_level 中的内容将被挂载到 Pod 路径 /etc/config/log_level 中

    路径由 spec.containers 中参数 volumeMounts.mountpath 和 volumes 中参数 items.path 拼接而成

    secret 卷

    secret 卷用来给 Pod 传递敏感信息,例如密码。

    可以将 secret 存储在 Kubernetes API 服务器上,然后以文件的形式挂在到 Pod 中,实现与 Pod 解耦。

    secret 卷由 tmpfs(基于内存的文件系统)提供存储,因此它们永远不会被写入持久化的存储器。

    容器以 subPath 卷的方式挂载 Secret 时,它将无法实时获取 Secret 的更新。

    nfs 卷

    nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。

    不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。

    这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。

    hostPath 卷

    hostPath 卷能将主机节点文件系统上的文件或目录挂载到 Pod 中。

    当 Pod 漂移到其他节点后,数据无法复用,仅适用于开发和测试环境。

    使用 subPath

    引用卷的时候,默认会将卷的根目录挂载到指定路径中。

    可以通过 subPath 挂载卷的子目录,而不是根目录。

    示例

    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
        volumes:
        - name: site-data
          persistentVolumeClaim:
            claimName: my-lamp-site-data
    

    将挂载 site-data 卷的子目录 mysql 到容器目录 /var/lib/mysql 中

    资源限制

    emptyDir、hostPath 卷可以消耗的磁盘资源不受限制,就是说可能会写满磁盘。

    结束语

    卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。

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

    容器中的进程能看到由它们的 Docker 镜像和卷组成的文件系统视图。

    Docker 镜像位于文件系统层次结构的根部,并且任何 Volume 都挂载在镜像内的指定路径上。

    卷不能挂载到其他卷,也不能与其他卷有硬链接。

    联系我

    微信公众号:zuolinux_com

    微信扫码关注

  • 相关阅读:
    [leetcode]Remove Nth Node From End of List @ Python
    [leetcode]Swap Nodes in Pairs @ Python
    [leetcode]Linked List Cycle II @ Python
    [leetcode]Linked List Cycle @ Python
    [leetcode]LRU Cache @ Python
    [leetcode]Reorder List @ Python
    [leetcode]Insertion Sort List @ Python
    [leetcode]Sort List @ Python
    [leetcode]3Sum Closest @ Python
    [elk]elasticsearch实现冷热数据分离
  • 原文地址:https://www.cnblogs.com/zuolinux/p/13693788.html
Copyright © 2011-2022 走看看