K8S配置管理中心Configmap实现微服务配置

一、什么是Configmap?

ConfigMap是Kubernetes中的一个API对象,主要用于存储非机密性的配置数据。这些数据可以是配置文件、环境变量、命令行参数等,它们被存储在键值对中,每个键和值都是字符串类型。ConfigMap允许将应用程序的配置与容器化的应用程序分开管理,从而提高了配置的灵活性和动态性。

二、Configmap能解决哪些问题?

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

1、Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
2、Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

Kubernetes(K8s)中的ConfigMap是一种用于存储配置数据的资源对象,它能够解决一系列与应用程序配置相关的问题。具体来说,ConfigMap主要能解决以下问题:

1、配置与代码的分离
通过将配置数据存储在ConfigMap中,可以实现应用程序的配置与代码的分离。这意味着在修改配置时,无需重新构建应用程序的镜像或重新部署应用,从而提高了配置的灵活性和可管理性。

2、配置的集中管理
ConfigMap允许将应用程序的配置集中存储在Kubernetes集群中,而不是分散在各个应用程序中。这样可以方便地管理和修改配置,避免了配置信息的碎片化,提高了配置的可维护性。

3、配置的动态更新
在不重新启动应用程序的情况下,可以更新ConfigMap中的配置,并立即反映在应用程序中(前提是应用程序支持热加载配置)。这种动态更新配置的能力使得应用程序能够更快地适应环境变化,提高了系统的响应速度和灵活性。

4、配置的版本控制
ConfigMap中的配置可以使用版本控制系统进行管理,可以随时回滚到之前的版本。这保证了配置的可追溯性和可恢复性,使得在配置出现问题时能够快速定位并修复。

5、配置的共享和复用
ConfigMap可以被多个应用程序共享和复用,避免了重复定义和维护配置的问题。这提高了配置的一致性和可维护性,降低了配置管理的复杂性。

6、增强安全性
通过将非机密配置与机密数据分开管理(机密数据应使用Kubernetes的Secret对象管理),ConfigMap增强了集群的安全性。这种分离管理的方式减少了机密数据泄露的风险,提高了系统的安全性。

7、简化配置管理
通过Kubernetes的API,可以方便地创建、更新和删除ConfigMap,从而简化了配置管理的流程。这使得配置管理变得更加高效和便捷。

三、Configmap应用场景

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

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

ConfigMap在Kubernetes(K8s)中的应用场景非常广泛,以下是一些主要的应用场景:

1、环境分离与配置管理
多环境配置管理:
在开发、测试、生产等不同环境中,应用程序可能需要不同的配置。ConfigMap允许为不同环境创建不同的配置,并在需要时轻松切换。
动态配置更新:
在不重新构建或重启应用程序的情况下,可以通过更新ConfigMap来动态地更改应用程序的配置。这提高了应用程序的灵活性和响应速度。

2、配置共享与复用
微服务架构中的配置共享:
在微服务架构中,多个服务可能需要共享某些配置,如数据库连接信息、API密钥等。ConfigMap允许将这些共享配置集中存储和管理,避免了在每个服务中单独维护配置的麻烦。
跨Pod或跨Namespace的配置复用:
ConfigMap可以被多个Pod或跨Namespace的Pod共享和复用,从而简化了配置管理的复杂性。

3、配置文件管理
配置文件存储:
ConfigMap可以用来存储应用程序的配置文件,如应用程序的配置文件、环境变量文件等。这些文件可以被挂载到Pod中,以便应用程序在启动时读取。
配置文件动态更新:
与静态配置文件相比,ConfigMap允许在运行时动态地更新配置文件。这意味着当配置文件发生变化时,无需重新构建或重启应用程序即可应用新的配置。

4、环境变量与命令行参数
环境变量注入:
ConfigMap中的数据可以被注入到Pod的环境变量中,以便应用程序在运行时使用。这种方式使得配置数据可以独立于应用程序代码进行管理,提高了配置的灵活性和可维护性。
命令行参数传递:
除了环境变量外,ConfigMap中的数据还可以作为命令行参数传递给应用程序。这允许应用程序在启动时根据配置数据调整其行为。

