Separación de configuraciones: ConfigMap


Elementos nativos de la nube - Separación de configuración: ConfigMap&Secret

¿Qué es ConfigMap?

Un ConfigMap es un objeto API que se utiliza para almacenar datos no confidenciales en pares clave-valor.

Un ejemplo es más intuitivo para ver qué es ConfigMap: por ejemplo, si tengo un recurso de pod de nginx, entonces ConfigMap es equivalente al archivo de configuración nginx.conf.

Cabe señalar que Pod y ConfigMap deben estar en el mismo espacio de nombres, no entre espacios de nombres.

Un uso típico de un ConfigMap para que lo use un contenedor es el siguiente:

  • Genera variables de entorno dentro del contenedor.
  • Establezca los parámetros de inicio del comando de inicio del contenedor (deben establecerse como variables de entorno).
  • Montado como un volumen como archivo o directorio dentro del contenedor.

ConfigMap es similar a Secret. El primero es más adecuado para la configuración de texto sin formato, y el segundo es adecuado para contraseñas y otras configuraciones.

Cómo se crean ConfigMaps

  • sintaxis de creación de configmap:
kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none]
[options]

Crear mapa de configuración basado en directorio/archivo

  • Cree un directorio y un archivo para practicar con dos archivos para probar
[root@k8s-master01 ~]# mkdir /configmap
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 ~]# cd /configmap/
[root@k8s-master01 configmap]# mkdir conf
[root@k8s-master01 configmap]# vim conf/test01.conf
[root@k8s-master01 configmap]# vim conf/test02.conf 
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 configmap]# cat conf/test1.conf 
lives=3
name=haha
[root@k8s-master01 configmap]# cat conf/test2.conf 
color.good=yellow
user=mysql
  • Cree un cm (cm es una abreviatura de configmap), lo mismo que crear otros tipos de recursos
[root@k8s-master01 configmap]# kubectl create configmap cmfile --from-file=conf/
[root@k8s-master01 configmap]# kubectl get cm
NAME               DATA   AGE
cmfile             2      13s
kube-root-ca.crt   1      21d
# 可以看到刚才创建的资源已经成功了
  • Podemos comprobar el archivo yaml del cm generado
[root@k8s-master01 configmap]# kubectl get cm cmfile -oyaml
apiVersion: v1
data:
  test1.conf: |
    lives=3
    name=haha
  test2.conf: |
    color.good=yellow
    user=mysql
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-23T02:50:40Z"
  name: cmfile
  namespace: default
  resourceVersion: "1050098"
  uid: 39b904c2-c1a4-442c-a6fe-6a3d89af36ac
  • Buscar datos, puede ver que el contenido debajo de los datos contiene los dos archivos y el contenido creado por la prueba anterior
  • La creación basada en archivos es similar a la creación de directorios, siempre que se agreguen los archivos especificados en el directorio, por ejemplo:
[root@k8s-master01 configmap]# kubectl create cm cmfromfile --from-file=conf/test02.conf 
  • Hay un lugar poco común, el nombre en el mapa de configuración personalizado
[root@k8s-master01 configmap]# vim test03.conf
[root@k8s-master01 configmap]# kubectl create cm test03 --from-file=test03-conf=test03.conf
configmap/test03 created
[root@k8s-master01 configmap]# kubectl get cm test03 -o yaml 
apiVersion: v1
data:
  test03-conf: |
    user=www
    passwd=123456
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-20T10:52:11Z"
  name: test03
  namespace: default
  resourceVersion: "914180"
  uid: 2f41ffa8-f200-48ee-8e61-729cfdf81b97
  • Se puede ver que test03.conf en el ejemplo anterior se ha convertido en el formato test03-conf, que es suficiente para entender.

Crear un mapa de configuración basado en un archivo env

  • De hecho, los métodos son los mismos, así que no los escribiré. Echemos un vistazo al método de creación: adecuado para más pares clave-valor.
