joeの小窝

Loading...

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

posted @ 2026-04-10 21:42  乔的港口  阅读(25)  评论(0)    收藏  举报