5、安全性与合规性
敏感信息隔离:
虽然ConfigMap通常用于存储非敏感的配置数据,但为了避免敏感信息泄露的风险,应将敏感信息(如密码、密钥等)存储在Kubernetes的Secret对象中,而不是ConfigMap中。这种分离管理的方式提高了系统的安全性。
合规性要求:
在某些情况下,合规性要求可能需要对配置数据进行加密或限制访问。通过使用Kubernetes的RBAC(基于角色的访问控制)和其他安全机制,可以确保只有授权用户才能访问和修改ConfigMap中的数据。

四、Configmap局限性

大小限制:单个ConfigMap的大小有限制(通常为1MB),因此不适合存储大数据量的配置。
命名空间限制:ConfigMap是命名空间资源,只能由同一命名空间中的Pod访问和装载。
非机密性:ConfigMap专门用于存储非机密数据。对于机密数据(如密码、令牌),应使用Kubernetes的Secret对象进行存储。

五、Configmap创建方法

(1) 使用kubectl create configmap命令创建

查看帮助命令

kubectl create configmap --help
Examples:
  # Create a new config map named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new config map named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new config map named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

  # Create a new config map named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new config map named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env

基于字面值创建
使用–from-literal选项,可以直接在命令行中指定键值对来创建ConfigMap。例如:

kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2

查看创建好的configmap
kubectl get cm

NAME               DATA   AGE
my-config          2      6s

查看详细信息
kubectl describe cm my-config

Name:         my-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
key2:
----
value2
key1:
----
value1

BinaryData
====

Events:  <none>

删除configmap
kubectl delete cm my-config

(2) 基于文件创建

可以使用–from-file选项,从单个文件或多个文件中创建ConfigMap。例如:

kubectl create configmap my-config-file --from-file=config.file

或者从目录中的多个文件创建:

kubectl create configmap my-config-dir --from-file=./config-directory/

还可以指定文件中的键名,如果不指定则默认为文件名:

kubectl create configmap my-config-file-with-key --from-file=mykey=config.file

(3) 基于环境变量文件创建

kubectl create configmap my-config-env --from-env-file=env.file

(4) 使用YAML文件定义并创建

除了使用命令行工具外,还可以通过编写YAML文件来定义ConfigMap,并使用kubectl apply或kubectl create命令将其应用到Kubernetes集群中。例如:

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-config-yaml  
data:  
  key1: value1  
  key2: value2

然后执行以下命令创建ConfigMap
kubectl apply -f configmap.yaml

六、ConfigMap的使用方法

(1) 通过环境变量引入:使用configMapKeyRef

(1) 创建ConfigMap
创建了一个ConfigMap,名为my-config,它包含了一些键值对:

kubectl create configmap my-config --from-literal=APP_NAME=myapp --from-literal=DB_HOST=example.com --from-literal=DB_PORT=5432

(2) 创建Pod并注入环境变量
创建一个Pod,并将my-config ConfigMap中的DB_HOST和DB_PORT键值对作为环境变量注入到Pod的容器中。

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
  - name: my-container  
    image: my-image  
    env:  
    - name: DATABASE_HOST  
      valueFrom:  
        configMapKeyRef:  
          name: my-config  
          key: DB_HOST  
    - name: DATABASE_PORT  
      valueFrom:  
        configMapKeyRef:  
          name: my-config  
          key: DB_PORT

在这个YAML文件中,env字段定义了一个环境变量列表。每个环境变量都使用valueFrom字段来指定其值来源于一个ConfigMap键值对。configMapKeyRef子字段指定了ConfigMap的名称(name: my-config)和要引用的键(key: DB_HOST或key: DB_PORT)。

(3) 应用Pod定义
使用kubectl apply命令应用Pod定义:
kubectl apply -f my-pod.yaml

(4) 验证环境变量
Pod启动后,通过执行kubectl exec命令进入Pod的容器,并使用env或printenv命令来验证环境变量是否已正确注入:
kubectl exec -it my-pod – env | grep DATABASE_

