Mapa de configuración
Service
Es Kubernetes
un concepto central muy importante en el sistema. Aprendamos otro objeto de recurso muy importante hoy: ConfigMap
sabemos que muchas aplicaciones a menudo leen información de configuración de archivos de configuración, parámetros de línea de comando o variables de entorno. Definitivamente no se escribirá directamente en el programa de la aplicación. Por ejemplo, si conecta una aplicación a un redis
servicio y desea reemplazarla la próxima vez, debe modificar el código nuevamente y crear una nueva imagen. Esto definitivamente no es recomendable ConfigMap
. Nos brinda la capacidad de inyectar información de configuración en el contenedor, que puede usarse no solo para guardar un solo atributo, sino también para guardar todo el archivo de configuración, por ejemplo, podemos usarlo para configurar la dirección de acceso de un servicio, o para guardar todo el documento redis
de redis
configuración .
crear
ConfigMap
El objeto de recurso utiliza key-value
pares clave-valor del formulario para configurar datos. Estos datos se pueden Pod
usar en él, que es similar ConfigMap
a lo que hablaremos más adelante. Secrets
Una gran diferencia es que ConfigMap
puede manejar algunos datos no confidenciales de manera más conveniente. como contraseñas y similares Todavía necesita usar Secrets
para administrar. Pongamos un ejemplo para ilustrar ConfigMap
cómo usarlo:
kind: ConfigMap
apiVersion: v1
metadata:
name: cm-demo
namespace: default
data:
data.1: hello
data.2: world
config: |
property.1=value-1
property.2=value-2
property.3=value-3
Los datos de configuración data
se configuran en las propiedades, los dos primeros se usan para guardar una sola propiedad y el último se usa para guardar un archivo de configuración.
Por supuesto, podemos usar lo mismo kubectl create -f xx.yaml
para crear los ConfigMap
objetos anteriores, pero si no sabemos cómo crear ConfigMap
, no olvide kubectl
ser nuestro mejor maestro, puede usar kubectl create configmap -h
para ver ConfigMap
la información de ayuda sobre la creación,
Examples:
# Create a new configmap named my-config based on folder bar
kubectl create configmap my-config --from-file=path/to/bar
# Create a new configmap named my-config with specified keys instead of file basenames on disk
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
# Create a new configmap named my-config with key1=config1 and key2=config2
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
Podemos ver que se puede crear un objeto a partir de un directorio dado ConfigMap
, por ejemplo, tenemos un testcm
directorio que contiene algunos archivos de configuración redis
e mysql
información de conexión, así:
$ ls testcm
redis.conf
mysql.conf
$ cat testcm/redis.conf
host=127.0.0.1
port=6379
$ cat testcm/mysql.conf
host=127.0.0.1
port=3306
Entonces podemos usar from-file
palabras clave para crear todos los archivos de configuración que contienen este directorio ConfigMap
:
$ kubectl create configmap cm-demo1 --from-file=testcm
configmap "cm-demo1" created
Todos from-file
los archivos especificados por el parámetro bajo el directorio se utilizarán para ConfigMap
crear un par clave-valor, el nombre de la clave es el nombre del archivo y el valor es el contenido del archivo.
Una vez completada la creación, también podemos usar el siguiente comando para ver ConfigMap
la lista:
$ kubectl get configmap
NAME DATA AGE
cm-demo1 2 17s
Puede ver que se ha creado cm-demo1
un objeto ConfigMap
y luego puede usar describe
el comando para ver los detalles:
kubectl describe configmap cm-demo1
Name: cm-demo1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
mysql.conf:
----
host=127.0.0.1
port=3306
redis.conf:
----
host=127.0.0.1
port=6379
Events: <none>
Podemos ver que los dos key
son testcm
los nombres de archivo en el directorio, y el value
valor correspondiente es el contenido del archivo. Vale la pena señalar aquí que si la información de configuración en el archivo es grande, es posible que describe
no se muestre el valor correspondiente. Para ver el valor clave Si es así, puede usar el siguiente comando:
$ kubectl get configmap cm-demo1 -o yaml
apiVersion: v1
data:
mysql.conf: |
host=127.0.0.1
port=3306
redis.conf: |
host=127.0.0.1
port=6379
kind: ConfigMap
metadata:
creationTimestamp: 2018-06-14T16:24:36Z
name: cm-demo1
namespace: default
resourceVersion: "3109975"
selfLink: /api/v1/namespaces/default/configmaps/cm-demo1
uid: 6e0f4d82-6fef-11e8-a101-525400db4df7
Además de crear a través del directorio de archivos, también podemos usar el archivo especificado para crear ConfigMap
De manera similar, tomando el archivo de configuración anterior como ejemplo, creamos un objeto redis
separado de una configuración:ConfigMap
$ kubectl create configmap cm-demo2 --from-file=testcm/redis.conf
configmap "cm-demo2" created
$ kubectl get configmap cm-demo2 -o yaml
apiVersion: v1
data:
redis.conf: |
host=127.0.0.1
port=6379
kind: ConfigMap
metadata:
creationTimestamp: 2018-06-14T16:34:29Z
name: cm-demo2
namespace: default
resourceVersion: "3110758"
selfLink: /api/v1/namespaces/default/configmaps/cm-demo2
uid: cf59675d-6ff0-11e8-a101-525400db4df7
Podemos ver que un objeto asociado con redis.conf
la información de configuración del archivo ConfigMap
se ha creado con éxito. También vale la pena señalar que --from-file
este parámetro se puede usar varias veces. Por ejemplo, lo usamos dos veces aquí para especificar redis.conf
y mysql.conf
archivar por separado, lo que tiene el mismo efecto que especificando directamente todo el directorio.
Además, a través de la documentación de ayuda, podemos ver que también podemos usar cadenas directamente para crear y pasar información de configuración a través de --from-literal
parámetros.De igual manera, este parámetro se puede usar varias veces, y el formato es el siguiente:
$ kubectl create configmap cm-demo3 --from-literal=db.host=localhost --from-literal=db.port=3306
configmap "cm-demo3" created
$ kubectl get configmap cm-demo3 -o yaml
apiVersion: v1
data:
db.host: localhost
db.port: "3306"
kind: ConfigMap
metadata:
creationTimestamp: 2018-06-14T16:43:12Z
name: cm-demo3
namespace: default
resourceVersion: "3111447"
selfLink: /api/v1/namespaces/default/configmaps/cm-demo3
uid: 06eeec7e-6ff2-11e8-a101-525400db4df7
usar
ConfigMap
La creación es exitosa, entonces, ¿cómo deberíamos Pod
usarla? Decimos que ConfigMap
estos datos de configuración se pueden utilizar de muchas formas Pod
, principalmente de las siguientes formas:
- Establecer el valor de la variable de entorno.
- Establecer parámetros de línea de comando en el contenedor
- Crear un archivo de configuración en el volumen de datos
Primero, ConfigMap
llenamos nuestras variables de entorno con:
apiVersion: v1
kind: Pod
metadata:
name: testcm1-pod
spec:
containers:
- name: testcm1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
envFrom:
- configMapRef:
name: cm-demo1
Después de que se ejecute el Pod, generará las siguientes líneas:
$ kubectl logs testcm1-pod
......
DB_HOST=localhost
DB_PORT=3306
mysql.conf=host=127.0.0.1
port=3306
redis.conf=host=127.0.0.1
port=6379
......
Podemos ver DB_HOST
eso y DB_PORT
se han emitido normalmente. Las otras variables de entorno se deben a que las inyectamos directamente aquí cm-demo1
, por lo que se emiten todos sus valores clave, lo que también está en línea con las expectativas.
Además, podemos usar ConfigMap
para establecer parámetros de línea de comandos, ConfigMap
y también se puede usar para establecer comandos o valores de parámetros en el contenedor, de la siguiente manera Pod
:
apiVersion: v1
kind: Pod
metadata:
name: testcm2-pod
spec:
containers:
- name: testcm2
image: busybox
command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
Después de ejecutar esto, Pod
se generará la siguiente información:
$ kubectl logs testcm2-pod
localhost 3306
La otra es una ConfigMap
forma de uso muy común: usar a través del volumen de datos, usar en el volumen de datos ConfigMap
, es llenar el archivo en el volumen de datos, en este archivo, la clave es el nombre del archivo y el valor clave es el archivo contenido:
apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo2
Ejecute este Pod
, verifique el registro:
$ kubectl logs testcm3-pod
host=127.0.0.1
port=6379
Por supuesto, también podemos ConfigMap
controlar la ruta en el volumen de datos donde se mapea el valor, como Pod
se define a continuación:
apiVersion: v1
kind: Pod
metadata:
name: testcm4-pod
spec:
containers:
- name: testcm4
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo1
items:
- key: mysql.conf
path: path/to/msyql.conf
Ejecute este Pod
, verifique el registro:
$ kubectl logs testcm4-pod
host=127.0.0.1
port=3306
Además, debe tenerse en cuenta que cuando ConfigMap
se monta en forma de volumen de datos Pod
, se actualiza ConfigMap
(o elimina y reconstruye ConfigMap
) en este momento, y Pod
la información de configuración montada en el interior se actualizará en caliente. En este momento, puede agregar algunos scripts para monitorear los cambios en el archivo de configuración y luego reload
corresponder a los servicios.