《Pod 详解》系列,共包含以下几篇文章:
- Pod 的概念、使用方法、容器类型
- Pod 的生命周期(一):Pod 阶段与状况、容器的状态与重启策略
- Pod 的生命周期(二):Pod 的健康检查之容器探针
- Pod 状态速查表
- Pod 的调度策略
- Pod 资源调度之亲和性调度
- Pod 驱逐
- Pod 的配置管理(一):ConfigMap
- Pod 的配置管理(二):Secret
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
Pod 的配置管理(一):ConfigMap
当镜像制作完成后被用来创建 Pod 时,如果需要修改镜像中的一些参数值则比较麻烦 —— 需要重新制作镜像。能否让镜像根据实际的需要,自动读取相应的配置信息呢?这时就需要使用到 Kubernetes 的配置管理。
1.配置管理
在实际的应用开发过程会遇到这样的情况:在开发 Web 应用时,在开发环境中需要连接 MySQL 数据库;而在生产环境中需要连接 Redis 数据库,这是两套相互独立的环境。这就需要为应用指定不同的参数来满足实际的要求。如果不能很好地管理这些配置信息,则运维工作将变得无比烦琐。
为了解决这样的问题,Kubernetes 提供了自己的解决方案,它将配置信息作为一种独立的资源存入配置中心,并将其以 注入 的方式提供给 Pod 使用。如果更新了配置中心中的配置信息,则 Pod 会自动加载更新后的配置信息。Kubernetes 主要通过 ConfigMap 和 Secret 两种方式来实现配置信息的管理。
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.properties
和mysql.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.host
和db.port
分别映射到 Pod 容器中的HOST
和PORT
这两个环境变量中。
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.properies
和 mysql.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 中挂载的配置信息在经过一段时间的延迟后会自动更新。