k8s应用机密信息与配置管理(九)
secret
应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。
Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。
Secret 可通过命令行或 YAML 创建。比如希望 Secret 中包含如下信息:
用户名 admin
密码 123456
创建 Secret
有四种方法创建 Secret:
1. 通过 –from-literal:
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
每个 –from-literal 对应一个信息条目。
2. 通过 –from-file:
echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password
每个文件内容对应一个信息条目。
3. 通过 –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 对应一个信息条目。
4. 通过 YAML 配置文件:


文件中的敏感数据必须是通过 base64 编码后的结果。
[root@ken ~]# echo admin | base64
YWRtaW4=
[root@ken ~]# echo 123456 | base64
MTIzNDU2
执行 kubectl apply 创建 Secret:
[root@ken ~]# kubectl apply -f mysecret.yml
secret/mysecret created
查看secret
第一步:通过kubectl get secret查看
[root@ken ~]# kubectl get secret mysecret
NAME TYPE DATA AGE
mysecret Opaque 2 99s
第二步:显示有两个数据条目,kubectl describe secret 查看条目的 Key:
[root@ken ~]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque Data
====
password: 6 bytes
username: 5 bytes
第三步:如果还想查看 Value,可以用 kubectl edit secret mysecret:
[root@ken ~]# kubectl edit secret mysecret
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"password":"MTIzNDU2","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"}}
creationTimestamp: "2019-01-30T12:28:34Z"
name: mysecret
namespace: default
resourceVersion: "111466"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 8f86e1f4-248a-11e9-9172-000c292d5bb8
type: Opaque
第四步:然后通过 base64 将 Value 反编码:
[root@ken ~]# echo MTIzNDU2 | base64 --decode
123456 [root@ken ~]# echo YWRtaW4= | base64 --decode
admin
volume 方式使用 Secret
Pod 可以通过 Volume 或者环境变量的方式使用 Secret
第一步:Pod 的配置文件如下所示:


① 定义 volume foo,来源为 secret mysecret。
② 将 foo mount 到容器路径 /etc/foo,可指定读写权限为 readOnly。
第二步:创建 Pod 并在容器中读取 Secret:
[root@ken ~]# kubectl apply -f mypod.yml
pod/mypod created
[root@ken ~]# kubectl exec -it mypod sh
/ # ls /etc/foo
password username
/ # cat /etc/foo/password
/ # cat /etc/foo/password
123456/ #
/ # cat /etc/foo/username
admin/ #
可以看到,Kubernetes 会在指定的路径 /etc/foo 下为每条敏感数据创建一个文件,文件名就是数据条目的 Key,这里是 /etc/foo/username 和 /etc/foo/password,Value 则以明文存放在文件中。
第三步:我们也可以自定义存放数据的文件名,比如将配置文件改为:


这时数据将分别存放在 /etc/foo/my-group/my-username 和 /etc/foo/my-group/my-password 中。
以 Volume 方式使用的 Secret 支持动态更新:Secret 更新后,容器中的数据也会更新。
第四步:将 password 更新为 abcdef,base64 编码为 YWJjZGVm


更新 Secret。
[root@ken ~]# kubectl apply -f mysecret.yml
secret/mysecret configured
第五步:一段时间后十几秒到几分钟,新的 password 会同步到容器。
[root@ken ~]# kubectl exec -it mypod sh
/ # ls /etc/foo
password username / # cat /etc/foo/password
abcdef/ #
ConfigMap 管理配置
Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap。
ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放。
与 Secret 一样,ConfigMap 也支持四种创建方式:
1. 通过 –from-literal:
kubectl create configmap myconfigmap --from-literal=config1=xxx --from-literal=config2=yyy
每个 –from-literal 对应一个信息条目。
2. 通过 –from-file:
echo -n xxx > ./config1
echo -n yyy > ./config2
kubectl create configmap myconfigmap --from-file=./config1 --from-file=./config2
每个文件内容对应一个信息条目。
3. 通过 –from-env-file:
cat << EOF > env.txt
config1=xxx
config2=yyy
EOF
kubectl create configmap myconfigmap --from-env-file=env.txt
文件 env.txt 中每行 Key=Value 对应一个信息条目。
4. 通过 YAML 配置文件:配置文件data里面不能是纯数字

