一起养成写作习惯!这是我参与「掘金日新计划 · 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
三种方式:
kubectl
yaml
配置文件- 生成器创建
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
复制代码