Secret与ConfigMap配置与使用

 

在Kubernetes中,常常需要使用用户名,密码连接数据库或者需要提前准备一些相关的配置信息给Cluster。该信息不适合存储在container,该信息的存储可以通过Secret或者ConfigMap来实现。两者的区别在于Secret会把value以Base64编码形式存储而ConfigMap会以明文方式存储。

两者都可以通过命令行或者YAML文件配置来存储相应的信息,主要有4种方式来创建Secret或者ConfigMap。

以如下要求为例,配置username和password

username:admin
password:1234
  • 通过--from-literal方式
kubectl create secret generic my-secret --from-literal=user=admin --from-literal=password=1234
  • 通过--from-file方式
echo -n admin > ./username
echo -n 1234 > ./password
kubectl create secret generic my-secret --from-file=./username --from-file=./password
  • 通过--from-env-file方式。在此方式中,数据需要以key=value来存储在文件中
cat << EOF > ./config
username=admin
password=1234
EOF

kubectl create secret generic my-secret --from-env-file=./config
  • 通过YAML配置文件
echo -n admin | base64    =>  YWRtaW4=
echo -n 1234 | base64    =>  MTIzNA==

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
# stringData以明文形式存储敏感信息
#stringData:
#  username: admin
#  password: 1234
data:
  username: YWRtaW4=
  password: MTIzNA==

通过运行命令

kubectl edit secret my-secret

可以查看到在Secret中username和password以密文即Base64编码形式存储下来

apiVersion: v1
data:
  password: MTIzNA==
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2021-04-13T21:08:47Z"
  name: my-secret
  namespace: default
...

同理,对应的ConfigMap也可以同样相同的四种方式来存储配置信息,只列出第四种以YAML形式保存配置信息

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  username: admin
  password: "1234"

如果读取的是某个文件的配置并创建到ConfigMap中,则需要添加“|”表示其为文件,之后内容则与配置文件中内容相同,如config文件中内容为

username:admin
password:1234

则YAML文件的写法如下

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config: |
      username: admin
      password: "1234"

等同于

kubectl create configmap my-config --from-file=./config