结果:
DATABASE_HOST=example.com
DATABASE_PORT=5432

(2) 环境变量引入:使用envfrom

(1) 创建 ConfigMap
首先,创建一个 ConfigMap,名为 my-config,包含一些键值对:

kubectl create configmap my-config --from-literal=APP_NAME=myapp --from-literal=DB_HOST=example.com --from-literal=DB_PORT=5432

(2) 创建 Pod 并使用 envFrom 注入环境变量
现在,创建一个 Pod,并使用 envFrom 将 my-config ConfigMap 中的所有键值对作为环境变量注入到 Pod 的容器中。

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod-with-envfrom  
spec:  
  containers:  
  - name: my-container  
    image: my-image  
    envFrom:  
    - configMapRef:  
        name: my-config

在这个 YAML 文件中,envFrom 字段指定了一个 ConfigMap 引用(configMapRef),它告诉 Kubernetes 将 my-config ConfigMap 中的所有键值对作为环境变量注入到 my-container 容器中。

(3) 应用 Pod 定义
kubectl apply -f my-pod-with-envfrom.yaml

(4) 验证环境变量
Pod 启动后,你可以通过执行 kubectl exec 命令进入 Pod 的容器,并使用 env 或 printenv 命令来验证环境变量是否已正确注入:

kubectl exec -it my-pod-with-envfrom – env | grep -E ‘APP_NAME|DB_HOST|DB_PORT’

结果:
APP_NAME=myapp
DB_HOST=example.com
DB_PORT=5432
这表明 my-config ConfigMap 中的所有键值对已成功作为环境变量注入到 Pod 的容器中。

(3)把configmap做成volume,挂载到pod

(1) 创建ConfigMap的YAML文件
首先,创建一个名为my-config.yaml的文件,内容如下:

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-config  
data:  
  config-key1: value1  
  config-key2: value2

(2) 应用ConfigMap的YAML文件
使用kubectl apply命令来创建ConfigMap:
kubectl apply -f my-config.yaml

(3)创建Pod的YAML文件
创建一个名为my-pod-with-configmap-volume.yaml的文件,内容如下:

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod-with-configmap-volume  
spec:  
  containers:  
  - name: my-container  
    image: my-image  # 替换为你的实际镜像  
    volumeMounts:  
    - mountPath: "/etc/config"  
      name: config-volume  
  volumes:  
  - name: config-volume  
    configMap:  
      name: my-config

(4)应用Pod的YAML文件
使用kubectl apply命令来创建Pod:
kubectl apply -f my-pod-with-configmap-volume.yaml

(5) 验证挂载
Pod启动后,你可以通过执行kubectl exec命令进入Pod的容器,并使用ls和cat等命令来验证ConfigMap是否已成功挂载到指定的路径:
kubectl exec -it my-pod-with-configmap-volume

ls /etc/config

config-key1
config-key2

查看文件的内容
cat /etc/config/config-key1
value1

这表明my-configConfigMap中的键值对已成功作为文件挂载到Pod的/etc/config目录中,并且文件内容与ConfigMap中的值相匹配。

七、Configmap热更新

ConfigMap热更新是Kubernetes中一个非常实用的功能,它允许在不重启Pod的情况下更新应用程序的配置

Env变量不会同步更新:如果你将ConfigMap用作环境变量注入到Pod中,那么更新ConfigMap后,这些环境变量不会自动更新。你需要重启Pod才能使新的配置生效。

卷同步延迟:虽然Kubernetes会尝试尽快将ConfigMap的更改同步到Pod中的卷,但这个过程可能会有一定的延迟。在实际应用中,这个延迟通常是可接受的,但在某些对配置更改非常敏感的场景下,可能需要考虑其他同步机制。

应用程序处理:最后,需要注意的是,即使ConfigMap的更改已经同步到Pod中的卷,应用程序也需要能够处理这些更改。例如,一些应用程序可能需要重新加载配置文件或重新启动服务才能使新的配置生效。因此,在开发应用程序时,需要考虑到这一点,并编写相应的代码来处理配置更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值