En el post anterior Agregamos Persisten Volumens y Persisten Volume Claims para tener un persistencia más allá del ciclo de vida de los Pods, en este Post vamos a mover la configuración a ConfigMaps y Secrets.
Crear config maps
El siguiente paso es pasar las environment variables a configuración, de modo de poder modificarlas y que sea escalable. De momento no vamos a crear secrets, solo pasar los valores a un configmap
Primero creamos el configmap, de momento con los secrets y el mismo para ambas aplicaciones
apiVersion:v1kind:ConfigMapmetadata:labels:app:my-wordpressname:mywordpress-configdata:MYSQL_RANDOM_ROOT_PASSWORD:'1'MYSQL_DATABASE:passwordMYSQL_USER:readWriteMYSQL_PASSWORD:passwordMYSQL_HOST:mysql
Y modificamos los deployment para cargar sus valores en las variables de entorno
apiVersion:apps/v1kind:Deploymentmetadata:name:my-dblabels:app:my-dbspec:replicas:1selector:matchLabels:app:my-dbtemplate:metadata:labels:app:my-dbspec:containers:-name:my-dbimage:mysql:5.7ports:-containerPort:80volumeMounts:-mountPath:/var/lib/mysqlname:my-db-pvenv:-name:MYSQL_RANDOM_ROOT_PASSWORDvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_RANDOM_ROOT_PASSWORD-name:MYSQL_DATABASEvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_DATABASE-name:MYSQL_USERvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_USER-name:MYSQL_PASSWORDvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_PASSWORDvolumes:-name:my-db-pvpersistentVolumeClaim:claimName:mysql-pvc
apiVersion:apps/v1kind:Deploymentmetadata:name:my-wordpresslabels:app:my-wordpressspec:replicas:1selector:matchLabels:app:my-wordpresstemplate:metadata:labels:app:my-wordpressspec:containers:-name:my-wordpressimage:wordpress:latestvolumeMounts:-name:my-wp-pvmountPath:/var/www/htmlports:-containerPort:80env:-name:WORDPRESS_DB_PASSWORDvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_PASSWORD-name:WORDPRESS_DB_USERvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_USER-name:WORDPRESS_DB_NAMEvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_DATABASE-name:WORDPRESS_DB_HOSTvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_HOSTvolumes:-name:my-wp-pvpersistentVolumeClaim:claimName:mywordpress-pvc
Proteger secrets
Los secrets o passwords de la base de datos en el yaml del config map no son una buena idea, podemos hacer dos cosas:
- Crear dos objetos secret en yaml
- Crear los secrets por línea de comandos
Cada uno tiene sus ventajas y desventajas.
Crear dos objectos secret Ya que los secrets se guardan en base64 primero hay que encodearlos
apiVersion:v1kind:Secretmetadata:name:mysecretstype:Opaquedata:MYSQL_PASSWORD:bXlwYXNzd29yZA==
Modificamos el configmap para quitar el password y modificamos los deployments para leer el secret
apiVersion:v1kind:ConfigMapmetadata:labels:app:my-wordpressname:mywordpress-configdata:MYSQL_DATABASE:passwordMYSQL_USER:readWriteMYSQL_HOST:mysqlMYSQL_RANDOM_ROOT_PASSWORD:'1'
apiVersion:apps/v1kind:Deploymentmetadata:name:my-dblabels:app:my-dbspec:replicas:1selector:matchLabels:app:my-dbtemplate:metadata:labels:app:my-dbspec:containers:-name:my-dbimage:mysql:5.7ports:-containerPort:80volumeMounts:-mountPath:/var/lib/mysqlname:my-db-pvenv:-name:MYSQL_RANDOM_ROOT_PASSWORDvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_RANDOM_ROOT_PASSWORD-name:MYSQL_DATABASEvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_DATABASE-name:MYSQL_USERvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_USER-name:MYSQL_PASSWORDvalueFrom:secretKeyRef:name:mysecretskey:MYSQL_PASSWORDvolumes:-name:my-db-pvpersistentVolumeClaim:claimName:mysql-pvc-name:my-db-configconfigMap:name:mywordpress-config
apiVersion:apps/v1kind:Deploymentmetadata:name:my-wordpresslabels:app:my-wordpressspec:replicas:1selector:matchLabels:app:my-wordpresstemplate:metadata:labels:app:my-wordpressspec:containers:-name:my-wordpressimage:wordpress:latestvolumeMounts:-name:my-wp-pvmountPath:/var/www/htmlports:-containerPort:80env:-name:WORDPRESS_DB_PASSWORDvalueFrom:secretKeyRef:name:mysecretskey:MYSQL_PASSWORD-name:WORDPRESS_DB_USERvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_USER-name:WORDPRESS_DB_NAMEvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_DATABASE-name:WORDPRESS_DB_HOSTvalueFrom:configMapKeyRef:name:mywordpress-configkey:MYSQL_HOSTvolumes:-name:my-wp-pvpersistentVolumeClaim:claimName:mywordpress-pvc
Genial, el último paso sería para no tener el secret en un archivo (aunque se puede restringir su acceso) es crearlo por línea de comandos Borramos el existente y lo creamos por línea de comandos
kubectldeletesecretmysecretskubectlcreatesecretgenericmysecrets--from-literal=MYSQL_PASSWORD='bXlwYXNzd29yZA=='kubectlgetsecretmysecrets-oyaml
Alternativamente podemos crearlo por línea de comandos a partir de un file (por ejemplo si es un texto largo o un certificado, etc.)
kubectlcreatesecretgenericdb-user-pass--from-file=username=./username.txt--from-file=password=./password.txt
Nos leemos.