[root@k8s-master01 configmap]# kubectl create cm envfile --from-env-file=envfile.conf 
configmap/envfile created
[root@k8s-master01 configmap]# kubectl get cm envfile -o yaml 
apiVersion: v1
data:
  age: "25"
  hehe: haha
  name: yy
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-23T03:02:58Z"
  name: envfile
  namespace: default
  resourceVersion: "1051876"
  uid: 27a62b22-cd46-4dbe-bf12-6b34a67befe8
# 可以看到里面的等号换成冒号

Crear mapa de configuración directamente basado en literal

  • Por ejemplo, solo necesitamos una o dos o unas pocas variables, que se pueden usar cuando no hay necesidad de escribir un archivo
[root@k8s-master01 configmap]# kubectl create cm literaltest --from-literal=PORT=8080 --from-literal=PASSWORD=123456 

Crear un mapa de configuración basado en un archivo yaml

Use valueFrom para definir variables de entorno

Apto para lugares con pocos parámetros de configuración

  • Primero creamos un recurso de implementación para facilitar las pruebas. La función de --dry-run es generar solo archivos yaml sin crear recursos.
kubectl create deployment dp-cm --image=nginx --dry-run=client -o yaml > dp-cm.yaml
  • El archivo yaml restante después de una simple modificación
[root@k8s-master01 configmap]# cat dp-cm.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dp-cm
  name: dp-cm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dp-cm
  strategy: {
    
    }
  template:
    metadata:
      labels:
        app: dp-cm
    spec:
      containers:
      - image: nginx
        name: nginx
  • Agregamos una variable de entorno tradicional y definimos una usando configmap respectivamente
    spec:
      containers:
      - image: nginx
        name: nginx
        env:
        - name: TEST_ENV
          value: test_env
        - name: TEST_X
          valueFrom:
            configMapKeyRef:
              name: envfile
              key: hehe
  • La primera variable de entorno en env se define de acuerdo con el modo tradicional; la segunda es tomar el valor en el mapa de configuración, echemos un vistazo al efecto
[root@k8s-master01 configmap]# kubectl create -f dp-cm.yaml 
deployment.apps/dp-cm created
[root@k8s-master01 configmap]# kubectl exec dp-cm-f8c48c84c-zvcwt -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dp-cm-f8c48c84c-zvcwt
NGINX_VERSION=1.21.6
NJS_VERSION=0.7.2
PKG_RELEASE=1~bullseye
TEST_ENV=test_env
TEST_X=haha
  • Las dos últimas son las variables que definimos directamente y las variables en el mapa de configuración de referencia.
  • Si hace referencia a múltiples variables, solo necesita agregar definiciones más adelante
        - name: TEST_X
          valueFrom:
            configMapKeyRef:
              name: envfile
              key: hehe
        - name: TEST_Y
          valueFrom:
            configMapKeyRef:
              name: envfile
              key: name              

Nota: Si la variable a la que se hace referencia no existe, se informará un error y la creación del pod no se realizará correctamente.

Use envfrom para generar variables de entorno en lotes

    spec:
      containers:
      - image: nginx
        name: nginx
        envFrom:
        - configMapRef:
            name: envfile
  • Actualice el Pod y vea los resultados
[root@k8s-master01 configmap]# kubectl replace -f dp-cm.yaml 
deployment.apps/dp-cm replaced
[root@k8s-master01 configmap]# kubectl exec dp-cm-8565c44587-x8k62 -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dp-cm-8565c44587-x8k62
NGINX_VERSION=1.21.6
NJS_VERSION=0.7.2
PKG_RELEASE=1~bullseye
age=25
hehe=haha
name=yy
TEST_ENV=test_env
  • Puede ver que los nombres en minúsculas en las siguientes tres líneas envfileson el contenido de nuestro configMap
  • Cuando las variables en un Pod se definen directamente o se definen desde configMap, podemos agregar un prefixprefijo para distinguir:
    spec:
      containers:
      - image: nginx
        name: nginx
        envFrom:
        - configMapRef:
            name: envfile
          prefix: fromCm_
        env:
        - name: TEST_ENV
          value: test_env

