(八)K8S数据持久化存储

news/2025/1/31 3:27:12/

1.Volume讲解

概述:

Volume是用于存储容器数据的抽象概念,它可以被挂载到一个或多个Pod中的一个或多个容器中。Volume提供了一种持久性的存储方式,使得容器中的数据可以在容器重启、重新调度或迁移时得以保留。

Kubernetes提供了多种类型的Volume,可以根据不同的需求选择适合的存储方式。以下是一些常见的Volume类型:

  • EmptyDir: 在Pod的生命周期内创建一个临时的空目录,可用于容器之间共享临时数据。
  • HostPath: 使用Node上的文件系统路径作为存储,可以在多个Pod之间共享数据。
  • PersistentVolumeClaim (PVC): 与持久卷 (PersistentVolume) 配合使用,提供持久性的存储,可以在Pod之间共享数据,并支持数据的持久化和动态分配。
  • ConfigMap: 用于将配置文件作为Volume挂载到容器中,使得容器可以读取配置信息。
  • Secret: 用于将敏感数据(如密码、密钥)作为Volume挂载到容器中,以安全地传递机密信息。

2.EmptyDir使用

概述:

EmptyDir是Kubernetes中一种简单的数据卷类型,它提供了一个临时的空目录,可以用于在Pod内部共享文件。EmptyDir卷在Pod被调度到节点上时创建,并且只在Pod的生命周期内存在,当Pod被删除或重新调度时,其中的数据也会被清除。

创建和使用方式:

以下是使用EmptyDir的示例配置文件,其中将EmptyDir卷挂载到Pod的容器中:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginx:latestvolumeMounts:                            # 定义Volume挂载配置- name: data-volume                      # 指定Volume的名称mountPath: /usr/share/nginx/html       # 将Volume挂载到容器中的路径volumes:                                  # 定义Volume配置- name: data-volume                        # 指定Volume的名称emptyDir: {}                             # 使用EmptyDir类型的Volume

在上面的示例中,我们创建了一个Pod,其中包含一个容器my-container,使用了nginx:latest镜像。在volumeMounts字段中,我们将名为data-volume的Volume挂载到容器中的/usr/share/nginx/html路径上。而在volumes字段中,我们定义了data-volume,使用的是EmptyDir类型的Volume。

这样配置后,Pod启动时会为该容器创建一个临时的空目录作为Volume,并将其挂载到容器中的指定路径上。容器中的应用程序可以使用该路径访问和操作Volume中的数据。

3.hostPath使用

概述:

hostPath是Kubernetes中一种常见的卷类型,它允许将主机上的文件或目录直接挂载到Pod中的容器中。这样,容器可以直接访问主机上的文件系统,并与主机共享数据。

特点:

  • 直接访问主机文件系统:hostPath卷类型允许容器直接访问主机上的文件或目录,而无需通过网络或其他中间件。
  • 主机依赖性:使用hostPath卷类型的Pod在不同主机之间可能不可移植,因为每个主机上的文件系统结构和内容可能会有所不同。因此,需要确保Pod在部署时选择正确的主机。
  • 安全性考虑:由于容器可以访问主机上的文件系统,使用hostPath卷类型需要谨慎处理敏感数据,以防止未经授权的访问。

类型:

  • Directory 给定的目录路径必须存在
  • DirectoryOrCreate 如果给定路径不存在,将根据需要在那里创建一个空目录
  • File 给定路径上必须存在对应文件
  • FileOrCreate 如果给定路径不存在,将根据需要在那里创建一个空文件

创建和使用方式:

下面是一个使用hostPath卷的示例:

apiVersion: v1
kind: Pod
metadata:name: hostpath-example
spec:containers:- name: nginximage: nginx:1.19.10volumeMounts:- name: hostpath-volumemountPath: /data  # 将主机上的目录挂载到容器的/data路径下volumes:- name: hostpath-volumehostPath:path: /var/data  # 指定主机上的路径,该路径可以是已存在的目录或将在挂载时创建的目录type: DirectoryOrCreate  # hostPath卷的类型为DirectoryOrCreate,如果路径不存在,则会创建它

在上述示例中,我们创建了一个Pod,其中包含一个nginx容器和一个hostPath卷。hostPath卷被挂载到/data路径下,指定了主机上的/var/data路径作为数据源。hostPath卷的类型为DirectoryOrCreate,这意味着如果主机上的路径不存在,Kubernetes将会自动创建该目录。

请注意,使用hostPath卷需要谨慎操作,因为它直接访问主机的文件系统,并且在多节点集群中可能会导致文件访问不一致的问题。确保在使用hostPath卷时考虑到安全性和数据一致性的问题,并仅在必要的情况下使用它。

对比总结:

emptyDir和hostPath对比:

  • 都是本地存储卷方式
  • emptyDir是临时存储空间,完全不提供持久化支持;
  • hostPath的卷数据是持久化在node节点的文件系统中的,即便pod已经被删除了,volume卷中的数据还留存在node节点上

4.ConfigMap使用(缩写cm)

概述:

