简介
Secret 在kubernetes 中主要用来存储敏感的信息。 我们可以把应用程序的机密信息都以Secret的方式存入到ectd中。
使用方式
文件挂载
使用隐藏文件的方式挂载到Pod中。示例如下:
创建 dot-secret.yaml
kubectl create namespace secret-demo
apiVersion: v1
kind: Secret
metadata:
name: dotfile-secret
namespace: secret-demo
data:
.secret-file: dmFsdWUtMg0KDQo=
username: YWRtaW4=
password: YWRtaW4zMjE=
kubectl create -f dot-secret.yaml
创建 dot-secret-pod.yaml
,并将 dotfile-secret
挂载到容器/etc/secret-volume
目录下
apiVersion: v1
kind: Pod
metadata:
name: secret-dot-pod
namespace: secret-demo
spec:
volumes:
- name: secret-volume
secret:
# 从 Secret 中读取名为 dotfile-secret 的 secret
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: nginx
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
kubectl create -f dot-secret-pod.yaml
稍等一会创建后进入容器查看 /etc/secret-volume
目录:
kubectl exec -it -n secret-demo secret-dot-pod /bin/sh
# ls -al /etc/secret-volume
不出意外在该目录下会有一个 .secret-file
,username
,password
的三个文件。
环境变量
修改 dot-secret-pod.yaml
如下:
apiVersion: v1
kind: Pod
metadata:
name: secret-dot-pod
namespace: secret-demo
spec:
volumes:
- name: secret-volume
secret:
# 从 Secret 中读取名为 dotfile-secret 的 secret
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: nginx
env:
# 从 Secret 中读取名为 dotfile-secret 的 username 字段
- name: USERNAME
valueFrom:
secretKeyRef:
name: dotfile-secret
key: username
# 从 Secret 中读取名为 dotfile-secret 的 password 字段
- name: PASSWORD
valueFrom:
secretKeyRef:
name: dotfile-secret
key: password
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
我们在 pod 中增加了 USERNAME 和 PASSWORD两个环境变量。它们的值分别是从 dotfile-secret.username 与 dotfile-secret.password 中读取。
kubectl apply -f dot-secret-pod.yaml
进入容器验证:
kubectl exec -it -n secret-demo secret-dot-pod /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo $USERNAME
admin
# echo $PASSWORD
admin321
Secret VS ConfigMap
相同点:
- key/value的形式
- 属于某个特定的namespace
- 可以导出到环境变量
- 可以通过目录/文件形式挂载
- 通过 volume 挂载的配置信息均可热更新
不同点:
- Secret 可以被 ServerAccount 关联
- Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
- Secret 支持 Base64 加密
Secret 的类型
内置类型 | 用法 |
---|---|
Opaque | 用户定义的任意数据 |
kubernetes.io/service-account-token | 服务账号令牌 |
kubernetes.io/dockercfg | ~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson | ~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth | 用于基本身份认证的凭据 |
kubernetes.io/ssh-auth | 用于 SSH 身份认证的凭据 |
kubernetes.io/tls | 用于 TLS 客户端或者服务器端的数据 |
bootstrap.kubernetes.io/token | 启动引导令牌数据 |
这里我们暂时只需要掌握如何挂载到容器中进行使用就行。对应的数据类型在使用时查查官方文档即可。
清理资源
kubectl delete -f dot-secret-pod.yaml
kubectl delete -f dot-secret.yaml
kubectl delete namespace secret-demo