(8) almacenamiento persistente de datos K8S

1. Explicación del volumen

Descripción general:

El volumen es un concepto abstracto para almacenar datos de contenedores, que se pueden montar en uno o más contenedores en uno o más Pods. El volumen proporciona un método de almacenamiento persistente, de modo que los datos en el contenedor se pueden conservar cuando el contenedor se reinicia, reprograma o migra.

Kubernetes proporciona varios tipos de Volumen y puede elegir un método de almacenamiento adecuado según las diferentes necesidades. Los siguientes son algunos tipos de volumen comunes:

  • EmptyDir: cree un directorio vacío temporal durante el ciclo de vida del Pod, que se puede usar para compartir datos temporales entre contenedores.
  • HostPath: al usar la ruta del sistema de archivos en el nodo como almacenamiento, los datos se pueden compartir entre varios pods.
  • PersistentVolumeClaim (PVC): se usa junto con PersistentVolume para proporcionar almacenamiento persistente, compartir datos entre pods y admitir la persistencia de datos y la asignación dinámica.
  • ConfigMap: se utiliza para montar el archivo de configuración como un volumen en el contenedor, de modo que el contenedor pueda leer la información de configuración.
  • Secreto: se utiliza para montar datos confidenciales (como contraseñas, claves) en contenedores como volúmenes para transferir información confidencial de forma segura.

2. Uso de directorio vacío

Descripción general:

EmptyDir es un tipo de volumen de datos simple en Kubernetes que proporciona un directorio vacío temporal que se puede usar para compartir archivos dentro de un Pod. El volumen EmptyDir se crea cuando se programa un pod para un nodo y solo existe durante el ciclo de vida del pod. Cuando el pod se elimina o se reprograma, los datos que contiene también se borrarán.

Cómo crear y usar:

Aquí hay un archivo de configuración de ejemplo que usa EmptyDir, donde un volumen EmptyDir se monta en el contenedor de un 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

En el ejemplo anterior, creamos un Pod que contiene un contenedor my-container, usando la imagen nginx:latest. En el campo volumeMounts, montamos el Volumen llamado volumen de datos en la ruta /usr/share/nginx/html en el contenedor. En el campo de volúmenes, definimos el volumen de datos, usando el tipo Volumen de EmptyDir.

Después de esta configuración, cuando se inicie el pod, se creará un directorio vacío temporal para el contenedor como un volumen y se montará en la ruta especificada en el contenedor. Las aplicaciones en el contenedor pueden usar esta ruta para acceder y manipular datos en el Volumen.

3. uso de hostPath

Descripción general:

hostPath es un tipo de volumen común en Kubernetes que permite montar archivos o directorios en la máquina host directamente en contenedores en Pods. De esta forma, el contenedor puede acceder directamente al sistema de archivos en el host y compartir datos con el host.

Características:

  • Acceso directo al sistema de archivos del host: el tipo de volumen hostPath permite que los contenedores accedan directamente a archivos o directorios en el host sin pasar por la red u otro middleware.
  • Dependencias del host: es posible que los pods que usan el tipo de volumen hostPath no se puedan transferir entre diferentes hosts, ya que la estructura y el contenido del sistema de archivos pueden ser diferentes en cada host. Por lo tanto, es necesario asegurarse de que el Pod seleccione el host correcto cuando se implemente.
  • Consideraciones de seguridad: dado que los contenedores pueden acceder al sistema de archivos en el host, el uso del tipo de volumen hostPath requiere un manejo cuidadoso de los datos confidenciales para evitar el acceso no autorizado.

tipo:

  • Directorio La ruta del directorio dada debe existir
  • DirectoryOrCreate Si la ruta dada no existe, se creará allí un directorio vacío según sea necesario
  • Archivo El archivo correspondiente debe existir en la ruta dada
  • FileOrCreate Si la ruta dada no existe, se creará un archivo vacío allí según sea necesario

Cómo crear y usar:

Aquí hay un ejemplo usando volúmenes 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,如果路径不存在,则会创建它

En el ejemplo anterior, creamos un Pod con un contenedor nginx y un volumen hostPath. El volumen hostPath se monta en la ruta /data y la ruta /var/data en el host se especifica como fuente de datos. El tipo de volumen hostPath es DirectoryOrCreate, lo que significa que si la ruta no existe en el host, Kubernetes creará automáticamente el directorio.

Tenga en cuenta que el uso de volúmenes de hostPath requiere precaución, ya que accede directamente al sistema de archivos del host y puede provocar un acceso de archivo inconsistente en clústeres de varios nodos. Asegúrese de usar volúmenes de hostPath teniendo en cuenta la seguridad y la integridad de los datos, y utilícelos solo cuando sea necesario.

Resumen de comparación:

Comparación entre emptyDir y hostPath:

  • Ambos son volúmenes de almacenamiento local.
  • emptyDir es un espacio de almacenamiento temporal y no proporciona soporte de persistencia en absoluto;
  • Los datos de volumen de hostPath se conservan en el sistema de archivos del nodo. Incluso si se ha eliminado el pod, los datos en el volumen del volumen aún permanecen en el nodo.

4. Uso de ConfigMap (abreviatura cm)

Descripción general:

Un ConfigMap es un objeto de Kubernetes que se utiliza para almacenar datos de configuración en forma de pares clave-valor. Puede almacenar datos de cadena ordinarios, así como datos de configuración almacenados en forma de archivos. ConfigMap proporciona una forma de desacoplar los datos de configuración de las aplicaciones, de modo que las aplicaciones puedan hacer referencia y utilizar estos datos de configuración sin modificar el código.

usar:

