Secret 解决了密码、Token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者
Pod Spec
中。Secret可以以Volume
或者环境变量的方式使用。 使用Secret
意味着你不需要在应用程序代码中包含机密数据。
一、概述
由于创建 Secret
可以独立于使用它们的 Pod
, 因此在创建、查看和编辑 Pod
的工作流程中暴露 Secret
(及其数据)的风险较小。 Kubernetes
和在集群中运行的应用程序也可以对 Secret
采取额外的预防措施, 例如避免将机密数据写入非易失性存储。Secret
类似于 ConfigMap
但专门用于保存机密数据。
1、类型
内置类型 | 用法 |
---|---|
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 | 启动引导令牌数据 |
一般用到这三种类型类型比较多:Opaque
、kubernetes.io/dockerconfigjson
以及kubernetes.io/service-account-token
二、Service Account
Service Account
用来访问 Kubernetes API
,由 Kubernetes
自动创建,并且会自动挂载到 Pod
的 /run/secrets/kubernetes.io/serviceaccount
目录中。
# kubectl run nginx --image nginx:1.7.9
pod/nginx created
# kubectl exec nginx -- ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
三、Opaque Secret
当 Secret
配置文件中未作显式设定时,默认的 Secret
类型是 Opaque
。Opaque
类型的数据是一个map
类型,要求 value
是 base64
编码格式,这个加密性很弱,可以认定为不是一种加密类型只是一种编码方式。
1、创建说明
使用 kubectl
来创建一个 Secret
# echo -n "admin" | base64
YWRtaW4=
# echo -n "123456" | base64
MTIzNDU2
# cat secret-test.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MTIzNDU2
username: YWRtaW4=
# kubectl create -f secret-test.yml
secret/mysecret created
# kubectl get secret
NAME TYPE DATA AGE
default-token-g2rb9 kubernetes.io/service-account-token 3 35d
mysecret Opaque 2 7s
2、使用方式
1. Secret 挂载到Volume中
如果你希望在 Pod
中访问 Secret
内的数据,一种方式是让 Kubernetes
将 Secret
以 Pod
中一个或多个容器的文件系统中的文件的形式呈现出来。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: nginx:1.7.9
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: false # 默认设置,意味着 "mysecret" 必须已经存在
# kubectl exec -it mypod /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@mypod:/# ls /etc/foo/
password username
root@mypod:/# ls /etc/foo/password
/etc/foo/password
root@mypod:/# cat /etc/foo/password
123456root@mypod:/#
2. Secret 导出到环境变量中
通过环境变量来使用 Secret
的示例 Pod
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "username" 的主键
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "password" 的主键
restartPolicy: Never
四、dockerconfigjson
1、创建 Docker Secret
使用下面 kubernetes.io/dockerconfigjson
值来创建 Secret,用以存放访问 Docker 仓库 来下载镜像的凭据。
kubectl create secret docker-registry myregistrykey \
--docker-email=test123@acme.example \
--docker-username=test123\
--docker-password=pass113 \
--docker-server=registry.example:5000
2、引用 Docker Secret
在创建 Pod
的时候,通过 ImagePullSecrets
来引用刚创建的 myregistrykey
apiVersion: v1
kind: Pod
metadata:
name: "MYAPP"
spec:
containers:
- name: MYAPP
image: "nginx:1.7.9"
imagePullSecrets:
- name: myregistrykey
Reference:
https://www.kubernetes.org.cn/secret
https://kubernetes.io/zh/docs/concepts/configuration/secret