千家信息网

k8s数据持久化之Secret和configMap

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前言在K8s中有Secret和configMap这两种资源对象,这也是实现数据持久化的一种方式,与之前写过的PV或挂载目录等这些数据持久化的方式有些许不一样。Secret资源对象:可以保存轻量的敏感信
千家信息网最后更新 2026年11月01日k8s数据持久化之Secret和configMap

前言

在K8s中有Secret和configMap这两种资源对象,这也是实现数据持久化的一种方式,与之前写过的PV或挂载目录等这些数据持久化的方式有些许不一样。

Secret资源对象:可以保存轻量的敏感信息,比如数据库的用户名和密码或者认证秘钥等。它保存的数据是以秘文的方式存放的

configMap资源对象:和Secret一样,拥有大多数共同的特性,但是区别是,configMap保存的是一些不太重要的信息,它保存的数据是以明文的方式存放的。

当我们创建上述两种资源对象时,其实就是将这两种资源对象存储的信息写入了k8s群集中的etcd数据中心。

一、secret和configMap的异同点

相同点:

都是用来保存轻量级信息的,可以供其他资源对象(Deployment、RC、RS和POd)进行挂载使用。

这两种资源对象的创建方法(4种)及引用方法(2种)都是一样的,都是以键值对的方式进行存储的。

不同点:

Secret是用来保存敏感信息的,而configMap是用来保存一些不太重要的数据的,具体表现在当我们执行"kubectl describe ...."命令时,Secret这种类型的资源对象时查看不到其具体的信息的,而configMap是可以查看到其保存的具体内容的。

二、Secret资源对象的四种创建方式

创建方法1(通过--from-literal的方式)

假设要存储的数据是:
name:zhangsan
tel:15888888888

[root@master ~]# kubectl create secret generic secret1 --from-literal=name=zhangsan --from-literal=tel=1588888888[root@master ~]# kubectl get secrets secret1  #查看创建的secret1NAME      TYPE     DATA   AGEsecret1   Opaque   2      89s[root@master ~]# kubectl describe secrets secret1 Name:         secret1Namespace:    defaultLabels:       Annotations:  Type:  OpaqueData====name:  8 bytes       #可以看到只能查看到其键的内容,而无法看到键对应的值tel:   10 bytes

创建方法2(通过--from-file的方式)

这种方式比方法1还要麻烦一些,不建议使用。

#需要先将要存储的键值对写入到文件中,并且每个文件只能写入一个值[root@master ~]# echo zhangsan > name[root@master ~]# echo 15888888888 > tel[root@master ~]# cat name telzhangsan15888888888[root@master ~]# kubectl create secret generic secret2 --from-file=name --from-file=tel #执行上述命令进行创建,然后使用方法1的命令自行查看即可

创建方法3(通过--from-env-file的方式)

这种方式可以在同一个文件中写入多个键值对,推荐使用。

[root@master ~]# cat > env.txt < name=zhangsan> tel=15888888888> EOF[root@master ~]# kubectl create secret generic secert3 --from-env-file=env.txt #执行上述命令即可以env.txt中的键值对存入k8s的数据中心#自行查看是否创建即可

创建方法4(通过yaml配置文件的方式)

#可以将要存储的值加密[root@master ~]# echo zhangsan | base64emhhbmdzYW4K[root@master ~]# echo 1588888888 | base64MTU4ODg4ODg4OAo=[root@master ~]# vim secret.yaml     #编写yaml文件apiVersion: v1kind: Secretmetadata:  name: secret4data:                           #下面的值是在命令行加密后的值  name: emhhbmdzYW4K  tel: MTU4ODg4ODg4OAo=[root@master ~]# kubectl apply -f secret.yaml     #执行yaml文件#可以使用下面的命令对加密字符进行解密[root@master ~]# echo -n MTU4ODg4ODg4OAo= | base64 --decode 1588888888

三、Secret的两种使用方式

既然secret的这种存储方式是无法通过命令行查看的,再一个就是,这种存储方式的意义是什么?通过下面的使用方式,应该就可以明白其使用场景了。

