【云原生 | 从零开始学Kubernetes】二十六、配置管理中心configmap

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。

Configmap 概述


什么是 Configmap?


Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。


Configmap 能解决哪些问题?


我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache 等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置, 如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改, 这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap 资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。


83.png


1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;


2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;


3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。


4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。


Configmap 应用场景


1、使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像, configmap 可以将配置信息和 docker 镜像解耦,以便实现镜像的可移植性和可复用性,因为一个 configMap 其实就是一系列配置信息的集合,可直接注入到 Pod 中给容器使用。configmap 注入方式有两种,一种将 configMap 做为存储卷,一种是将 configMap 通过 env 中 configMapKeyRef 注入到容器中。


2、使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用 configmap 可以友好的进行配置共享。


局限性


ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。


Configmap 创建方法


命令行直接创建


直接在命令行中指定 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>


通过文件创建


通过指定文件创建一个 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>


指定目录创建 configmap 模拟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>


编写 configmap 资源清单 YAML 文件


[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


使用 Configmap


通过环境变量引入:使用 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


通过环境变量引入:使用 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文件的值一样的


把 configmap 做成 volume,挂载到 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
#是不会有配置文件的 因为做成卷了


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 秒)才能同步更新


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7天前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
178 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
3月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
3月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
72 0
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
Cloud Native 持续交付 云计算
云原生架构的崛起:企业数字化转型的加速器
在当今快速发展的技术环境中,企业正面临着前所未有的变革压力。本文深入探讨了云原生架构如何成为推动企业数字化转型的关键力量。通过分析其核心概念、优势以及实施策略,本文旨在为读者提供对云原生技术的全面理解,展示其在现代企业中不可或缺的作用。
60 19
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
2月前
|
弹性计算 运维 Cloud Native
云原生架构的崛起与未来展望
在数字化转型的浪潮中,云原生架构凭借其高效、灵活和可扩展的特性,正逐渐成为企业IT战略的核心。本文旨在探讨云原生架构的定义、关键特性、实施优势以及面临的挑战,同时展望未来的发展趋势。通过深入分析,我们期望为读者提供一个关于云原生架构全面而深入的视角,助力企业在云计算时代做出更明智的决策。
61 3

热门文章

最新文章