[Nativo en la nube | Aprendiendo Kubernetes desde cero] 26. Mapa de configuración del centro de gestión de configuración

Este artículo se ha incluido en la columna " Aprender k8s desde cero "
Artículo anterior: Comprensión profunda de kubectl Haga clic saltar

inserte la descripción de la imagen aquí

Descripción general del mapa de configuración

¿Qué es un mapa de configuración?

Configmap es un objeto de recurso en k8s, que se utiliza para guardar la configuración no confidencial. Los datos se pueden guardar en forma de pares clave-valor clave/valor o en forma de archivos.

¿Qué problemas resuelve Configmap?

Cuando implementamos servicios, cada servicio tiene su propio archivo de configuración. Si se implementan varios servicios en un servidor: nginx, tomcat, apache, etc., estas configuraciones existen en este nodo. Para cumplir con los requisitos de alta concurrencia, el servidor debe estar expandido. Después de la expansión, el servidor aún necesita implementar múltiples servicios: nginx, tomcat y apache. El servidor recién agregado aún necesita administrar la configuración de estos servicios. Si hay un problema con un servicio, debe modificarse El archivo de configuración, la configuración en cada nodo físico debe modificarse, este método ciertamente no puede cumplir con los requisitos de los cambios de configuración en línea a gran escala. Por lo tanto, k8s presenta el objeto de recurso Configmap, que se puede montar en el pod como un volumen para lograr una administración de configuración unificada.

1. Configmap es un recurso en k8s, que es equivalente a un archivo de configuración y puede tener uno o más Configmaps;

2. El mapa de configuración se puede convertir en volumen.Después de que se inicia el pod k8s, se asigna al directorio especificado dentro del contenedor en forma de volumen;

3. La aplicación en el contenedor lee el archivo de configuración en el directorio específico del contenedor de la forma original.

4. Desde la perspectiva del contenedor, el archivo de configuración parece estar empaquetado en un directorio específico dentro del contenedor y todo el proceso no interfiere con la aplicación.

Escenarios de aplicación de configmap

1. Use k8s para implementar aplicaciones. Cuando escribe la configuración de la aplicación en el código, también necesita empaquetar la imagen al actualizar la configuración. configmap puede desacoplar la información de configuración de la imagen de la ventana acoplable, para darse cuenta de la portabilidad y reutilización de la imagen, porque un configMap es en realidad una colección de información de configuración, que se puede inyectar directamente en el Pod para que la use el contenedor. Hay dos formas de inyectar configmap: una es usar configMap como un volumen de almacenamiento y la otra es inyectar configMap en el contenedor a través de configMapKeyRef en env.

2. Si usa la arquitectura de microservicio, hay situaciones en las que varios servicios comparten la configuración. Si hay una sola configuración en cada servicio, será muy problemático actualizar la configuración. El uso de configmap se puede usar para compartir la configuración.

limitación

Los ConfigMaps no están diseñados para contener grandes cantidades de datos. Los datos guardados en ConfigMap no pueden exceder 1 MiB. Si necesita almacenar datos que excedan este límite de tamaño, considere montar un volumen de almacenamiento o usar una base de datos o un servidor de archivos por separado.

Método de creación de mapa de configuración

Crear directamente desde la línea de comandos

直接在命令行中指定 configmap 参数创建,通过--from-literal 指定参数 
[root@k8smaster ~]# kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com configmap/tomcat-config created
[root@k8smaster ~]# kubectl get cm
NAME            DATA   AGE
tomcat-config   2      4s
[root@k8smaster ~]# kubectl describe configmap tomcat-config 
Name:         tomcat-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
server_name:
----
myapp.tomcat.com
tomcat_port:
----
8080
Events:  <none>

Crear desde archivo

通过指定文件创建一个 configmap,--from-file=<文件>  下面的不是完整的nginx 只是一个例子
[root@k8smaster ~]# vim nginx.conf 
server {
    
     
 server_name www.nginx.com; 
 listen 80; 
 root /home/nginx/www/ 
} 
#定义一个 key 是 www,值是 nginx.conf 中的内容 --from-file是key 对应的值在下面
[root@k8smaster ~]# kubectl create configmap www-nginx --from-file=www=./nginx.conf 
configmap/www-nginx created
[root@k8smaster ~]# kubectl describe configmap www-nginx 
Name:         www-nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www:
----
server {
    
     
 server_name www.nginx.com; 
 listen 80; 
 root /home/nginx/www/ 
}

Events:  <none>

Especifique un directorio para crear un mapa de configuración para simular mysql

[root@k8smaster ~]# mkdir configmap
[root@k8smaster ~]# cd configmap/
[root@k8smaster configmap]# vim my-server.cnf 
server-id=1 
[root@k8smaster configmap]# vim my-slave.cnf 
server-id=2 
#指定目录创建 configmap 
[root@k8smaster configmap]# kubectl create configmap mysql-config --from-file=/root/configmap/ 
configmap/mysql-config created
#查看 configmap 详细信息 
[root@k8smaster configmap]# kubectl describe configmap mysql-config 
Name:         mysql-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
my-slave.cnf:
----
server-id=2 