使用方法1(以volume挂载的方式使用secret)

[root@master ~]# vim secret-pod.yaml  #编写yaml文件,运行一个podapiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 30000  #以上字段和使用secret无关    volumeMounts:    - name: test      mountPath: /etc/test        #指定挂载到容器内的目录      readOnly: true     #这里决定了,是以只读的方式挂载的  volumes:  - name: test    secret:      secretName: secret4         #这里指定secret的名字,也就是我们使用第四种方法创建的secret[root@master ~]# kubectl apply -f secret-pod.yaml     #执行yaml文件[root@master ~]# kubectl exec -it secret-pod /bin/sh   #进入创建的容器/ # cat /etc/test/name /etc/test/tel     #查看挂载的目录下zhangsan1588888888#可以发现自动给我们解密了

现在,我们可以验证一下,如果此时更改secret4的内容,那么容器内对应的挂载目录下的内容是否更改?

[root@master ~]# echo lisi | base64bGlzaQo=[root@master ~]# echo 1599999999 | base64MTU5OTk5OTk5OQo=[root@master ~]# vim secret.yaml      #修改其内容apiVersion: v1kind: Secretmetadata:  name: secret4data:  name: bGlzaQo=  tel: MTU5OTk5OTk5OQo=[root@master ~]# kubectl apply -f secret.yaml     #重新执行yaml文件[root@master ~]# kubectl exec -it secret-pod /bin/sh   #再次进入容器/ # cat /etc/test/name /etc/test/tel     #可以看到容器内的数据也随之改变了lisi1599999999

使用方法2(以环境变量的方式使用secret)

[root@master ~]# vim secret-pod.yaml      #编写yaml文件apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 30000    env:          #设置环境变量,这里调用secert3存储的值      - name: SECRET_NAME   #容器内的变量名        valueFrom:          secretKeyRef:            name: secert3         #指定调用的是secert3            key: name                   #调用的是secert3的name对应的值      - name: SECRET_TEL          #这里的SECRET_TEL同上        valueFrom:          secretKeyRef:            name: secert3            key: tel[root@master ~]# kubectl delete -f secret-pod.yaml  #删除之前的pod[root@master ~]# kubectl apply -f secret-pod.yaml     #重新生成pod#进入容器,输出对应的变量[root@master ~]# kubectl exec -it secret-pod /bin/sh/ # echo $SECRET_NAMEzhangsan/ # echo $SECRET_TEL15888888888

至此,以变量的形式引用secert存储的键值对就调用完成了,同样也可以去测试修改secert存储的值,看看pod容器中的变量是否会随之改变,答案是否定的,如果采用变量的方式调用secert存储的值,容器内的变量值并不会随着secert存储的值发生改变,除非重新生成pod。

四、configMap资源对象的四种创建方式

其实configMap和secert资源对象的创建方式完全一样,这里就写下"--from-literal"、"--from-env-file"和"yaml文件"这三种创建方式,至于"--from-file"的创建方式,参考secert的创建方式即可。

创建方法1(通过--from-literal的方式)

[root@master ~]# kubectl create configmap config1 --from-literal=name=lisi --from-literal=age=18#存储名称为config1的键值对[root@master ~]# kubectl describe configmaps config1   #查看创建的config1Name:         config1Namespace:    defaultLabels:       Annotations:  #可以很明确的看到其中保存的数据,所以它用来存储一些不太重要的数据Data====age:----18name:----lisiEvents:  

创建方法2(通过--from-env-file的方式)

[root@master ~]# cat > config.txt < name=lisi> age=18> EOF[root@master ~]# kubectl create configmap configmap2 --from-env-file=config.txt #执行命令

创建方法3(通过yaml配置文件的方式)

[root@master ~]# vim configmap3.yaml #编写yaml文件apiVersion: v1kind: ConfigMapmetadata:  name: configmap3data:  name: lisi  age: '18'       #如果值为数字,则必须要用单引号引起来[root@master ~]# kubectl apply -f configmap3.yaml     #执行yaml文件

五、configMap数据的两种引用方式