ConfigMap 是一个用于存储键值对形式配置数据的 Kubernetes 对象。它可以存储普通的字符串数据,也可以存储以文件形式存储的配置数据。ConfigMap 提供了一种将配置数据与应用程序解耦的方式,使得应用程序可以在不修改代码的情况下引用和使用这些配置数据。

用途:

ConfigMap 可以用于存储各种类型的配置数据,例如环境变量、命令行参数、配置文件、密码等。它可以被容器中的应用程序引用,并在容器启动时注入到应用程序中,从而实现动态配置和灵活性。

创建和使用方式:

  1. 使用 kubectl create configmap 命令创建 ConfigMap 时,可以通过命令行参数或 YAML 文件指定配置数据。以下是使用命令行参数的示例:

    kubectl create configmap my-configmap --from-literal=key1=value1 --from-literal=key2=value2
    

    在这个示例中,我们创建了一个名为 my-configmap 的 ConfigMap,并添加了两个键值对的配置数据。

  2. 编写包含 ConfigMap 定义的 YAML 文件来创建 ConfigMap。下面是一个创建 ConfigMap 的 YAML 示例:

    apiVersion: v1
    kind: ConfigMap
    metadata:name: my-configmap
    data:key1: value1key2: value2
    

    在这个示例中,我们创建了一个名为 my-configmap 的 ConfigMap,并定义了两个键值对的配置数据。

  3. 在 Pod 中使用 ConfigMap:

    环境变量注入:可以在 Pod 的容器定义中使用 env 字段来引用 ConfigMap 的键值对作为环境变量。示例如下:

    apiVersion: v1
    kind: Pod
    metadata:name: my-pod
    spec:containers:- name: my-containerimage: my-imageenv:- name: KEY1valueFrom:configMapKeyRef:name: my-configmapkey: key1
    

    在这个示例中,我们在 Pod 的容器定义中引用了 ConfigMap 中的 key1 键,并将其作为环境变量 KEY1 注入到容器中。

  4. 卷挂载:可以使用 volumes 和 volumeMounts 字段来将 ConfigMap 的配置数据以文件形式挂载到容器中。示例如下:

    apiVersion: v1
    kind: Pod
    metadata:name: my-pod
    spec:containers:- name: my-containerimage: my-imagevolumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: my-configmap
    

    在这个示例中,我们创建了一个名为 config-volume 的卷,并将 ConfigMap my-configmap 的配置数据挂载到容器的 /etc/config 目录下。

  5. 更新 ConfigMap:
    命令行方式:使用 kubectl edit configmap <configmap-name> 命令来编辑 ConfigMap,并更新其中的键值对配置数据。
    YAML 文件方式:编辑 ConfigMap 的 YAML 文件,并使用 kubectl apply -f <configmap-file.yaml> 命令来更新 ConfigMap。
    更新后的配置数据将自动反映到使用该 ConfigMap 的 Pod 中。

5.Secre使用

概述:

Secret(密钥)是 Kubernetes 中用于存储和管理敏感数据的机制,如数据库密码、API 密钥、TLS 证书等。Secret 对象可以在 Pod、Service 或其他资源中使用,并且以加密方式存储在 Kubernetes 集群中。

用途:

Secret 的主要用途是保护和管理敏感数据,以确保其在容器化应用程序中的安全性。它可以用于以下场景:

  • 存储和传递敏感数据,如密码、令牌、密钥等。
  • 配置安全相关的设置,如 TLS 证书和私钥。
  • 在容器化应用程序中访问外部系统和服务,如数据库或其他 API。

类型:

Secret 在 Kubernetes 中有以下几种常见的类型:

  • Opaque:最常用的 Secret 类型,用于存储普通的键值对数据。这种类型的 Secret 可以用于存储用户名、密码、API 密钥等敏感信息。

  • Docker Registry:用于存储连接到 Docker Registry 所需的认证信息,如用户名、密码等。这种类型的 Secret 可以用于拉取私有的 Docker 镜像。

  • TLS:用于存储 TLS/SSL 证书和私钥,用于安全的 HTTPS 通信。这种类型的 Secret 包含两个字段,一个用于存储证书,另一个用于存储私钥。

  • Service Account:由 Kubernetes 自动创建和管理的 Secret,用于存储 Service Account 的令牌信息。这种类型的 Secret 可以在 Pod 中使用,以便与 Kubernetes API 进行身份验证和授权。

除了这些常见的类型之外,还可以通过自定义 Secret 类型来满足特定的需求,例如存储特定应用程序的配置文件、加密密钥等。

创建和使用:

有多种方式可以创建 Secret,包括:

1.使用命令行参数创建:

kubectl create secret <secret-type> <secret-name> --from-literal=key1=value1 --from-literal=key2=value2

这种方式适用于创建一些简单的键值对类型的 Secret。

2.使用 YAML 文件创建:
创建一个包含 Secret 配置的 YAML 文件,并使用 kubectl apply -f 命令将其应用到集群中。示例 YAML 文件如下:

apiVersion: v1
kind: Secret
metadata:name: my-secret  # Secret 的名称
type: Opaque  # Secret 的类型,这里设置为 Opaque
data:username: YWRtaW4=  # Base64 编码的用户名 adminpassword: cGFzc3dvcmQ=  # Base64 编码的密码 password

