k8s configmap和secret详解
一、ConfigMap
1、为什么需要configmap?
-
解耦配置和镜像
-
配置不打包进镜像,同一个镜像在开发/测试/生产环境复用
-
修改配置无需重新构建镜像,推送,拉取
-
配置是配置,镜像是镜像,互不干扰
-
-
集中管理
- 多个deploy共享同一个configmap,减少了重复配置
-
灵活注入
- 支持环境变量,命令行参数,配置文件挂载三种方式
-
动态更新
- 文件挂载的方式下,更新configmap后容器内文件会自动同步
2、核心特性
ConfigMap(配置映射) 是 Kubernetes (K8s) 中用于存储非敏感配置数据的核心 API 对象,本质是键值对(Key-Value)集合。它的核心作用是将应用程序的配置与容器镜像解耦,实现配置独立管理、动态更新
用途:存储非机密数据(如日志级别、服务地址、配置文件内容)
作用域:namespace级别
存储结构:
-
data: 存储utf-8字符串(键值对/文件内容)
-
binarydata:存储base64编码的二进制数据
3、创建configmap方式
1、命令行创建
- kubectl create configmap --help 可以查看帮助案例
# --from-literal=key=value
[root@master01 ~]# kubectl create configmap cm1 --from-literal=name1=qqq
configmap/cm1 created
[root@master01 ~]# kubectl get cm
NAME DATA AGE
cm1 1 2s
kube-root-ca.crt 1 16d
# key-value形式的数据
[root@master01 ~]# kubectl describe configmaps cm1
Name: cm1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
name1: # 键
----
qqq # 文件的内容
BinaryData
====
Events: <none>
2、从文件里面创建
键是文件名,值是文件里面的内容
# 文件
[root@master01 cm]# cat name2
qweqweq
# 从文件里面创建
[root@master01 cm]# kubectl create configmap cm2 --from-file=name2
configmap/cm2 created
[root@master01 cm]# kubectl describe cm cm2
Name: cm2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
name2:
----
qweqweq # 值是文件的内容
BinaryData
====
Events: <none>
3、环境变量
- 文件里面的key=value这个形式的,不能使用:
[root@master01 cm]# cat 1.txt
name1=qqq
name2=www
name3=iii
[root@master01 cm]# kubectl create configmap cm3 --from-env-file=1.txt
configmap/cm3 created
[root@master01 cm]# kubectl describe configmaps cm3
Name: cm3
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
name1:
----
qqq
name2:
----
www
name3:
----
iii
BinaryData
====
Events: <none>
4、yaml文件创建
[root@master01 cm]# cat cm4.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm4
namespace: default
data:
port: "8080"
log_level: "info"
nginx.conf: |
server {
root /etc;
index html;
} # 这个缩进必须跟server对齐,否则这个yaml会报错的
在yaml文件里面使用| 意思就是表示长文本,非常常用的
[root@master01 cm]# kubectl describe cm cm4
Name: cm4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
port:
----
8080
log_level:
----
info
nginx.conf: # nginx.conf这个key
----
server { # 下面这个是内容
root /etc;
index html;
}
BinaryData
====
Events: <none>
4、使用configmap方式
1、通过卷的方式挂载(常用的)
卷挂载的话,就是键在pod里面是文件名的形式存储,值就是文件的内容
[root@master01 cm]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
- image: nginx:1.25
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
volumeMounts:
- name: cm4
mountPath: /mnt/ # 挂载mnt目录下
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes: # 卷
- name: cm4
configMap: # 使用的是configmap
name: cm4
# 进入pod
# 发现key是以文件的形式存储,值是文件的内容
[root@master01 cm]# kubectl exec -ti pod1 -- /bin/bash
root@pod1:/mnt# ls
log_level nginx.conf port
root@pod1:/mnt# cat nginx.conf
server {
root /etc;
index html;
}
2、通过变量的方式使用
通过环境变量注册到pod里面
[root@master01 cm]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
- image: nginx:1.25
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
env:
- name: env1 # 变量名 key,随便定义
valueFrom: # 值来自于这个configmap中的key对应的值
configMapKeyRef:
name: cm4 # 来自于这个cm4
key: log_level # cm4中log_level这个key对应的值
# 进入容器查看
[root@master01 cm]# kubectl exec -ti pod1 -- /bin/bash
root@pod1:/# echo $env1
info
二、secret
1、secret是什么呢?
k8s里面一种资源,存键值对的
用途:存放敏感的配置
-
数据库密码
-
账号密码
-
token,api key
-
tls证书,私钥
默认做了Base64编码(不是加密,但比明文安全一点)
可以挂载成文件、注入成环境变量
和 ConfigMap 的区别一句话:
普通配置用 ConfigMap,密码密钥用 Secret
2、常见的secret类型
k8s内置了几种常用类型,方便直接用:
-
Opaque 默认类型,通用密钥、密码、任意键值对。
-
kubernetes.io/dockerconfigjson存放镜像仓库(Docker Registry)的登录凭证,拉取私有镜像用。
-
kubernetes.io/basic-auth基础认证账号密码。
3、创建secret的方式
操作跟上面的configmap都是类似的
1、命令行创建
# key=value这样的形式
[root@master01 secret]# kubectl create secret generic s1 --from-literal=name1=aa1
secret/s1 created
[root@master01 secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-8mmjz kubernetes.io/service-account-token 3 17d
nfs-client-provisioner-token-wz2q8 kubernetes.io/service-account-token 3 47h
s1 Opaque 1 5s
[root@master01 secret]# kubectl describe secret s1
Name: s1
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque # 基于base64密钥进行解密和加密
Data
====
name1: 3 bytes
显示解密后的密钥
[root@master01 secret]# kubectl get secret s1 -o yaml
apiVersion: v1
data:
name1: YWEx # base64加密后的
kind: Secret
metadata:
creationTimestamp: "2026-04-10T13:58:50Z"
name: s1
namespace: default
resourceVersion: "183263"
uid: c8d7fc39-9ed1-4ad8-afe8-38ea75f8ac32
type: Opaque
# 使用base64进行解密,得到原数据
[root@master01 secret]# echo -n YWEx | base64 -d
aa1[root@master01 secret]#
2、文件的方式
文件名是key,内容是值
[root@master01 secret]# echo redhat >> name2
[root@master01 secret]# kubectl create secret generic s2 --from-file=name2
[root@master01 secret]# kubectl get secret s2 -o yaml
apiVersion: v1
data:
name2: cmVkaGF0Cg== # key是文件名,值是内容
kind: Secret
metadata:
creationTimestamp: "2026-04-10T14:02:58Z"
name: s2
namespace: default
resourceVersion: "183792"
uid: cc7bccec-b438-459e-a2f7-110d04d65902
type: Opaque
3、环境变量的方式
文件内容是key=value
[root@master01 secret]# cat name3
name3=aaa
[root@master01 secret]# kubectl create secret generic s3 --from-env-file=name3
secret/s3 created
4、通过yaml文件生成
# 加密字符串
[root@master01 ~]# echo -n "admin" |base64
YWRtaW4=
[root@master01 secret]# cat name4.yml
apiVersion: v1
kind: Secret
metadata:
name: s5
data:
name5: YWRtaW4= # 这里需要填写base64加密后的字符
4、使用secret方式
1、卷使用secret
将这个secret挂载到容器里面
在pod里面存在的方式就是,文件名是key,内容是值
[root@master01 secret]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
volumes:
- name: s5
secret: # 使用secret作为卷
secretName: s5
containers:
- image: nginx:1.25
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
volumeMounts:
- name: s5
mountPath: /s5 # 挂载到容器这个目录下面
# 文件名是key,内容是值
root@pod1:/s5# cat name5
adminroot@pod1:/s5#
2、环境变量使用secret
[root@master01 secret]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
- image: nginx:1.25
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
env:
- name: s5 # key
valueFrom:
secretKeyRef:
name: s5 # 值来自于这个secret的key对应的value
key: name5 # key的值来自于这个name5的值
[root@master01 secret]# kubectl exec -ti pod1 -- /bin/bash
root@pod1:/# echo $s5
admin
创建一个mysql容器,密码使用secret保存
[root@master01 secret]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
nodeName: node
containers:
- image: mysql
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
env:
- name: MYSQL_ROOT_PASSWORD # mysql的root密码
valueFrom:
secretKeyRef:
name: s5
key: name5 # 来自于这个secret的key的value的值
root@master01 secret]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-5cf5744c5f-78svw 1/1 Running 7 47h 10.246.73.163 node <none> <none>
pod1 1/1 Running 0 48s 10.246.73.172 node <none> <none>
# 登录数据库
[root@master01 secret]# mysql -uroot -padmin -h 10.246.73.172
三、实验
1、使用configmap配置nginx目录
-
默认路径修改/web/index.html
-
多个pod使用这个configmap

浙公网安备 33010602011771号