my-server.cnf:
----
server-id=1 

Events:  <none>

Escribir el archivo YAML del manifiesto de recursos del mapa de configuración

[root@k8smaster configmap]# vim mysql-configmap.yaml                   配置文件多行要写| 不然有问题
apiVersion: v1
kind: ConfigMap 
metadata: 
  name: mysql
  labels:
    app: mysql
data: 
  master.cnf: |
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1

Uso de mapas de configuración

Introducido a través de variables de entorno: use configMapKeyRef

#创建一个存储 mysql 配置的 configmap 
[root@k8smaster ~]# vim mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
    lower: "1"
[root@k8smaster ~]# kubectl apply -f mysql-configmap.yaml 
configmap/mysql created
#创建 pod,引用 Configmap 中的内容 
[root@k8smaster ~]# vim mysql-pod.yaml 
apiVersion: v1
kind: Pod 
metadata: 
  name: mysql-pod
spec: 
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:    
    - name: log_bin 	#定义环境变量 log_bin 		mysql容器里会有这个变量 值是1
      valueFrom:
        configMapKeyRef:
          name: mysql 	#指定 configmap 的名字 
          key: log 		#指定 configmap 中的 key 
    - name: lower 		#定义环境变量 lower 			同上
      valueFrom:  
        configMapKeyRef:
          name: mysql
          key: lower       
  restartPolicy: Never

#更新资源清单文件 
[root@k8smaster ~]# kubectl apply -f mysql-pod.yaml 
pod/mysql-pod created

[root@xianchaomaster1 ~]# kubectl exec -it mysql-pod -c mysql -- /bin/sh 
/ # printenv 
log_bin=1
lower=1

Introducido a través de variables de entorno: use envfrom

[root@xianchaomaster1 ~]# vim mysql-pod-envfrom.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom:
    - configMapRef:
        name: mysql 		#指定 configmap 的名字 
  restartPolicy: Never
#更新资源清单文件 
[root@k8smaster ~]# kubectl apply -f mysql-pod-envfrom.yaml 
pod/mysql-pod-envfrom created
[root@k8smaster ~]# kubectl exec -it mysql-pod-envfrom -- /bin/sh 
/ # printenv 
lower=1
log=1
#引入到容器里了 这里的log和lower的值和mysqlconfigmap.yaml文件的值一样的

Convierta el mapa de configuración en un volumen y móntelo en el pod

[root@k8smaster ~]# vim mysql-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
    lower: "1"
    my.cnf: |
     [mysqld]
     nihao=paopao    
[root@k8smaster ~]# kubectl apply -f mysql-configmap.yaml 
configmap/mysql configured
[root@k8smaster ~]# kubectl describe cm mysql
Name:         mysql
Namespace:    default
Labels:       app=mysql
Annotations:  
Data
====
lower:
----
1
my.cnf:
----
[mysqld] 
nihao=paopao 

log:
----
1
Events:  <none>
[root@k8smaster ~]# vim mysql-pod-volume.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","sleep 3600" ]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap:					#把configmap做成卷 卷的名字叫mysql-config 挂载到tmp config目录下
      name: mysql
  restartPolicy: Never
[root@k8smaster ~]# kubectl apply -f mysql-pod-volume.yaml 
pod/mysql-pod-volume created
[root@k8smaster ~]# kubectl exec -it mysql-pod-volume -- /bin/sh 
/ # cd /tmp/config/ 
/tmp/config # ls
log     lower   my.cnf
#是不会有配置文件的 因为做成卷了

Actualización en caliente de configmap

把 logs: “1”变成 log: “2” 保存退出 
[root@k8smaster ~]# kubectl edit configmap mysql 
configmap/mysql edited
[root@k8smaster ~]# kubectl exec -it mysql-pod-volume -- /bin/sh 
/ # cat /tmp/config/log 
2
#发现 log 值变成了 2,更新生效了
注意: 
更新 ConfigMap 后
使用该 ConfigMap 挂载的 Env 不会同步更新 (环境变量不可通过configmap实时更新改变)
 
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概 10 秒)才能同步更新

escribir al final

No es fácil de crear, si crees que el contenido es útil para ti, ¡por favor dame un seguimiento de tres enlaces para apoyarme! Si hay algún error, indíquelo en los comentarios y lo cambiaré a tiempo.

La serie actualmente en actualización: Aprendiendo k8s desde cero

Gracias por mirar, el artículo se mezcla con la comprensión personal, si hay algún error, comuníquese conmigo para señalarlo ~

Supongo que te gusta

Origin blog.csdn.net/qq_45400861/article/details/127182698
Recomendado
Clasificación