K8s-06: Storage

Storage

ConfigMap

ConfigMap 用于存储配置信息,如数据库连接信息、redis 连接信息、环境变量等。ConfigMap 可以通过 volume 挂载到 pod 中,也可以通过环境变量的方式注入到 pod 中。

  • from file: 将文件内容转换为 ConfigMap。
kuberctl create configmap <configmap_name> --from-file=<file_path>
  • from yaml: 将 yaml 文件转换为 ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
    name: <configmap_name>
data:
    <key>: <value>
  • from literal: 将 key-value 转换为 ConfigMap。
kuberctl create configmap <configmap_name> --from-literal=<key>=<value>

Secret

解决 ConfigMap 中敏感信息的问题。Secret 也可以通过 volume 挂载到 pod 中,或使用环境变量的方式注入到 pod 中。

  • service account: 用于 pod 访问 kubernetes api 的 token。由 kubernetes 自动创建,不需要手动创建。
  • opaque: 用于存储用户名、密码等敏感信息。
  • docker-registry: 用于存储 docker registry 的认证信息。

Volume

容器磁盘上的文件生命周期是短暂的,当容器崩溃,或者容器被重新调度时,容器会以干净的状态启动。且多个容器之间无法共享文件。Volume 解决了这些问题。Volume 的生命周期和 pod 的生命周期一致,kubernetes 支持多种类型的 Volume,且 Pod 可以使用任意数量的 Volume。

emptyDir

  • 空目录,pod 被调度到 node 上时,会在 node 上创建一个空目录,pod 被删除时,会删除这个目录。如果 pod 被重新调度到其他 node 上,会重新创建这个目录。如果 pod 中的容器重启,不会删除这个目录。如果 pod 中的容器被删除,会删除这个目录。如果 pod 中的容器被重新创建,会重新创建这个目录。

  • 作用:

    • 暂存空间,如编译环境、构建环境、临时文件等。
    • 用作长时间计算崩溃恢复的检查点
    • 保存内容管理器提取的文件
  • 举例:

    apiVersion: v1
    kind: Pod
    metadata:
        name: nginx
    spec:
        containers:
        - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html
            mountPath: /usr/share/nginx/html
        - name: log
            mountPath: /var/log/nginx
        volumes:
        - name: html
            emptyDir: {}
        - name: log
            emptyDir: {}

hostPath

  • 将 node 节点上的文件或目录挂载到 pod 中。pod 被调度到 node 上时,会在 node 上创建一个目录,pod 被删除时,会删除这个目录。如果 pod 被重新调度到其他 node 上,不会重新创建这个目录。如果 pod 中的容器重启,不会删除这个目录。

  • 作用:

    • 需要访问 Docker 内部的文件,如/var/lib/docker/containers。
    • 在容器中运行 cAdvisor,监控 node 节点的资源使用情况。
  • 可以指定 type

    • DirectoryOrCreate: 如果目录不存在,则创建目录。
    • Directory: 如果目录不存在,则报错。
    • FileOrCreate: 如果文件不存在,则创建文件。
    • File: 如果文件不存在,则报错。
    • Socket: 如果 socket 不存在,则报错。
    • CharDevice: 如果字符设备不存在,则报错。
    • BlockDevice: 如果块设备不存在,则报错。
  • 举例:

    apiVersion: v1
    kind: Pod
    metadata:
        name: nginx
    spec:
        containers:
        - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html
            mountPath: /usr/share/nginx/html
        - name: log
            mountPath: /var/log/nginx
        volumes:
        - name: html
            hostPath:
            path: /usr/share/nginx/html
            type: DirectoryOrCreate
        - name: log
            hostPath:
            path: /var/log/nginx
            type: DirectoryOrCreate

PersistentVolume

  • PV: 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。

  • PVC(PersistentVolumeClaim): 是用户定义的存储,它与 Pod 类似。Pod 消耗节点资源,而 PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。声明可以请求特定大小和访问模式的存储。

  • 访问模式

    • ReadWriteOnce: 读写模式,可以被单个节点挂载为读写模式。
    • ReadOnlyMany: 只读模式,可以被多个节点挂载为只读模式。
    • ReadWriteMany: 读写模式,可以被多个节点挂载为读写模式。
  • 回收策略

    • Retain: 保留,不删除 PV。
    • Recycle: 回收,删除 PV 中的数据,然后重新挂载。
    • Delete: 删除,删除 PV。
  • 状态

    • Available: 可用状态,PV 已经被集群接受,但是还没有被绑定到 PVC 上。
    • Bound: 绑定状态,PV 已经被绑定到 PVC 上。
    • Released: 已释放状态,PVC 被删除,但是 PV 还没有被回收。
    • Failed: 失败状态,PV 绑定到 PVC 上失败。
  • statefulset 和 PVC

    • statefulset 创建 pod 时,会自动创建 PVC。
    • statefulset 删除 pod 时,不会删除 PVC。
    • statefulset 删除时,会删除 PVC。
    • 手动删除 PVC 时,会自动释放 PV。