1、启动应用安全信息的保护:
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=123
kubectl get secret
[root@cicd ~]# kubectl get secret NAME TYPE DATA AGE default-token-g44kp kubernetes.io/service-account-token 3 3d mysecret Opaque 2 9s
每一个
--from-literal
对应一个信息条目。
2. 经过 --from-file
:
echo -n admin > ./username
echo -n 123 > ./password
kubectl create secret generic yoursecret --from-file=./username --from-file=./password
每一个文件内容对应一个信息条目。
[root@cicd yml]# cat username admin[root@cicd yml]# cat password 123[root@cicd yml]#
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 编码后的结果。
echo -n admin | base64
YWRtaW4=
echo -n 123 | base64
YWJj
而后编写如下文件,添加关键参数。
[root@cicd yml]# cat secret.yml apiVersion: v1 kind: Secret metadata: name: yoursecret data: username: YWRtaW4= password: YWJj
data的数据以key:value的形式写入。数据库
执行
kubectl apply
建立 Secret

而后经过 base64 将 Value 反编码:
[root@cicd yml]# echo -n YWRtaW4=| base64 --decode #-n 不换行 admin[root@cicd yml]# echo -n YWJj | base64 --decode abc[root@cicd yml]#
2、secret在pod中的应用:
volume 方式使用 Secret
Pod 能够
经过 Volume 或者环境变量的方式使用 Secret,先学习 Volume 方式。
(1)Pod 的配置文件以下所示:
cat pod2.yml

① 定义 volume foo,来源为
yoursecret
② 将 foo mount 到容器路径 /etc/foo,可指定读写权限为 readOnly
3.定义pod名称
4. 挂载的目录名与宿主机映射的目录同名。
建立 Pod 并在容器中读取 Secret:
[root@cicd yml]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod-c3 1/1 Running 3 2h mypod-c4 1/1 Running 2 1h mypod3 0/1 ContainerCreating 0 42s
能够看到mypod3正在建立,这一状态的缘由有2;api
一是由于延迟,等会就行安全
二是由于报错,执行app
[root@cicd yml]# kubectl describe pod mypod3
进入mypod3查看详细状态信息,若是报错根据报错作出反应。post
建立完后,咱们进入mypod3验证:学习
[root@cicd yml]# kubectl exec -it mypod3 sh
编码
能够看到,Kubernetes 会
在指定的路径 /etc/foo 下为每条敏感数据建立一个文件,
文件名就是数据条目的 Key,这里是 /etc/foo/username 和 /etc/foo/password,
Value 则以明文存放在文件中。
(2)咱们也能够
自定义存放数据的文件名,好比将配置文件改成:

这时数据将分别存放在 /etc/foo/my-group/my-username 和 /etc/foo/my-group/my-password 中。
执行建立mypod4:
[root@cicd yml]# kubectl exec -it mypod4 sh
error: unable to upgrade connection: container not found ("mypod")
若是报此错,则是由于建立的pod不成功,即error或者正在建立中。
error: unable to upgrade connection: container not found ("mypod")
若是报此错,则是由于建立的pod不成功,即error或者正在建立中。
建立完毕后,咱们进入mypod4的/etc/foo路径查看。

以
Volume 方式使用的 Secret 支持动态更新:Secret 更新后,容器中的数据也会更新。
将 password 更新为 mdzz,base64 编码为 YWJjZGVm
[root@cicd yml]# echo -n mdzz | base64
bWR6eg==
更新 Secret。

从新执行secret.yml文件spa
几秒钟后出现此报错:
cat: can't open 'my-password': No such file or directory
sh: getcwd: No such file or directory
sh: getcwd: No such file or directory
这是由于改变的密码正在生效,从新进入/etc/foo发现新的 password 已经同步好了。
/etc/foo/..2019_06_24_09_42_04.419998613/my-group # cat my-password mdzz/etc/foo/..2019_06_24_09_42_04.419998613/my-group #
环境变量方式使用 Secret
经过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,
Kubernetes 还支持经过环境变量使用 Secret。
Pod 配置文件示例以下:

注意上图里的key:username和key:password是对应secret.yml文件里的命令行
因此必定要注意书写,否则是没法经过环境变量方式使用secret的。3d
而后建立 Pod。
[root@cicd yml]# kubectl apply -f pod4.yml
pod "mypod5" created
pod "mypod5" created
经过环境变量 SECRET_USERNAME 和 SECRET_PASSWORD 成功读取到 Secret 的数据。
[root@cicd yml]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod5 1/1 Running 0 56s [root@cicd yml]# kubectl exec -it mypod5 sh / # echo $SECRET_USERNAME admin / # echo $SECRET_PASSWORD mdzz
须要注意的是,
环境变量读取 Secret 很方便,但没法支撑 Secret 动态更新。
Secret 能够为 Pod 提供密码、Token、私钥等敏感数据;