【Kubernetes】配置管理(一):ConfigMap

当镜像制作完成后被用来创建 Pod 时,如果需要修改镜像中的一些参数值则比较麻烦 —— 需要重新制作镜像。能否让镜像根据实际的需要,自动读取相应的配置信息呢?这时就需要使用到 Kubernetes 的配置管理。

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 中挂载的配置信息在经过一段时间的延迟后会自动更新。

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G皮T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值