Config maps from files (K8S)

Creando config maps desde archivos y poniéndolos como volumenes en tu servicio.

Esto es muy util ya que muchas veces tenemos en un contenedor con nuestra aplicación y al iniciar el contenedor necesitamos que ejecute un script.

por ejemplo en este post, creamos una imagen para nuestros servicios de node.js y ejecutamos un script por commando al crear el contenedor.

Imaginemos que este script necesita algunas instrucciones adicionales, ufff esto nos obligaría a crear nuevamente la imagen con estas nuevas instrucciones, pero qué pasaría si, en lugar de modificar la imagen base cada vez que necesitamos añadir instrucciones usamos un configmap en kubernetes que nos ayude a separar ese script en algo así como un volumen persistente y que no sea volátil cada que se crea el pot, por supuesto sería una muy buena opción.

Entonces vamos a partir de este docker file que como se muestra usa un script que pone a correr nuestro servicio en vue y es expuesto por nginx.

el code lo puedes encontrar acá https://github.com/xRegner/vue-base-image

# etapa de producción de nuestro contenedor
FROM nginx:1.13.12-alpine as production-stage
# this is a default version only if you are versioning your apps
ENV MYAPP_VERSION_VUE=1.2.3  
# you going to need this ca-certificates to allow alpine use wget to download a package from an external package manager 
RUN   apk update \
  &&   apk add ca-certificates wget \
  &&   update-ca-certificates  
RUN mkdir -p package/dist/
# we copy our script to be executed once the container runs
COPY script-vue.sh ./
#comment this line if you want to use a repo or package manager
COPY ./dist  ./package/dist/ 
EXPOSE 80
CMD [ "sh" , "script-vue.sh"]

Podemos observar en el docker file que se hace un COPY script-vue.sh ./ básicamente es el script que vamos a poner como configmap, una vez que ya tenemos creada nuestra imagen lista para ser orquestada en un k8s

Creamos un namespace donde van a vivir nuestros servicios:

kubectl create namespace configmapns
kubectl create configmap startup-script --from-file=script-vue.sh -n configmapns

Esto debe crear un configmap que se llama startup-script el cual contiene un archivo que se llama script-vue.sh, es importante que el nombre del archivo sea igual al que vamos a mapear dentro del contenedor.

En esta imagen de lado derecho podemos ver el configmap y como fue importado al k8s.

looks like:

apiVersion: v1
data:
  script-vue.sh: "#!/bin/bash\n# uncomment the lines bellow if you have your packages
    ready to be downloaded \n\n#if [ -d \"package/dist/\" ]\n#then\n#echo \"ya hay
    una version anterior, para actualizar es necesario actualizar el contenedor\"\n#else\necho
    $MYAPP_VERSION_VUE >> versioncontrol.txt\necho \"descargar\"  $MYAPP_VERSION_VUE\napk
    update; apk add ca-certificates wget; update-ca-certificates;\n#wget --no-check-certificate
    --auth-no-challenge   --user=user --password=yourpass https://my-private-repo/repository/my-samplevue/-/vue-project-vue-$MYAPP_VERSION_VUE.tgz
    \ -O - | tar -xz\ncp -r package/dist/. /usr/share/nginx/html\necho \"daemon off;\"
    >> /etc/nginx/nginx.conf\n#fi\nnginx"
kind: ConfigMap
metadata:
  creationTimestamp: "2021-01-13T14:16:21Z"
  name: startup-script
  namespace: configmapns
  resourceVersion: "47509644"
  selfLink: /api/v1/namespaces/configmapns/configmaps/startup-script
  uid: da0034d6-596f-4bd3-b126-370ed985dbce

donde en data: se ve el nombre del archivo que se va a mapear por el configmap y su contenido.

ya que tenemos el archivo solo basta agregarlo a nuestro servicio como si fuera un volumen.

Ejemplo:

Dentro de nuestro yaml file debemos poner algo así:

      volumeMounts:  
      - mountPath: /script-vue.sh
          name: startup
          subPath: script-vue.sh
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: acr-secret
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 0777
          name: startup-script
        name: startup

En este caso 0777 es como nuestro chmod y nos ayuda a dar permisos sobre ese archivo usualmente ese valor va a cambiar por 511, el volumen se mapea por medio del nombre en este caso startup.

super con esto deberiamos poder modificar el script directamente en el config map y solo sera necesario reiniciar el pot para que tome el nuevo valor y listo.

Referencia de los permisos 0777, https://kubernetes.io/docs/concepts/configuration/secret/

Espero te sirva esta info.

Saludos cordiales
CB