[Cloud native | Apprendre Kubernetes à partir de zéro] 26. Configmap du centre de gestion de la configuration

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

insérez la description de l'image ici

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 ~

Je suppose que tu aimes

Origine blog.csdn.net/qq_45400861/article/details/127182698
conseillé
Classement