ConfigMap和Secret是Kubernetes中两种特殊类型的存储卷,ConfigMap这种资源对象主要用于提供配置数据以定制程序行为,不过一些敏感的配置信息,比如像用户名、密码、密钥等通常都是由Secret这种资源对象来进行配置的,他们将相应的配置信息保存于对象中,而后在Pod资源上以存储卷的形式将其挂载并获取相应配置,以实现配置与镜像文件的解耦。
一、Secret资源对象
1) Secret概述
Secret资源对象存储数据的方式是以键值对的方式进行存储的,在Pod资源进行Secret的方式是通过环境变量或存储卷的方式进行访问数据,解决了密码、token、密钥等敏感数据的配置问题,而不需要将这些敏感数据暴露到镜像或者Pod的spec字段中。另外,Secret对象的数据存储和打印格式为Base64编码的字符串,因此用户在创建Secret对象时,也需要提供该类型的编码格式的数据。在容器中以环境变量或存储卷的方式访问时,会自动解码为明文格式。需要注意的是,如果是在Master节点上,Secret对象以非加密的格式存储在etcd中,所以需要对etcd的管理和权限进行严格控制。
2)Secret资源的类型
Secret有四种类型:
1)Service Account :用来访问Kubernetes
API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;
2)Opaque :base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic;
3)kubernetes.io/dockerconfigjson :用来存储私有docker registry的认证信息,类型标识为docker-registry;
4)kubernetes.io/tls:用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls;
3)创建Secret的方式
假设存储的数据是:
username:root
password:123.com
以下的存储方式都是存储该信息!
1)使用–from-literal(文字)的方式
[root@master ~]# kubectl create secret generic mysecret01 --from-literal=username=root --from-literal=password=123.com
#创建一个secret资源对象,名称为mysecret01,采用的加密方式是generic(通用的、一般的加密方式)
#注意:这种方式每一条只能保存一条信息
[root@master ~]# kubectl get secrets mysecret01
NAME TYPE DATA AGE
mysecret01 Opaque 2 25s
[root@master ~]# kubectl describe secrets mysecret01 #查看该资源的详细信息
Name: mysecret01
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque #不透明的,看不到的
Data
====
password: 7 bytes #只能查看键的名称,无法查看到键对应的值
username: 4 bytes
[root@master ~]# kubectl get secrets mysecret01 -o yaml
#将该资源以yaml文件的方式进行显示
apiVersion: v1
data:
password: MTIzLmNvbQ== #键对应的值都是乱码,加密使用的是base64编码格式
username: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2020-02-14T10:08:21Z"
name: mysecret01
namespace: default
resourceVersion: "2474"
selfLink: /api/v1/namespaces/default/secrets/mysecret01
uid: 1aee0635-7bfb-4e8a-a21e-be993e534156
type: Opaque
[root@master ~]# echo -n cm9vdAo= | base64 --d #将乱码解码后的结果
root
[root@master ~]# echo -n MTIzLmNvbQ== | base64 --d
123.com
2)使用–from-file(文件)的方式
这种方式更第一种方式差不多,可能稍微显得麻烦一些!
[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
#需要先将要存储的键值对写入到文件中,并且每个文件只能写入一个值
[root@master ~]# kubectl create secret generic mysecret02 --from-file=us