5.查看configmap
[root@ken-master ~]# kubectl get configmap
NAME DATA AGE
myconfig 2 117s
6.查看configmap中的详细信息
[root@ken-master ~]# kubectl get configmap
NAME DATA AGE
myconfig 2 117s
[root@ken-master ~]# kubectl describe configmap myconfig
Name: myconfig
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"password":"kenken13","username":"ken"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"myconfig","name...
Data
====
username:
----
ken
password:
----
kenken13
Events: <none>
文件中的数据直接以明文输入。
7.与 Secret 一样,Pod 也可以通过 Volume 或者环境变量的方式使用 Secret。
Volume 方式:

大多数情况下,配置信息都以文件形式提供,所以在创建 ConfigMap 时通常采用 –from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。
k8s应用机密信息与配置管理(九)的更多相关文章
- k8s应用机密信息与配置管理(九)--技术流ken
secret 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret. Secret 会以 ...
- k8s多集群配置管理平台
k8s多集群配置管理平台 临时集群特性 模拟生产环境 整体环境说明 内网:10.17.1.44 [root@localhost account-server]# kubectl get nodes N ...
- Docker 与 K8S学习笔记(十九)—— Pod的配置管理
我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...
- 微服务从代码到k8s部署应有尽有系列(九、事务精讲)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 用 k8s 管理机密信息 - 每天5分钟玩转 Docker 容器技术(155)
应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret. Secret 会以密文的方式存储 ...
- K8s管理机密信息
1. 启动应用安全信息的保护 Secret介绍 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...
- k8s记录-helm部署(九)
helm 组件配置在 192.168.0.1 192.168.0.2 192.168.0.3 app 用户下操作tar xvf helm-v2.14.3-linux-amd64.tar.gzsudo ...
- k8s管理机密信息(9)
一.启动应用安全信息的保护: Secret介绍: 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...
- k8s 管理机密信息
一.启动应用安全信息的保护: Secret介绍: 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...
随机推荐
- Python3 执行JS出现JSON未定义问题
two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...
- Solon详解(一)- 快速入门
一.Solon 最近号称小而美的的Solon框架,终于得空,搞了一把,发觉Solon确实好用,那Solon到底是什么,又是怎么好用呢? 什么是Solon? Solon参考过Spring boot 和 ...
- Javascript模块化编程(一):模块的写法 (转)
Javascript模块化编程(一):模块的写法 原文作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞 ...
- 初学Linux (Linux_note)
根目录:/ /root: 存放root用户相关文件 /home: 存放不同用户的相关文件 /bin: 存放常用命令的目录 /sbin: 要具有一定权限才可以使用的命令 /mnt: 默认挂载光驱和软驱的 ...
- Shell编程—基础脚本
1. 使用多个命令 如果要两个命令或者多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. 2. 创建 shell 脚本文件 例如: #!/bin/bash # This script dis ...
- Clayff力场(转载)
本文转载自:http://blog.sina.com.cn/s/blog_b48a7ac30102w4km.html 注意:lammps中并没有完整的clayff势函数,需要将一下三者结合使用. an ...
- Hive 常见面试题(二)
1.Hive行转列和列转行如何实现? 行转列 使用 concat_ws 实现行转列. 例如: select user_id, concat_ws(',',collect_list(order_id)) ...
- Mysql安装错误
[问题一]在安装mysql时遇到以下错误 执行./mysqld --initialize 后 ./bin/mysqld: error while loading shared libraries: l ...
- day03 每日一行
day03 每日一行 问题描述 用列表解释式 .生成器表达式实现 字典列表为: [{'first': 'john', 'last': 'smith', 'email': 'jsmith@exsampl ...
- 深入了解v-model流程
v-model原理 vue中v-model是一个语法糖,所谓的语法糖就是对其他基础功能的二次封装而产生的功能.简单点说,v-model本身就是父组件对子组件状态以及状态改变事件的封装.其实现原理上分为 ...