Este artículo se ha incluido en la columna " Aprender k8s desde cero "
Artículo anterior: Comprensión profunda de kubectl Haga clic saltar
Mapa de configuración
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 ~