Cet article a été inclus dans la rubrique " Apprendre k8s à partir de zéro "
Article précédent : Compréhension approfondie de kubectl Cliquez sauter
Carte de configuration
Présentation de la carte de configuration
Qu'est-ce qu'une Configmap ?
Configmap est un objet ressource dans k8s, qui est utilisé pour enregistrer une configuration non confidentielle. Les données peuvent être enregistrées sous la forme de paires clé/valeur clé-valeur ou sous la forme de fichiers.
Quels problèmes Configmap résout-il ?
Lorsque nous déployons des services, chaque service a son propre fichier de configuration. Si plusieurs services sont déployés sur un serveur : nginx, tomcat, apache, etc., ces configurations existent sur ce nœud. Pour répondre aux exigences de simultanéité élevées, le serveur doit être étendu. Après l'extension, le serveur doit encore déployer plusieurs services : nginx, tomcat et apache. Le serveur nouvellement ajouté doit encore gérer la configuration de ces services. S'il y a un problème avec un service, il doit être modifié Le fichier de configuration, la configuration sur chaque nœud physique doit être modifié, cette méthode ne peut certainement pas répondre aux exigences des changements de configuration à grande échelle en ligne. Par conséquent, k8s introduit l'objet de ressource Configmap, qui peut être monté sur le pod en tant que volume pour obtenir une gestion de configuration unifiée.
1. Configmap est une ressource dans k8s, qui équivaut à un fichier de configuration et peut avoir un ou plusieurs Configmaps ;
2. Configmap peut être transformé en volume.Après le démarrage du pod k8s, il est mappé au répertoire spécifié à l'intérieur du conteneur sous la forme d'un volume ;
3. L'application dans le conteneur lit le fichier de configuration sur le répertoire spécifique du conteneur de la manière originale.
4. Du point de vue du conteneur, le fichier de configuration semble être empaqueté dans un répertoire spécifique à l'intérieur du conteneur, et l'ensemble du processus n'empiète pas sur l'application.
Scénarios d'application Configmap
1. Utilisez k8s pour déployer des applications. Lorsque vous écrivez la configuration de l'application dans le code, vous devez également empaqueter l'image lors de la mise à jour de la configuration. configmap peut dissocier les informations de configuration de l'image docker, afin de réaliser la portabilité et la réutilisabilité de l'image, car une configMap est en fait une collection d'informations de configuration, qui peuvent être directement injectées dans le pod pour que le conteneur les utilise. Il existe deux manières d'injecter configmap : l'une consiste à utiliser configMap comme volume de stockage et l'autre consiste à injecter configMap dans le conteneur via configMapKeyRef dans env.
2. Si vous utilisez l'architecture de microservice, il existe des situations où plusieurs services partagent la configuration. S'il y a une seule configuration dans chaque service, il sera très difficile de mettre à jour la configuration. L'utilisation de configmap peut être utilisée pour le partage de configuration.
limitation
Les ConfigMaps ne sont pas conçus pour contenir de grandes quantités de données. Les données enregistrées dans la ConfigMap ne peuvent pas dépasser 1 Mio. Si vous avez besoin de stocker des données qui dépassent cette limite de taille, envisagez de monter un volume de stockage ou d'utiliser une base de données ou un serveur de fichiers distinct.
Méthode de création de configmap
Créer directement depuis la ligne de commande
直接在命令行中指定 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>
Créer à partir d'un fichier
通过指定文件创建一个 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>
Spécifiez un répertoire pour créer un configmap pour simuler 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>
Écrire le fichier YAML du manifeste de ressource configmap
[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
Utilisation des cartes de configuration
Introduit via des variables d'environnement : utilisez 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
Introduit via des variables d'environnement : utilisez 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文件的值一样的
Faites du configmap un volume et montez-le sur le 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
#是不会有配置文件的 因为做成卷了
Mise à jour à chaud de la configuration
把 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 秒)才能同步更新
écrire à la fin
Ce n'est pas facile à créer, si vous pensez que le contenu vous est utile, merci de me donner un suivi à trois liens pour me soutenir ! S'il y a des erreurs, merci de les signaler dans les commentaires et je les corrigerai en temps voulu !
La série en cours de mise à jour : Apprendre le k8 à partir de zéro
Merci d'avoir regardé, l'article est mélangé à une compréhension personnelle, s'il y a une erreur, veuillez me contacter pour le signaler ~