Skip to content

Configuraciones y persistencia de información con Secrets y Configmaps

Desarrollo del tema

Un ConfigMap es un objeto de la API utilizado para almacenar datos no confidenciales en el formato clave-valor. Los Pods pueden utilizar los configmap como variables de entorno, argumentos de la línea de comando o como ficheros de configuración de un volumen.

Laboratorio: Configuraciones y persistencia de información con Secrets y Configmaps

Descripción

Un ConfigMap es un objeto de la API utilizado para almacenar datos no confidenciales en el formato clave-valor. Los Pods pueden utilizar los configmap como variables de entorno, argumentos de la línea de comando o como ficheros de configuración de un volumen.

Objetivos

  • Crear un configmap de maneras distintas.
  • Crear un secret y conocer la diferencia frente a un configmap).

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio
  • Haber realizado la guía de Instalación Rancher Kubernetes Engine (RKE)

Inicio de laboratorio

ConfigMaps

  1. Ingrese a la línea de comandos desde la máquina con acceso al cluster.
  2. Cree un nuevo namespace con el siguiente comando.

    kubectl create namespace example-cm
    
    Se pueden crear ConfigMaps de varias maneras , se verán unas cuantos ejemplos a continuación.

  3. Establecer el nuevo namespace por defecto con el contexto actual

    kubectl config set-context --current --namespace=example-cm
    

  4. Cree un directorio llamado configmap en la carpeta configure-pod-container

    mkdir -p configure-pod-container/configmap/
    

  5. Descargue los archivos para prueba

    wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
    wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties
    

  6. Cree un configmap llamado game-config que contenga la carpeta configmap

    kubectl create configmap game-config --from-file=configure-pod-container/configmap/
    

  7. Obtenga los ConfigMaps del namespace

    kubectl get configmaps
    

  8. Obtenga información del ConfigMap creado

    kubectl describe configmap game-config
    

  9. Verifique la información del ConfigMap game-config en YAML

    kubectl get cm game-config -o yaml
    

  10. Cree otro ConfigMap llamado game-config-2 que contenga únicamente el contenido del archivo game.properties

    kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
    

  11. Consulte el configmap creado.

    kubectl get configmap game-config-2 -o yaml
    

  12. Cree otro ConfigMap llamado game-config-3 que contenga ambos archivos de propiedades de forma explícita

    kubectl create configmap game-config-3 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties
    

  13. Consulte el configmap creado.

    kubectl get configmap game-config-3 -o yaml
    

  14. Cree otro ConfigMap a partir de un valor key=value (literal), agregue el argumento --from-literal para declarar el valor directamente.

    kubectl create configmap special-config --from-literal=special.how=very
    

  15. Consulte el configmap creado.

    kubectl get configmap special-config -o yaml
    

  16. Cree un pod con el siguiente comando

    kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml
    

  17. Verifique los pods del namespace

    kubectl get pods
    

  18. Observe la entrada en el log del Pod

    kubectl logs dapi-test-pod
    
    UBERNETES_SERVICE_PORT=443
    KUBERNETES_PORT=tcp://10.43.0.1:443
    HOSTNAME=dapi-test-pod
    SHLVL=1
    HOME=/root
    KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    KUBERNETES_PORT_443_TCP_PORT=443
    KUBERNETES_PORT_443_TCP_PROTO=tcp
    SPECIAL_LEVEL_KEY=very
    KUBERNETES_SERVICE_PORT_HTTPS=443
    KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443
    PWD=/
    KUBERNETES_SERVICE_HOST=10.43.0.1
    

  19. Elimine el ConfigMap special-config

    kubectl delete cm special-config
    

  20. Actualice el ConfigMap special-config cambiando el valor del key special.how

    kubectl create cm special-config --from-literal=special.how=much
    

  21. Elimine el Pod dapi-test-pod

    kubectl delete pod dapi-test-pod
    

  22. Vuelva a crear el Pod

    kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml
    

  23. Observe la entrada en el log del Pod

    kubectl logs dapi-test-pod
    
    KUBERNETES_SERVICE_PORT=443
    KUBERNETES_PORT=tcp://10.43.0.1:443
    HOSTNAME=dapi-test-pod
    SHLVL=1
    HOME=/root
    KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    KUBERNETES_PORT_443_TCP_PORT=443
    KUBERNETES_PORT_443_TCP_PROTO=tcp
    SPECIAL_LEVEL_KEY=much
    KUBERNETES_SERVICE_PORT_HTTPS=443
    KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443
    PWD=/
    KUBERNETES_SERVICE_HOST=10.43.0.1
    

Secrets

Un secret en un objeto que contiene una cantidad pequeña de información sensible o confidencial como contraseñas o tokens, al usar un secret no hay necesidad de poner el valor en el código de la aplicación.

Hay varios tipos de secret para poder ser usados, se verán unos tipos a continuación.

  1. Para crear un secret de tipo opaque (generic), qué es el tipo por defecto se hace de la siguiente manera.

    kubectl create secret generic empty-secret --from-literal key=value
    

  2. Liste los secrets del namespace

    kubectl get secrets
    

  3. Obtenga información del Secret creado

    kubectl describe secret empty-secret
    

  4. Verifique su contenido en YAML

    kubectl get secret empty-secret -o yaml
    
    Uno de los secrets más usados es el de autenticación, para este se usan 2 campos base que son username y password , como se puede apreciar en el siguiente recuadro
    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-basic-auth
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: t0p-Secret
    
    La forma de uso de un secret es bastante parecida a la de un ConfigMap como en el ejemplo que se puede apreciar a continuación.
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: redis
        volumeMounts:
        - name: foo
          mountPath: "/etc/foo"
          readOnly: true
      volumes:
      - name: foo
        secret:
          secretName: mysecret