(八)K8S数据持久化存储

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-container
    image: nginx:latest
    volumeMounts:                            # 定义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: nginx
      image: nginx:1.19.10
      volumeMounts:
        - name: hostpath-volume
          mountPath: /data  # 将主机上的目录挂载到容器的/data路径下
  volumes:
    - name: hostpath-volume
      hostPath:
        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: value1
      key2: value2
    

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

  3. 在 Pod 中使用 ConfigMap:

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
        - name: my-container
          image: my-image
          env:
            - name: KEY1
              valueFrom:
                configMapKeyRef:
                  name: my-configmap
                  key: key1
    

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

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
        - name: my-container
          image: my-image
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
        volumes:
          - name: config-volume
            configMap:
              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 编码的用户名 admin
  password: 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-container
      image: 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.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod  # Pod 的名称
spec:
  containers:
    - name: my-container
      image: 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

猜你喜欢

转载自blog.csdn.net/csdn570566705/article/details/130897386