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。