Secrets y configmaps

Kubernetes nos permite compartir información y configuraciones entre el cluster y los distintos recursos de kubernetes.

Secrets

Los secretos en kubernetes son una forma de almacenar información sensible. Estos se almacenan en una base de datos de forma privada y pueden consumir por otros recursos de kubernetes.

Podemos obtener, crear o eliminar secretos en kubernetes con los siguientes comandos.

Listar secretos:

kubectl get secrets

Crear secretos:

# Create a new secret named my-secret with keys for each file in folder bar
kubectl create secret generic my-secret --from-file=path/to/bar

# Create a new secret named my-secret with specified keys instead of names on disk
kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub

# Create a new secret named my-secret with key1=supersecret and key2=topsecret
kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret

# Create a new secret named my-secret using a combination of a file and a literal
kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret

# Create a new secret named my-secret from an env file
kubectl create secret generic my-secret --from-env-file=path/to/bar.env

Borrar un secreto:

kubectl delete secret <nombre>

Usando secretos en un pod

Un secreto se puede usar en un pod. Podríamos pasarlo como una variable de entorno como en el siguiente ejemplo:

...
spec:
    containers:
    - image: mysql:5.5
      name: dbpod
      env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
            secretKeyRef:
              name: mysql
              key: password 

También podríamos montarlo como un volumen en su manifest. Este Requeriría el path donde estamos montando un fichero con el contenido del secreto. Mounting Secrets as Volumes You can also mount secrets as files using a volume definition in a pod manifest. The mount path will contain a file whose name will be the key of the secret created with the kubectl create secret step earlier.

...
spec:
    containers:
    - image: busybox
      command:
        - sleep
        - "3600"
      volumeMounts:
      - mountPath: /mysqlsecret
        name: mysqlsecret
      name: busy
    volumes:
    - name: mysqlsecret
        secret:
            secretName: mmysql

Crea un configmap

Dado el caracter efímero de un pod en kubernetes necesitamos algún método para compartir ficheros o información entre los contenedores dentro de un pod.

Crear un configmap con comandos

Para crear un config map usamos el siguiente comando:

 kubectl create configmap <nombre> \
 --from-literal=text=<texto> \
 --from-file=<fichero> \
 --from-file=<directorio>

Este nos permite importar información ya sea text en plano que introduzcamos en el comando (--from-literal=text=), el contenido de un fichero (--from-file=) o el contenido de un directorio completo (--from-file=).

Podemos consultar el contenido de un configmap con el siguiente comando:

kubectl get configmap <nombre>

Aunque este solo nos mostrará el total de datos y su edad. Podemos obtener el contenido completo especificando la salida en formato yaml:

kubectl get configmap <nombre> -o yaml

Crear un configmap con yaml

Podríamos declararlo como un yaml para facilitar el almacenamiento de la configuración como código.

apiVersion: v1
kind: ConfigMap
metadata:
  name: cars
  namespace: default
data:
  car.make: Opel 
  car.model: Astra 
  car.trim: OPC

Para guardar el configmap en el cluster podemos usar el comando:

kubectl create -f <configmap>.yaml

Usar configmap en un pod

Utilizar en el entorno de un pod

Podemos configurar el contenido de un configmap en un pod como variable de entorno así:

apiVersion: v1
kind: Pod
metadata:
  name: demo 
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: <nombre de la variable de entorno> 
      valueFrom:
        configMapKeyRef:
          name: <nombre_configmap> 
          key: <clave a usar> 

Esto nos permitiría importar una única clave del configmap.

También podríamos importar todo el contenido del configmap así:

apiVersion: v1
kind: Pod
metadata:
  name: demo 
spec:
  containers:
  - name: nginx
    image: nginx
    envFrom:
    - configMapRef:
      name: <nombre_configmap> 

Cambiaríamos el configMapKeyRef por configMapRef y env por envFrom. Por último, borraríamos key y valueFrom datos que ya no tendríamos que especificar.

Montar como volumen en un pod

Podemos montar un configmap como un volumen en un pod. Esta sería una configuración de ejemplO:

apiVersion: v1
kind: Pod
metadata:
  name: shell-demo
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: car-vol
      mountPath: /etc/cars
  volumes:
    - name: car-vol
      configMap:
        name: cars

Borrar un configmap

Podemos elimitar este objeto de kubernetes con el comando:

kubectl delete

Última modificación June 26, 2022: Secrets y configmaps en kubernetes (70e91b6)