ConfigMap se puede utilizar para almacenar varios tipos de datos de configuración, como variables de entorno, parámetros de línea de comandos, archivos de configuración, contraseñas, etc. Puede ser referenciado por aplicaciones en el contenedor e inyectado en la aplicación cuando se inicia el contenedor, lo que permite una configuración dinámica y flexibilidad.

Cómo crear y usar:

  1. Al crear un ConfigMap con el comando kubectl create configmap, los datos de configuración se pueden especificar mediante argumentos de la línea de comandos o un archivo YAML. Aquí hay un ejemplo usando argumentos de línea de comando:

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

    En este ejemplo, creamos un ConfigMap llamado my-configmap y agregamos dos pares clave-valor de datos de configuración.

  2. Escriba un archivo YAML que contenga una definición de ConfigMap para crear un ConfigMap. Aquí hay un ejemplo de YAML para crear un ConfigMap:

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

    En este ejemplo, creamos un ConfigMap llamado my-configmap y definimos dos pares clave-valor de datos de configuración.

  3. Use ConfigMaps en pods:

    Inyección de variables de entorno: puede usar el campo env en la definición del contenedor Pod para hacer referencia a los pares clave-valor del ConfigMap como variables de entorno. Los ejemplos son los siguientes:

    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
    

    En este ejemplo, hacemos referencia a la clave key1 en el ConfigMap en la definición del contenedor del Pod y la inyectamos en el contenedor como la variable de entorno KEY1.

  4. Montaje de volumen: Puede utilizar los campos volumes y volumeMounts para montar los datos de configuración de ConfigMap en el contenedor en forma de archivo. Los ejemplos son los siguientes:

    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
    

    En este ejemplo, creamos un volumen llamado config-volume y montamos los datos de configuración de ConfigMap my-configmap en el directorio /etc/config del contenedor.

  5. Actualizar ConfigMap:
    método de línea de comando: use kubectl edit configmap <configmap-name>el comando para editar ConfigMap y actualizar los datos de configuración del par clave-valor en él.
    Método de archivo YAML: edite el archivo YAML de ConfigMap y use kubectl apply -f <configmap-file.yaml>el comando para actualizar ConfigMap.
    Los datos de configuración actualizados se reflejarán automáticamente en los Pods usando este ConfigMap.

5. Uso secreto

Descripción general:

Secreto (clave) es un mecanismo en Kubernetes para almacenar y administrar datos confidenciales, como contraseñas de bases de datos, claves API, certificados TLS, etc. Los objetos secretos se pueden usar en pods, servicios u otros recursos, y se almacenan cifrados en el clúster de Kubernetes.

usar:

El propósito principal de Secret es proteger y administrar datos confidenciales para mantenerlos seguros en aplicaciones en contenedores. Se puede utilizar en los siguientes escenarios:

  • Almacenar y transmitir datos confidenciales como contraseñas, tokens, claves, etc.
  • Configure ajustes relacionados con la seguridad, como certificados TLS y claves privadas.
  • Acceda a sistemas y servicios externos, como bases de datos u otras API, dentro de aplicaciones en contenedores.

tipo:

Secret tiene los siguientes tipos comunes en Kubernetes:

  • Opaco: el tipo de secreto más utilizado, utilizado para almacenar datos comunes de pares clave-valor. Este tipo de secreto se puede utilizar para almacenar información confidencial, como nombres de usuario, contraseñas y claves de API.

  • Docker Registry: se utiliza para almacenar la información de autenticación necesaria para conectarse a Docker Registry, como el nombre de usuario, la contraseña, etc. Este tipo de secreto se puede usar para extraer imágenes Docker privadas.

  • TLS: se utiliza para almacenar certificados TLS/SSL y claves privadas para una comunicación HTTPS segura. Este tipo de Secret contiene dos campos, uno para almacenar el certificado y otro para almacenar la clave privada.

  • Cuenta de servicio: secreto creado y administrado automáticamente por Kubernetes para almacenar la información del token de la cuenta de servicio. Este tipo de Secreto se puede usar en Pods para autenticación y autorización con la API de Kubernetes.

Además de estos tipos comunes, también puede personalizar el tipo Secreto para satisfacer necesidades específicas, como almacenar archivos de configuración y claves de cifrado para aplicaciones específicas.

Crea y usa:

Hay muchas formas de crear un secreto, entre ellas:

1. Crear con argumentos de línea de comando:

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

Este método es adecuado para crear algunos secretos simples de par clave-valor.

2. Cree usando un archivo YAML:
cree un archivo YAML que contenga la configuración secreta y use kubectl apply -fel comando para aplicarlo al clúster. Un archivo YAML de muestra es el siguiente:

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

En el archivo YAML, debe especificar el nombre, el tipo y los datos del secreto. El valor de los datos debe estar codificado en Base64.

3. Crear usando un archivo:
use los datos en el archivo para crear un Secreto. Por ejemplo, cree un secreto que lea un certificado TLS y una clave privada de un archivo con el siguiente comando:

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

Después de crear un secreto, se puede hacer referencia a él en el archivo de configuración de un pod para acceder a los datos confidenciales que contiene. Hay dos métodos de uso principales:
1. Usar Secret en forma de variables de entorno:

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 中的键名,对应密码

Guarde el contenido anterior como un archivo pod.yaml y ejecute el siguiente comando para crear un Pod:

kubectl apply -f pod.yaml

2. Use Secreto en forma de Volumen:

# 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 的名称

Guarde el contenido anterior como un archivo pod.yaml y ejecute el siguiente comando para crear un Pod:

kubectl apply -f pod.yaml

Supongo que te gusta

Origin blog.csdn.net/csdn570566705/article/details/130897386
Recomendado
Clasificación