千家信息网

k8s之安全信息(Secret)及配置信息(ConfigMa

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,Secretsecret也是k8s中的一个资源对象,主要用于保存轻量的敏感信息,比如数据库用户名和密码,令牌,认证密钥等。我们可以将这类敏感信息放在secret对象中,如果把它们暴露到镜像或者pod
千家信息网最后更新 2025年12月03日k8s之安全信息(Secret)及配置信息(ConfigMa

Secret

  • secret也是k8s中的一个资源对象,主要用于保存轻量的敏感信息,比如数据库用户名和密码,令牌,认证密钥等。

  • 我们可以将这类敏感信息放在secret对象中,如果把它们暴露到镜像或者pod spec中稍显不妥,将其放在secret对象中可以更好地控制及使用,并降低意外暴露的风险。
    Secret可以使用volume或者环境变量的方式来使用这些轻量级数据。

Secret有三种类型:

Service Account:用来访问kubernetes API,由k8s自动创建,并且会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。Opaque:base64编码格式的Secret,用来存储密码,密钥等。kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

secret可以通过命令行或YAML文件来创建,假设我们需要存放在secret对象中的信息:

1, 用户名:root
2,密码:123456

1,创建Secret

创建Secret有以下四种方法:
1.1 通过--from-literal(以文字的方法创建)

[root@master ~]# kubectl  create secret generic mysecret --from-literal=username=root --from-literal=password=123456secret/mysecret created

//查看创建的secret:

//查看该secret的详细信息:

特点:每个--from-literal只能对应一条信息。比较繁琐。

1.2 通过--from-file(以文件的方式创建)

[root@master ~]# echo root > username[root@master ~]# echo 123456 > password[root@master ~]# kubectl create secret  generic newsecret --from-file=username --from-file=passwordsecret/newsecret created

//查看创建的secret:

[root@master ~]# kubectl  get  secrets  | grep newsecretnewsecret             Opaque                                2      64s

特点:同样是每个文件对应一条信息。每个文件中只能保存一个,为了保证机密性,导入后有必要将本地的文件删除掉。

1.3 通过--from-env-file(以变量的方式创建)

[root@master ~]# cat > env.txt < username=root> password=123456> EOF
[root@master ~]# kubectl  create secret generic env-secret --from-env-file=env.txtsecret/env-secret created

特点:可以在文件里面保存多条信息,文件env.txt中每条key=value对应一条信息条目。

1.4 通过yaml配置文件:
#文件中的敏感数据必须是通过 base64 编码后的结果。

[root@master ~]# echo root | base64cm9vdAo=[root@master ~]# echo 123456 | base64MTIzNDU2Cg==

#编写yaml文件:

apiVersion: v1kind: Secretmetadata:  name: secret-appdata:       #该字段为存放数据的字段,与其他资源对象不同,没有spec字段。  username: cm9vdAo=  password: MTIzNDU2Cg==

//创建secert:

[root@master ~]# kubectl apply -f  secret.yaml secret/secret-app created

//反向解析加密数据:

[root@master ~]# echo -n  cm9vdAo= | base64 --decoderoot[root@master ~]# echo -n MTIzNDU2Cg== | base64  --decode123456

特点:便于保存,跨主机使用时会非常方便。

2,如何使用secret

一,以volume方式使用secret:
pod通过volume的方式使用secret:
pod的配置文件如下所示:

apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 3000    volumeMounts:    - name: foo      mountPath: /etc/foo      readOnly: true  volumes:  - name: foo    secret:      secretName: secret-app

(1)定义volume foo,来源为secret(secret-app)
(2)将foo mount到容器路径/etc/foo,可指定读写权限为readOnly。

//创建pod并在容器中读取secret:

[root@master secret]# kubectl apply -f  secret-pod.yaml pod/secret-pod created[root@master secret]# kubectl  exec  -it secret-pod /bin/sh/ # cd /etc/foo//etc/foo # lspassword  username/etc/foo # cat password 123456/etc/foo # cat username root

可以看到,k8s会在指定路径/etc/foo下为每条敏感数据创建一个文件,文件名就是数据条目的key,这里是/etc/foo/username和/etc/foo/password,value则以铭文存放在文件中。

(2)我们也可以自定义存放数据的文件名,完整的配置文件如下:

apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 3000    volumeMounts:    - name: foo      mountPath: /etc/foo      readOnly: true  volumes:  - name: foo    secret:      secretName: secret-app      items:      - key: username:        path: my-group/my-username      - key: password        path: my-group/my-password

这时数据分别存放在/etc/foo/my-group/my-username和/etc/foo/my-group/my-password中。
//验证数据存放位置:

[root@master secret]# kubectl  delete -f secret-pod.yaml pod "secret-pod" deleted[root@master secret]# kubectl apply -f  secret-pod.yaml pod/secret-pod created
[root@master secret]# kubectl  exec  -it secret-pod /bin/sh/ # cd /etc/foo//etc/foo # lsmy-group/etc/foo # cd my-group//etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-password 123456/etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-username root

(3)以volume方式使用secret支持动态更新:secret更新后,容器中的数据也会更新。
//我们有需求将password更新为"123456.com"

[root@master secret]# echo 123456.com | base64MTIzNDU2LmNvbQo=

修改secret配置文件:

apiVersion: v1kind: Secretmetadata:  name: secret-appdata:  username: cm9vdAo=  password: MTIzNDU2LmNvbQo=

//更新secret:

[root@master secret]# kubectl apply -f  secret.yaml secret/secret-app configured

//验证password是否更新成功:

[root@master secret]# kubectl  exec  -it secret-pod /bin/sh/ # cd /etc/foo/my-group//etc/foo/..2020_02_03_05_40_42.995350019/my-group # cat my-password 123456.com

特点:如果secert的数据发生变化,引用数据的资源对象内的数据也会随之改变,当secret更新-----pod也会更新。

二:以环境变量的方式使用
通过volume使用secret时,容器必须从文件读取数据,会稍嫌麻烦,k8s还支持通过环境变量来使用secret。

pod配置文件示例如下:

apiVersion: v1kind: Podmetadata:  name: secret-podspec:  containers:  - name: secret-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 3000    env:      - name: SECRET_USERNAME        valueFrom:          secretKeyRef:            name: secret-app            key: username      - name: SECRET_PASSWORD        valueFrom:          secretKeyRef:            name: secret-app            key: password

//创建pod并读取secret:

[root@master secret]# kubectl apply -f  secret-pod.yaml pod/secret-pod created[root@master secret]# kubectl exec  -it secret-pod /bin/sh/ # echo $SECRET_USERNAMEroot/ # echo $SECRET_PASSWORD123456.com

(2)验证:接下来我们修改secret中password的值,查看pod内的数据是否会改变?
经过测试,发现pod中的值是不会发生改变的。

特点:环境变量读取secret很方便,但无法支撑secret动态更新。

configMap

  • Secret可以为pod提供密码,Token,私钥等敏感数据。而对于一些非敏感数据,比如应用的配置信息,则可以用ConfigMap。
  • ConfigMap与secret非常相似,主要不同的是,他保存的数据是以明文的方式存放。

假设我们需要存放在ConfigMap对象中的信息:

config1=xxx
config2=yyy

1,创建ConfigMap

同样拥有以下四种方法:
1.1 通过--from-literal创建:

[root@master configMap]# kubectl create configmap configmap1 --from-literal=config1=xxx --from-literal=config2=yyyconfigmap/configmap1 created

//查看configmap信息:

可以看到保存的数据是以明文的方式存放。

特点:每个--from-literal对应一条信息。

1.2 通过--from-file创建:

[root@master configMap]# echo xxx > config1[root@master configMap]# echo yyy > config2
//创建configmap:[root@master configMap]# kubectl create configmap configmap2 --from-file=config1 --from-file=config2configmap/configmap2 created

特点:每个文件对应一条信息,每个文件中只能保存一个,为了机密性,导入后需要将本地的文件删除掉。

1.3 通过--from-env-file的方式创建:

[root@master configMap]# cat > env.txt < config1=xxx> config2=yyy> EOF

//创建configmap:

[root@master configMap]# kubectl create configmap configmap3 --from-env-file=env.txt configmap/configmap3 created

特点:可以再文件里面保存多条信息,文件env.txt中每条key=value 对应一条信息条目。

1.4 通过yaml配置文件:
#文件中的敏感数据必须是通过 base64 编码后的结果。
configmap配置文件如下:

apiVersion: v1kind: ConfigMapmetadata:  name: configmap-appdata:  config1: xxx   #文件中的数据直接以明文输入即可  config2: yyy

//创建configmap:

 [root@master configMap]# kubectl apply -f  configmap.yaml configmap/configmap-app created

特点:便于保存,跨主机使用时会非常方便。

2,数据的引用

与Secret一样,pod也可以通过volume或者环境变量的方式使用secret。
一:volume方式
yaml配置文件如下:

apiVersion: v1kind: Podmetadata:  name: configmap-podspec:  containers:  - name: configmap-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 3000    volumeMounts:    - name: foo      mountPath: /etc/foo  volumes:  - name: foo    configMap:      name: configmap-app

//创建pod,并在pod中读取数据:

[root@master configMap]# kubectl apply -f configmap-pod.yaml pod/configmap-pod created[root@master configMap]# kubectl exec  -it configmap-pod /bin/sh/ # cd /etc/foo//etc/foo # lsconfig1  config2/etc/test # cat config1xxx/etc/test # cat config2yyy

二:env环境变量方式
yaml配置文件内容如下所示:

apiVersion: v1kind: Podmetadata:  name: configmap-podspec:  containers:  - name: configmap-pod    image: busybox    args:      - /bin/sh      - -c      - sleep 10; touch /tmp/healthy; sleep 3000    env:      - name: CONFIG1        valueFrom:          configMapKeyRef:            name: configmap-app            key: config1      - name: CONFIG2        valueFrom:          configMapKeyRef:            name: configmap-app            key: config2

//创建pod并查看pod中的数据:

[root@master configMap]# kubectl  delete -f  configmap-pod.yaml pod "configmap-pod" deleted[root@master configMap]# kubectl  apply -f  configmap-pod.yaml pod/configmap-pod created
[root@master configMap]# kubectl exec  -it configmap-pod /bin/sh/ # echo $CONFIG1xxx/ # echo $CONFIG2yyy

经过测试:同样configmap和secret的两种引用方式一样,volume挂载的方式,如果configmap的数据更新,引用的资源对象内的数据也会更新,而以env环境变量的方式,则不支持动态更新(可自己进行测试验证)。

注意:以上只是例子,要知道在大多数情况下,配置信息都是以文件形式提供,所以创建ConfigMap时一般只采用--from-file或YAML方式,而读取ConfigMap时通常采用volume方式。

小结:
向pod传递配置信息。如果信息需要加密,可使用Secret; 如果是一般的配置信息,则可使用ConfigMap。
Secret和ConfigMap支持四种定义方法,pod在使用它们时,可以选择volume方式或环境变量方式,不过只有volume方式支持动态更新。

文件 数据 方式 信息 配置 更新 特点 变量 对象 环境 支持 动态 容器 密码 方法 资源 验证 字段 明文 条目 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 创建空数据库的实验报告 党建数据库表设计 联合制定网络安全审查方案 服务器怎么解析json数组 2020软件开发新趋势 中文科技期刊全文数据库重庆维普 杭州商贸进销存软件开发 服务器进程管理权限 网络安全竞赛颁奖典礼致辞 防范网络安全等风险人民网 网络安全设计标志 北京1u机架式服务器多少钱 滴滴网络安全审查对滴滴车主影响 我的世界凡人修仙传多人服务器 美国网络安全专业有哪些 上海信用卡代还软件开发 哪些学校复试考数据库原理呀 小程序会员系统数据库 杭州单片机软件开发工程师招聘 征途服务端数据库文件 数据库时间少8小时 linux系统怎么重启X服务器 网络安全的手工 网络安全博士学什么意思 最近的网络安全宣传 网络安全研究所是什么 计算机网络技术升本考哪些科目 朝阳区智能化网络技术服务 苹果软件开发技术价格 高技术产业数据库
0