Montar ConfigMap como archivo

  • Creamos una copia en cm de redis-conf por adelantado y luego la montamos en el Pod del siguiente archivo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: redisconf
          mountPath: /etc/config
      volumes:
      - name: redisconf
        configMap:
          name: redis-conf
  • En la parte anterior, hay dos nombres debajo de los volúmenes, el primero es el nombre que debe montarse en el Pod y el segundo es el nombre del configMap, que se ha distinguido.
  • Ejecute el archivo yaml e ingrese al interior del Pod para verificar el estado del montaje
# 创建Pod
[root@k8s-master01 ~]# kubectl create -f dp-cm.yaml 
# 进入到Pod中查看挂载情况
[root@k8s-master01 ~]# kubectl exec -ti dp-cm-77b4666649-jd4sc -- bash
root@dp-cm-77b4666649-jd4sc:/# cd /etc/config/
root@dp-cm-77b4666649-jd4sc:/etc/config# ls
redis-conf
root@dp-cm-77b4666649-jd4sc:/etc/config# cat redis-conf 
hehe 123123
# 可以看到我们之前创建的文件已经挂载好了
  • Edite el contenido del archivo cm en línea y los archivos montados en el Pod también cambiarán con
[root@k8s-master01 ~]# kubectl edit cm redis-conf 
[root@k8s-master01 ~]# kubectl get cm redis-conf -o yaml 
  redis-conf: |
    hehe 23412423412
[root@k8s-master01 ~]# kubectl exec -ti dp-cm-77b4666649-jd4sc -- bash
root@dp-cm-77b4666649-jd4sc:/# cat /etc/config/redis-conf 
hehe 23412423412
# Pod中的文件也随着修改了

Evitar operaciones de sobrescritura

Por ejemplo, tenemos un configMap de nginx-conf para ser montado en el directorio /etc/nginx de nginx, si lo operamos directamente sobreescribirá todo el contenido en /etc/nginx, dando como resultado un error en el Pod.
Por lo tanto, debe agregarse subPathpara evitar que se sobrescriba el contenido, de la siguiente manera:

    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: nginxconf
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf  # 这样只会对这一个文件进行覆盖
      volumes:
      - name: nginxconf
        configMap:
          name: nginx-conf

Autorización y nombres de archivo personalizados

  • Use itemun nombre de archivo personalizado: equivalente a hacer un enlace suave
      volumes:
      - name: redisconf
        configMap:
          name: redis-conf
          items:
          - key: redis.conf
            path: redis2.conf
  • Utilice defaultModela gestión de permisos para archivos en ConfigMap
      volumes:
      - name: redisconf
        configMap:
          name: redis-conf
          items:
          - key: redis.conf
            path: redis2.conf
            mode: 0644 # 具体文件权限,优先级高
          defaultMode: 0666 # configMap的默认权限

Operación de actualización en caliente

Si se crea a través de un archivo yaml, solo necesita modificarlo en el archivo yaml y luego kubectl replaceactualizarlo

Si se crea por comando:

  • Puede importar cm a un archivo yaml para modificarlo y luego actualizarlo, pero pueden ocurrir errores, lo cual no se recomienda.
  • También puede modificar los archivos originales utilizados antes de crear cm, como nginx.confarchivos, y luego usarlos --dry-run=clientpara generar un archivo yaml y luego actualizarlos. como sigue:
kubectl create cm nginx-conf --from-file=nginx.conf --dry-run=client -oyaml | kubectl replace -f -

restricciones de uso

  • Necesita crear ConfigMap o Secret por adelantado
  • La clave referenciada debe existir
  • envFrom y valueFrom no se pueden actualizar en caliente
  • envFrom configura las variables de entorno. Si la clave no es válida, se ignorará la clave no válida
  • Los recursos deben estar en el mismo espacio de nombres
  • subPath tampoco se puede actualizar en caliente

El contenido es inmutable

Agregue el siguiente contenido a ConfigMap o Secret, y los recursos no se pueden modificar después de la ejecución

immutable: ture

Supongo que te gusta

Origin blog.csdn.net/qq_42527269/article/details/123033397
Recomendado
Clasificación