应用方式和secert资源对象的方式类似,都是volume挂载或者以变量的方式引用,只是一些yaml文件中的一些关键字不一样。

引用方法1(通过volume挂载)

[root@master ~]# kubectl delete -f secret-pod.yaml    #删除之前创建的pod[root@master ~]# vim secret-pod.yaml     #修改yaml文件apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 30000   #这上面没有改变    volumeMounts:    - name: test      mountPath: /mnt    #挂载到容器的mnt目录      readOnly: true  volumes:  - name: test    configMap:             #这里的关键字不一样      name: configmap3         #挂载的是configmap3[root@master ~]# kubectl apply -f secret-pod.yaml      #执行yaml文件[root@master ~]# kubectl exec -it secret-pod /bin/sh  #进入容器/ # cat /mnt/name /mnt/age    #查看挂载的内容lisi18/ # (由于使用的容器有些特殊,所以输出格式上有些不太直观,但是数据是没错的)

同样,这种volume挂载的方式,pod容器内的数据会随着configmap3的数据改变而改变,它们共享的是同一个文件。

引用方法2(通过配置env环境变量)

[root@master ~]# kubectl delete -f secret-pod.yaml    #删除之前创建的pod[root@master ~]# vim secret-pod.yaml         #修改yaml文件apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 30000    env:           #定义环境变量,这里使用的是创建的configmap        2的键值对内容      - name: USER_NAME        valueFrom:          configMapKeyRef:            name: configmap2            key: name      #调用configmap2中的name的值      - name: USER_AGE        valueFrom:          configMapKeyRef:            name: configmap2            key: age      #调用configmap2中的age的值[root@master ~]# kubectl apply -f secret-pod.yaml [root@master ~]# kubectl exec -it secret-pod /bin/sh    #进入容器输出环境变量/ # echo $USER_NAMElisi/ # echo $USER_AGE18

这里测试一下,如果修改configmap2的键值对,容器内的环境变量是否会发生改变?

[root@master ~]# vim config.txt    #修改configmap2的值name=wangwuage=28[root@master ~]# kubectl delete configmaps     #需要先删除[root@master ~]# kubectl create configmap configmap2 --from-env-file=config.txt       #再创建[root@master ~]# kubectl exec -it secret-pod /bin/sh #进入容器输出变量,可以看到变量没有改变/ # echo $USER_AGE18/ # echo $USER_NAMElisi

那么,现在重新生成下pod,查看其环境变量是否会改变(肯定会改变的)?

[root@master ~]# kubectl delete -f secret-pod.yaml   #删除pod[root@master ~]# kubectl apply -f secret-pod.yaml      #重新生成pod[root@master ~]# kubectl exec -it secret-pod /bin/sh   #进入容器查看环境变量,发现已经改变了/ # echo $USER_NAMEwangwu/ # echo $USER_AGE28

至此,验证完成。

-------- 本文至此结束,感谢阅读 --------

方式 文件 容器 数据 变量 方法 存储 对象 资源 命令 环境 信息 内容 目录 生成 输出 重要 使用方法 至此 面的 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技平台互联网 科技创新互联网企业 互联网金融和金融科技 深圳市运趣互联网科技有限公司 广州慧亚互联网科技怎么样 阿里巴巴算科技企业还是互联网 互联网教育科技公司vipkid 消费医药和互联网科技 东莞新华互联网科技学校 西安小鹰速贷互联网科技有限公司 特约风豹互联网科技为什么扣费 中和天地互联网科技有限公司 合肥互联网科技公司公章图片 元气玛特互联网科技公司是外包吗 富国互联网金融科技混合基金 卡尔迅互联网科技有限公司 悟空问答互联网科技 马化腾互联网科技教学 互联网科技品牌 互联网领先科技成果宣传视频 国智互联网科技 美国互联网保险保险科技 互联网金融监管科技数据 科技互联网项目 互联网络科技有限公司 广州互联网科技公司 新华互联网科技校企合作 宁夏科技产业互联网案例 华夏恒生互联网科技013171 爱医互联网络科技
0