系列文章
第一章:✨ k8s入门:裸机部署 k8s 集群
第二章:✨ k8s入门:部署应用到 k8s 集群
第三章:✨ k8s入门:service 简单使用
第四章:✨ k8s入门:StatefulSet 简单使用
第五章:✨ k8s入门:存储(storage)
第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
第七章:✨ k8s入门:配置 ConfigMap & Secret
第八章:✨ k8s入门:k8s入门:Helm 构建 MySQL
第九章:✨ k8s入门:kubernetes-dashboard 安装
第十章:✨ k8s入门:kube-prometheus-stack 全家桶搭建(Grafana + Prometheus)
一、ConfigMap
1、概念
-
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。
-
ConfigMap 将你的环境配置信息和容器镜像 解耦,便于应用配置的修改。
-
很多应用在其初始化或运行期间要依赖一些配置信息, 存在要调整配置参数所设置的数值的需求,ConfigMap 可以向 Pod 中注入配置数据。
-
ConfigMap 不提供保密或者加密功能,加密数据可以使用 Secret 或其他第三方工具。
-
ConfigMap 中保存的数据不可超过 1 MiB。
-
ConfigMap 使用 data 和 binaryData 字段。这些字段能够接收键-值对作为其取值。data 和 binaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。
详细用法参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/
2、通过命令行创建
使用 `kubectl create configmap --help` 查看命令行详细参数例子:
- 通过文件夹创建:其中文件名为 key,文件内容为 value
# /root/configmap/dir 为文件夹
kubectl create configmap dir-config --from-file=/root/configmap/dir
# /root/configmap/file/test.txt 为文件名
kubectl create configmap file-config --from-file=/root/configmap/file/test.txt
- 通过文件创建:其中 key 为 key1、key2,value 为文件内容
kubectl create configmap file-config --from-file=key1=/root/configmap/file/file1.txt --from-file=key2=/root/configmap/file/file2.txt
- 通过键值对创建:key1=config1 、 key2=config2,特殊字符($,\,* 等)需要转义,最简单方法使用单引号
kubectl create configmap key-config --from-literal=key1=config1 --from-literal=key2=config2
- env 文件本身就是键值对形式文件,所以 configmap 的 key 对应 env 文件的 key,value 对应 env 文件的 value
kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env
简单测试:利用 env 创建 configmap
[root@master configmap]# cat file/config1.env
id=1
name=admin
[root@master configmap]# cat file/config2.env
password=123456
[root@master configmap]# kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env
configmap/env-config created
[root@master configmap]# kubectl get cm
NAME DATA AGE
env-config 3 25s
[root@master configmap]# kubectl describe cm/env-config
Name: env-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
name:
----
admin
password:
----
123456
id:
----
1
BinaryData
====
Events: <none>
3、通过 yaml 文件创建
配置文件 /root/configmap/yaml/config.yaml,注意: data 字段类型 UTF-8 字符串, binaryData 二进制数据作为 base64 编码的字串
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
data:
id: "001"
name: admin
password: "123456"
binaryData:
address: 6KW/5a6J # 西安
date: MjAyMi82LzIx # 2022/6/21
部署 configmap
[root@master configmap]# kubectl apply -f yaml/config.yaml
configmap/yaml-config created
[root@master configmap]# kubectl describe cm/yaml-config
Name: yaml-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
id:
----
001
name:
----
admin
password:
----
123456
BinaryData
====
address: 6 bytes
date: 9 bytes
Events: <none>
4、不可变更的 ConfigMap
Kubernetes v1.21 新增特性 Immutable=true 设置 Secret 和 ConfigMap 为不可变更的选项,禁止更改 ConfigMap 的数据有以下好处
- 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
- 通过大幅降低对 kube-apiserver 的压力提升集群性能, 这是因为系统会关闭对已标记为不可变更的 ConfigMap 的监视操作。
配置文件 /root/configmap/yaml/immutable-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: immutable-config
data:
id: "002"
name: admin
password: "123456"
immutable: true
创建 configmap
[root@master configmap]# vi yaml/immutable-config.yaml
[root@master configmap]# kubectl apply -f yaml/immutable-config.yaml
configmap/immutable-config created
[root@master configmap]# kubectl get cm
NAME DATA AGE
immutable-config 3 11s
[root@master configmap]# vi yaml/immutable-config.yaml # 修改配置文件的值
[root@master configmap]# kubectl apply -f yaml/immutable-config.yaml # 重新创建包如下错误,保证不可变更
The ConfigMap "immutable-config" is invalid: data: Forbidden: field is immutable when `immutable` is set
一旦 ConfigMap 被标记为不可变更,则无法逆转这一变化,也无法更改 data 或 binaryData 字段的内容,只能删除并重建 ConfigMap。
5、 Pod 使用 ConfigMap
有以下四种方式来使用 ConfigMap 配置 Pod 中的容器:
- 在容器命令行参数内
- 容器的环境变量
- 使用 volume 挂载
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据,只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新。
①、命令行参数(容器环境变量)
/root/configmap/yaml/alpine-config.yaml
apiVersion: v1
kind: Pod
metadata:
name: alpine-configmap-pod
spec:
containers:
- name: alpine-configmap-pod-container
image: alpine
# linux 获取某个环境变量值 echo ${环境变量}
# sleep 20 保证存活 20 s
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2) && sleep 20"]
env:
# 定义环境变量
- name: KEY1 # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: alpine-config # 这个值来自 ConfigMap
key: text1 # 需要取值的键
- name: KEY2
valueFrom:
configMapKeyRef:
name: alpine-config

本文深入介绍了Kubernetes中的ConfigMap和Secret的用途、创建方法及在Pod中的使用方式,包括命令行创建、yaml文件创建、通过kustomize生成,并探讨了它们在应用配置和安全管理中的角色。ConfigMap用于存储非敏感配置信息,Secret则用于保存敏感数据,如密码和密钥。此外,还介绍了如何通过volume挂载和环境变量将它们注入到容器中。
最低0.47元/天 解锁文章
1572

被折叠的 条评论
为什么被折叠?



