ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

k8s管理机密信息

2019-06-24 18:02:00  阅读:487  来源: 互联网

标签:机密信息 kubectl password 管理 cicd Secret k8s root yml


   

一、启动应用安全信息的保护:

 

Secret介绍:

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。   Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。   Secret 可通过命令行或 YAML 创建。比如希望 Secret 中包含如下信息:
  1. 用户名 admin
  2. 密码 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]# 

 

 

二、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;

一是因为延迟,等会就行

二是因为报错,执行

[root@cicd yml]# kubectl describe pod mypod3
进入mypod3查看详细状态信息,如果报错根据报错做出反应。

 

创建完后,我们进入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或者正在创建中。   创建完毕后,我们进入mypod4的/etc/foo路径查看。

 

 

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

重新执行secret.yml文件

 

几秒钟后出现此报错: cat: can't open 'my-password': 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的。

然后创建 Pod。 [root@cicd yml]# kubectl apply -f pod4.yml
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、私钥等敏感数据

标签:机密信息,kubectl,password,管理,cicd,Secret,k8s,root,yml
来源: https://www.cnblogs.com/zzzynx/p/11078507.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有