-
应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名,密码或者秘钥,讲这些信息直接保存在容器镜像中显然不合适,kubernetes提供的解决方案就是Secret
-
Secret会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息,Secret会以Volume的形式被mount到Pod,容器可通过文件的方式使用Secret中的敏感数据,此外,容器也可以环境变量的方式使用这些数据
-
Secret可通过命令行或者yaml创建,比如希望Secret中包含如下信息:用户名admin,密码123456
-
创建Secret,有四种方法:
- 通过-- from-literal:kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456,每个–from-literal对应一个信息条目
- 通过–from-file:echo -n admin > ./username echo -n 123456 > ./password .
- kubectl create secret generic mysecret --from-file=./username --from-file=./password
- 每个文件内容对应一个信息条目
- 通过–from-env-file
- cat << EOF > env.txt username=admin password=123456 EOF
- kubectl create secret generic mysecret --from-env-file=env.txt
- 文件env.txt中每行key=value对应一个信息条目
- 通过YAML配置文件
-
文件中的敏感数据必须是通过base64编码后的结果
-
执行kubectl apply创建Secret
-
查看Secret
-
通过kubectl get secret查看存在的secret
-
显式有两个数据条目,通过kubectl describe secret查看条目的key
-
如果还想查看Value,可以用kubectl edit secret mysecret
-
然后通过base64将value反编码
-
-
在Pod中使用Secret
-
Pod可以通过Volume或者环境变量的方式使用Secret
-
Volume方式
-
- 定义volume foo,来源为secret mysecret
- 将foo mount到容器路径/etc/foo。可指定读写权限为readOnly
-
创建Pod并在容器中读取Secret
- Kubernetes会在指定的路径/etc/foo下为每条敏感数据创建一个文件,文件名就是数据条目的Key,这里是/etc/foo/username和/etc/foo/password,value则以明文存放在文件中
-
可以自定义存放数据的文件名,
-
这时数据将分别存放在/etc/foo/my-group/my-username和/etc/foo/my-group-password中,
-
以volume方式使用的Secret支持动态更新,Secret更新后,容器中的数据也会更新
-
将password更新为abcdef,base64编码为YWJjZGVm
-
更新Secret
-
几秒钟后,新的password会同步到容器
-
-
-
环境变量方式
-
通过Volume使用Secret,容器必须从文件读取数据,Kubernetes还支持通过环境变量使用Secret
-
创建Pod并读取Secret
-
通过环境变量SECRET_USERNAME和SECRET_PASSWORD,成功读取到Secret的数据
-
-
环境变量读取Secret很方便,但无法支撑Secret动态更新
-
-
-
ConfigMap
-
Secret可以为Pod提供密码,Token,私钥等敏感数据,对于一些非敏感的数据,比如应用的配置信息,则可以使用ConfigMap
-
configMap的创建和使用方式与Secret类似,主要不同的是数据以明文的形式存放
-
ConfigMap支持四种创建方式
- 通过–from-literal
- kubectl create configmap myconfigmap --from-literal=config1=xxx–from-literal=config2=yyy
- 每个–from-literal对应一个信息条目
- 通过–from-file
- echo -n xxx > ./config1
- echo -n yyy > ./config2
- kubectl create configmap myconfigmap --from-file=./config1 --from-file=./config2
- 每个文件内容对应一个信息条目
- 通过–from-env-file
- cat < env.txt config1=xxx config2=yyy EOF
- kubectl create configmap myconfigmap --from-env-file=env.txt
- 文件env.txt中每行key=value对应一个信息条目
- 通过YAML配置文件,文件中的数据直接以明文输入
- 通过–from-literal
-
与Secret一样,Pod也可以通过Volume或者环境变量的方式使用Secret
-
Volume方式
-
环境变量方式
-
大多数情况下,配置信息都是以文件形式提供,所以在创建configmap时通常采用–from-file或YAML方式,读取configmap时通常采用Volume方式,比如给Pod传递如何记录日志的配置信息
-
可以采用–from-file形式,将其保存在文件logging.conf中,然后执行命令
- kubectl create configmap mycnfigmap --from -file=./logging.conf
-
如果采用YAML配置文件
-
创建并查看ConfigMap
-
在Pod中使用此ConfigMap
- 在volume中指定存放配置信息的文件相对路径为myapp/logging.conf
- 将volume mount到容器的/etc目录
-
创建Pod并读取配置信息
-
配置信息已经保存到/etc/myapp/logging.conf文件中,Volume形式的Configmap也支持动态更新
-
-