在 YAML 文件中,您需要指定 Secret 的名称、类型和数据。数据的值应该是经过 Base64 编码的。

3.使用文件创建:
使用文件中的数据创建 Secret。例如,通过以下命令创建一个从文件中读取 TLS 证书和私钥的 Secret:

kubectl create secret tls <secret-name> --cert=path/to/certificate.crt --key=path/to/private.key

在创建 Secret 后,可以在 Pod 的配置文件中引用它,以访问其中的敏感数据。有两种主要的使用方式:
1.以环境变量的形式使用 Secret:

apiVersion: v1
kind: Pod
metadata:name: my-pod  # Pod 的名称
spec:containers:- name: my-containerimage: nginx  # 使用的容器镜像env:- name: USERNAME  # 环境变量名称valueFrom:secretKeyRef:name: my-secret  # 使用的 Secret 的名称key: username  # Secret 中的键名,对应用户名- name: PASSWORD  # 环境变量名称valueFrom:secretKeyRef:name: my-secret  # 使用的 Secret 的名称key: password  # Secret 中的键名,对应密码

将上述内容保存为 pod.yaml 文件,并执行以下命令创建 Pod:

kubectl apply -f pod.yaml

2.以 Volume 的形式使用 Secret:

# pod.yamlapiVersion: v1
kind: Pod
metadata:name: my-pod  # Pod 的名称
spec:containers:- name: my-containerimage: nginx  # 使用的容器镜像volumeMounts:- name: secret-volume  # Volume 的名称mountPath: /app/secrets  # 挂载路径volumes:- name: secret-volume  # Volume 的名称secret:secretName: my-secret  # 使用的 Secret 的名称

将上述内容保存为 pod.yaml 文件,并执行以下命令创建 Pod:

kubectl apply -f pod.yaml

http://www.ppmy.cn/news/94994.html

相关文章

P1249 乘积最大

最大乘积 题目描述 一个正整数一般可以分为几个互不相同的自然数的和&#xff0c;如 3 1 2 312 312&#xff0c; 4 1 3 413 413&#xff0c; 5 &#xff1d; 1 4 2 3 5&#xff1d;1423 5&#xff1d;1423&#xff0c; 6 1 5 &#xff1d; 2 4 615&#xff1d;24 …

Altium Designer 相同电路多组复制布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线。我们可以画好其中一部分&#xff0c;然后直接复制&#xff0c;就可以提高效率。下面记录我自己的实际操作过程&#xff0c;有一些地方遇到了问题&#…

首发Yolov8涨点神器:华为诺亚2023极简的神经网络模型 VanillaNet---VanillaBlock助力检测,实现暴力涨点

强烈推荐:博主多个数据集亲测有效,实现暴力涨点,可快速迁移到论文创新性十足,刚新鲜出炉的论文,华为诺亚共同提出!!! 1.VanillaNet 论文:https://arxiv.org/pdf/2305.12972.pdf 来自华为诺亚、悉尼大学的研究者们提出了一种极简的神经网络模型 VanillaNet,以极简主义…

最小二乘估计心得

基本思想 存在一组观察值 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;其中 y i y_i yi​和 x i x_i xi​之间满足一定的线性关系&#xff0c;如 y a 0 f 0 ( x ) a 1 f 1 ( x ) . . . a m − 1 f m − 1 ( x ) y a_0 f_0(x) a_1 f_1(x) ... a_{m-1} f_{m-1}(x…

线段树C++详细讲解和个人见解

问题引入 假设有这样的问题&#xff1a;有n个数&#xff0c;m次操作&#xff0c;操作分为&#xff1a;修改某一个数或者查询一段区间的值 数据范围是&#xff08;1 < n, m<1e9)。 这种题大家一看就知道打暴力&#xff0c;但是一看数据范围就知道只能得部分。 我们之前…

GO 语言核心编程-全文版

第 1 章 1.1Golang的学习方向 Go语言&#xff0c;我们可以简单的写成Golang. Golang开山篇 1.2Golang的应用领域 1.2.1区块链的应用开发 1.2.2后台的服务应用 1.2.3云计算/云服务后台应用 1.3学习方法的介绍 1.4讲课的方式的说明 努力做到通俗易懂注重Go语言体系&#xff…

Dubbo源码解析一服务暴露与发现

Dubbo 服务暴露与发现 1. Spring中自定义Schema1.1 案例使用1.2 dubbo中的相关对象 2. 服务暴露机制2.1 术语解释2.2 流程机制2.3 源码分析2.3.1 导出入口2.3.2 导出服务到本地2.3.3 导出服务到远程(重点)2.3.4 开启Netty服务2.3.5 服务注册2.3.6 总结 3. 服务发现3.1 服务发现…

canal server 标准化集群搭建(一)

1.背景 随这业务增加&#xff0c;数据同步服务 canal server 需求与日俱增&#xff0c;以往私搭乱建的 canal server 不符合运维标准化。 2.目的 规范 canal server 的部署&#xff0c;形成固定操作流程及文档 3. 环境版本 canal server&#xff1a; canal.deployer-1.1.…