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