• (八)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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在上面的示例中,我们创建了一个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,如果路径不存在,则会创建它
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们创建了一个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
      
      • 1

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

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

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: my-configmap
      data:
        key1: value1
        key2: value2
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      在这个示例中,我们创建了一个名为 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      在这个示例中,我们在 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

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

    5. 更新 ConfigMap:
      命令行方式:使用 kubectl edit configmap 命令来编辑 ConfigMap,并更新其中的键值对配置数据。
      YAML 文件方式:编辑 ConfigMap 的 YAML 文件,并使用 kubectl apply -f 命令来更新 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 -type> -name> --from-literal=key1=value1 --from-literal=key2=value2
    
    • 1

    这种方式适用于创建一些简单的键值对类型的 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

    在创建 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 中的键名,对应密码
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

    kubectl apply -f pod.yaml
    
    • 1

    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 的名称
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    kubectl apply -f pod.yaml
    
    • 1
  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: cctype: ispunct
    vue上传文件到阿里云oss方法 结合element-ui 中的 el-upload
    同步云盘:理解云端数据的实时同步技术
    记一次ThreadLocal引发的线上故障
    Android学习笔记 26. Fragment生命周期
    np.nan, np.isnan, None, pd.isnull, pd.isna 整理与小结
    如何在 Java 中实现无向图
    HT5010 音频转换器工作原理
    Ubuntu2204部署容器引擎Containerd
    算法70-解析算式并返回结果
  • 原文地址:https://blog.csdn.net/csdn570566705/article/details/130897386