一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
一、前言
ConfigMap传递敏感数据,就需要Secret。
Secret对象可以存储和管理敏感信息,比如passwords、OAuth tokens、以及ssh keys等。把敏感信息存储到Secret对象中会比放到Pod的定义文件或是容器镜像中更加安全、灵活,使用Secret对象可以更好的控制数据的使用方式,并且减少意外泄露的风险。
不仅用户可以创建 Secret 对象,kubernetes 系统也会创建一些 Secret 对象。
Secret 被创建以后,可以使用 3 种方式创建它:
- 创建
Pod时,通过为Pod指定Service Account自动使用该Secret - 通过挂载该
Secret到Pod来使用它 - 在
Docker镜像下载时使用,通过指定Pod的spc.ImagePullSecrets来引用它
在存储数据的时候,如何从 ConfigMap 和 Secret 这两者之间进行选择呢?
- 使用
ConfigMap存储非敏感的配置信息 - 使用
Secret存储敏感的配置信息 - 如果配置文件既包含敏感信息、又包含非敏感信息,依然选择
Secret进行存储
Secret 和 ConfigMap 对比,既有相同点、也有不同点,列表如下:
相同点:
- 存储数据都属于
key-value键值对形式 - 属于某个特定的
namespace - 可以导出到环境变量
- 可以通过目录/文件形式挂载(支持挂载所有
key和部分key)
不同点:
Secret可以被ServerAccount关联使用Secret可以存储Register的鉴权信息,用于ImagePullSecret参数中,用于拉取私有仓库的镜像Secret支持Base64加密Secret分为Opaque、kubernetes.io/Service Account、kubernetes.io/dockerconfigjson三种类型,ConfigMap不区分类型Secret文件存储在tmpfs文件系统中,Pod删除后Secret文件也会对应被删除
二、默认令牌Secret
Service Accounts使用API证书自动创建并且绑定Secret。
kubernetes系统可以自动创建用于访问API证书的Secret,并且可以自动绑定到Pod中使用这种类型的Secret。
可以根据需要禁用或覆盖重写这类 Secret,但是通常情况下如果考虑到安全性,更加推荐使用系统默认创建的 Secret。
-
查看系统默认创建的
Secret:kubectl get secrets -
查看
Secrets详细信息:kubectl describe secrets -
新建
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-manual
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1
name: nginx
ports:
- containerPort: 80
protocol: TCP
- 执行创建
$ kubectl create -f nginx-manual.yaml
pod/nginx-manual created
- 查看详细信息
$ kubectl describe pod nginx-manual
# 这里显示了 default-token-sz72t Secret 被挂载到了容器中的 /var/run/secrets/kubernetes.io/serviceaccount 目录下
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sz72t (ro)
- 查看容器该目录下的文件名是否符合
$ kubectl exec nginx-manual ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
**Tips: **
-
当
pod被API Service创建时,API Service不会校验该pod引用的Secret是否存在 -
一旦这个
pod被调度,则kubelet将试着获取Secret的值 -
如果
Secret不存在或暂时无法连接到API Secret,则kubelet会按照一定的时间间隔定期重试获取该Secret,并发送一个Event来解释pod没有启动的原因。 -
一旦
Secret被Pod获取,则kubelet将创建并挂载包含Secret的Volume,只有所有Volume都挂载成功,Pod中的Container才会被启动。
三、创建Secret
创建Secret三种方式:
kubectlyaml配置文件- 生成器创建
secret
(1)使用kubectl创建secret
- 定义帐号和密码
echo -n 'admin' > /home/donald/username.txt
echo -n '1f2d1e2e67df' > /home/donald/password.txt
- 创建
$ kubectl create secret generic db-user-pass --from-file=/home/donald/username.txt --from-file=/home/donald/password.txt
secret/db-user-pass created
- 查看
Secret
kubectl get secrets
(2)yaml配置文件
文件可以是json或yaml
定义Secret有两种字段:
data:被Base64编码以后的数据stringData:可以纯文本
- 定义帐号和密码
echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123' | base64
MTIz
- 创建
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MTIz
- 执行创建
$ kubeclt create -f secre.yaml
secret/mysecret created
(3)生成器创建Secret
kubectl v1.14版本开始支持 Kustomize管理对象
- 创建一个
kustomization.yaml, 生成器字段secretGenerator
cat <<EOF >/home/donald/kustomization.yaml
secretGenerator:
- name: db-user-pass
files:
- username.txt
- password.txt
EOF
或者 key-value形式
cat <<EOF >/home/donald/kustomization.yaml
secretGenerator:
- name: db-user-pass
literals:
- username=admin
- password=secret
EOF
- 执行创建
kubectl apply -k .
- 查看
kubectl get secrets