Introducción a los mapas de configuración de Kubernetes

Mapa de configuración

ServiceEs Kubernetesun concepto central muy importante en el sistema. Aprendamos otro objeto de recurso muy importante hoy: ConfigMapsabemos 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 redisservicio 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 redisde redisconfiguración .

crear

ConfigMapEl objeto de recurso utiliza key-valuepares clave-valor del formulario para configurar datos. Estos datos se pueden Podusar en él, que es similar ConfigMapa lo que hablaremos más adelante. SecretsUna gran diferencia es que ConfigMappuede manejar algunos datos no confidenciales de manera más conveniente. como contraseñas y similares Todavía necesita usar Secretspara administrar. Pongamos un ejemplo para ilustrar ConfigMapcó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 datase 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.yamlpara crear los ConfigMapobjetos anteriores, pero si no sabemos cómo crear ConfigMap, no olvide kubectlser nuestro mejor maestro, puede usar kubectl create configmap -hpara ver ConfigMapla 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 testcmdirectorio que contiene algunos archivos de configuración redise mysqlinformació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-filepalabras 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-filelos archivos especificados por el parámetro bajo el directorio se utilizarán para ConfigMapcrear 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 ConfigMapla lista:

$ kubectl get configmap
NAME       DATA      AGE
cm-demo1   2         17s

Puede ver que se ha creado cm-demo1un objeto ConfigMapy luego puede usar describeel 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 keyson testcmlos nombres de archivo en el directorio, y el valuevalor 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 describeno 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 ConfigMapDe manera similar, tomando el archivo de configuración anterior como ejemplo, creamos un objeto redisseparado 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.confla información de configuración del archivo ConfigMapse ha creado con éxito. También vale la pena señalar que --from-fileeste parámetro se puede usar varias veces. Por ejemplo, lo usamos dos veces aquí para especificar redis.confy mysql.confarchivar 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-literalpará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

ConfigMapLa creación es exitosa, entonces, ¿cómo deberíamos Podusarla? Decimos que ConfigMapestos 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, ConfigMapllenamos 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_HOSTeso y DB_PORTse 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 ConfigMappara establecer parámetros de línea de comandos, ConfigMapy 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, Podse generará la siguiente información:

$ kubectl logs testcm2-pod
localhost 3306

La otra es una ConfigMapforma 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 ConfigMapcontrolar la ruta en el volumen de datos donde se mapea el valor, como Podse 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 ConfigMapse monta en forma de volumen de datos Pod, se actualiza ConfigMap(o elimina y reconstruye ConfigMap) en este momento, y Podla 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 reloadcorresponder a los servicios.


Supongo que te gusta

Origin blog.csdn.net/u010674953/article/details/129420003
Recomendado
Clasificación