问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kubernetes中ConfigMap的配置管理详解

创作时间:
作者:
@小白创作中心

Kubernetes中ConfigMap的配置管理详解

引用
CSDN
1.
https://blog.csdn.net/be_racle/article/details/140753531

在Kubernetes中,ConfigMap是一种用来存储配置信息的资源对象。它采用明文方式将所有配置信息存储在ETCD中,并提供了一种灵活且安全的方式来管理应用的配置信息。本文将详细介绍ConfigMap的基本概念、创建方法以及在Pod中的使用方式。

Pod 的配置管理(一):ConfigMap

1.配置管理

在实际的应用开发过程中,经常会遇到需要根据不同环境(如开发环境和生产环境)使用不同配置的情况。例如,在开发Web应用时,可能需要在开发环境中连接MySQL数据库,而在生产环境中连接Redis数据库。如果不能很好地管理这些配置信息,运维工作将变得非常繁琐。

为了解决这样的问题,Kubernetes提供了自己的解决方案,它将配置信息作为一种独立的资源存入配置中心,并将其以注入的方式提供给Pod使用。如果更新了配置中心中的配置信息,则Pod会自动加载更新后的配置信息。Kubernetes主要通过ConfigMapSecret两种方式来实现配置信息的管理。

2.使用 ConfigMap 管理 Pod 的配置信息

ConfigMap是用来存储配置信息的Kubernetes资源对象。ConfigMap采用明文的方式将所有的配置信息都存储在ETCD中。在ConfigMap创建成功后,就可以在Pod中使用ConfigMap了。

2.1 创建 ConfigMap

2.1.1 在命令行中通过指定 ConfigMap 的参数进行创建

执行kubectl create configmap命令,并指定--from-literal参数。

kubectl create configmap demo-configmap1 \
--from-literal=db.host=192.168.1.2 \
--from-literal=db.port=3306 \
--from-literal=user=admin \
--from-literal=password=123456

查看创建的ConfigMap。

kubectl get configmap
kubectl get cm

查看demo-configmap1的详细信息。

kubectl describe configmap demo-configmap1

输出结果:

Name:           demo-configmap1
Namespace:      default
Labels:         <none>
Annotations:    <none>
Data
====
db.host:
----
192.168.1.2
db.port:
----
3306
password:
----
123456
user:
----
admin
Events: <none>

2.1.2 通过指定的配置文件创建 ConfigMap

创建一个存放配置文件的目录。

mkdir configmap

编辑configmap/redis.properties文件,在其中输入以下内容。

redis.host=127.0.0.1
redis.port=6379
redis.password=123456

编辑configmap/mysql.properties文件,在其中输入以下内容。

mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456

🚀 这里创建了两个配置文件:redis.propertiesmysql.properties,可以把这两个配置文件中的配置信息保存在一个ConfigMap中。

执行kubectl create configmap命令,通过指定--from-file参数创建ConfigMap。

kubectl create configmap demo-configmap2 \
--from-file=./configmap/

查看demo-configmap2的详细信息。

kubectl describe configmap demo-configmap2

输出结果:

Name:           demo-configmap2
Namespace:      default
Labels:         <none>
Annotations:    <none>
Data
====
mysql.properties:
----
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456
redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events: <none>

2.1.3 通过一个文件内的多个键值对创建 ConfigMap

执行以下命令创建env-config.txt文件。

cat << EOF >> env-config.txt
db.host=192.168.0.1
db.port=3306
user=admin
password=123456
EOF

执行kubectl create configmap命令,通过--from-env-file参数创建ConfigMap。

kubectl create configmap demo-configmap3 --from-env-file=env-config.txt

2.1.4 通过 YAML 文件创建 ConfigMap

创建config.yaml文件。

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap4
data:
  db.host: 192.168.0.200
  db.port: "3306"
  user: "admin"
  password: "123456"

执行kubectl create -f命令创建ConfigMap。

kubectl create -f config.yaml

2.2 使用 ConfigMap

成功创建ConfigMap后,就可以在Pod中使用它来实现配置信息管理。具体可以通过两种方式:环境变量数据卷 volume

2.2.1 通过环境变量直接将 ConfigMap 的配置信息传递给 Pod

创建configmap-usage01.yaml文件,使用环境变量将demo-configmap4中能db.hostdb.port分别映射到Pod容器中的HOSTPORT这两个环境变量中。

apiVersion: v1
kind: Pod
metadata:
  name: configmap-usage01
spec:
  containers:
- name: busybox
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "echo $(HOST) $(PORT)" ]
      env:
- name: HOST
          valueFrom:
            configMapKeyRef:
              name: demo-configmap4
              key: db.host
- name: PORT
          valueFrom:
            configMapKeyRef:
              name: demo-configmap4
              key: db.port
  restartPolicy: Never

使用kubectl apply -f命令创建Pod。

kubectl apply -f configmap-usage01.yaml

查看Pod的标准输出日志。

kubectl logs configmap-usage01

输出的信息如下:

192.168.0.200 3306

2.2.2 通过数据卷 volume 将 ConfigMap 的配置信息挂载到 Pod 内

具体的做法是:将ConfigMap的配置信息demo-configmap2通过数据卷挂载到容器中的/etc/config目录下,根据key在挂载目录下创建redis.properiesmysql.properties文件,文件内容是对应的values值。

创建configmap-usage02.yaml文件,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:
  name: configmap-usage02
spec:
  containers:
- name: busybox
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
- name: config-volume
        mountPath: /etc/config
  volumes:
- name: config-volume
      configMap:
        name: demo-configmap2
  restartPolicy: Never

使用kubectl apply -f命令创建Pod。

kubectl apply -f configmap-usage02.yaml

查看Pod的标准输出日志。

kubectl logs configmap-usage02

输出的信息如下:

redis.host=127.0.0.1
redis.port=6379
redis.password=123456

2.3 ConfigMap 的动态更新

在创建ConfigMap成功后,Kubernetes支持动态更新ConfigMap。ConfigMap可以通过环境变量数据卷这两种方式来使用。

  • 如果通过环境变量使用ConfigMap,则在配置信息更新后,环境变量不会同步更新
  • 如果通过数据卷使用ConfigMap,则在配置信息更新后,数据卷中的配置信息会同步更新,但有一定的延迟

下面来演示ConfigMap的动态更新。

这里以demo-configmap2为例。将ConfigMap导出为YAML文件。

kubectl get cm demo-configmap2 o yaml > demo-configmap2.yaml

demo-configmap2.yaml文件中的redis.host的值从127.0.0.1修改为localhost

apiVersion: v1
data:
  mysql.properties: |
    mysql.host=127.0.0.1
    mysql.port=3306
    mysql.password=123456
  redis.properties: |
    redis.host=localhost
    redis.port=6379
    redis.password=123456
kind: ConfigMap
metadata:
  creationTimestamp: "2022-01-28T04:00:31Z"
  name: demo-configmap2
  namespace: default
  resourceVersion: "64797"
  selfLink: /api/v1/namespaces/default/configmaps/demo-configmap2
  uid: c8382408-1b2c-4da3-b468-1ca5f88d3f02

执行kubectl apply -f命令生效demo-configmap2.yaml文件。

kubectl apply -f demo-configmap2.yaml

查看修改后的demo-configmap2

kubectl describe cm demo-configmap2

🚀 如果demo-configmap2文件以数据卷方式被Pod使用,则Pod中挂载的配置信息在经过一段时间的延迟后会自动更新。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号