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
- Ingrese a la línea de comandos desde la máquina con acceso al cluster.
-
Cree un nuevo namespace con el siguiente comando.
Se pueden crear ConfigMaps de varias maneras , se verán unas cuantos ejemplos a continuación.kubectl create namespace example-cm -
Establecer el nuevo namespace por defecto con el contexto actual
kubectl config set-context --current --namespace=example-cm -
Cree un directorio llamado
configmapen la carpetaconfigure-pod-containermkdir -p configure-pod-container/configmap/ -
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 -
Cree un configmap llamado
game-configque contenga la carpeta configmapkubectl create configmap game-config --from-file=configure-pod-container/configmap/ -
Obtenga los ConfigMaps del namespace
kubectl get configmaps -
Obtenga información del ConfigMap creado
kubectl describe configmap game-config -
Verifique la información del ConfigMap
game-configen YAMLkubectl get cm game-config -o yaml -
Cree otro ConfigMap llamado
game-config-2que contenga únicamente el contenido del archivogame.propertieskubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties -
Consulte el configmap creado.
kubectl get configmap game-config-2 -o yaml -
Cree otro ConfigMap llamado
game-config-3que contenga ambos archivos de propiedades de forma explícitakubectl create configmap game-config-3 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties -
Consulte el configmap creado.
kubectl get configmap game-config-3 -o yaml -
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 -
Consulte el configmap creado.
kubectl get configmap special-config -o yaml -
Cree un pod con el siguiente comando
kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml -
Verifique los pods del namespace
kubectl get pods -
Observe la entrada en el log del Pod
kubectl logs dapi-test-podUBERNETES_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 -
Elimine el ConfigMap
special-configkubectl delete cm special-config -
Actualice el ConfigMap
special-configcambiando el valor del keyspecial.howkubectl create cm special-config --from-literal=special.how=much -
Elimine el Pod
dapi-test-podkubectl delete pod dapi-test-pod -
Vuelva a crear el Pod
kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml -
Observe la entrada en el log del Pod
kubectl logs dapi-test-podKUBERNETES_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.
-
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 -
Liste los secrets del namespace
kubectl get secrets -
Obtenga información del Secret creado
kubectl describe secret empty-secret -
Verifique su contenido en 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 recuadrokubectl get secret empty-secret -o yamlLa 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: Secret metadata: name: secret-basic-auth type: kubernetes.io/basic-auth stringData: username: admin password: t0p-SecretapiVersion: 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