k8s | 深入理解 Secret
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。
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的类型
Secret 有三种类型:
- Opaque
kubernetes.io/dockerconfigjson
kubernetes.io/service-account-token
Opaque Secret
base64 编码格式的 Secre t,用来存储密码、密钥等;但数据也通过 base64 --decode 解码得到原始数据,所有加密性很弱。
需要对数据进行 base64加密
创建 secret.yaml 文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
kubectl create -f secrets.yml
通过 kubectl get secret 查看
使用方式和ConfigMap基本相同,有两种方式来使用它:
- 以 Volume 方式
- 以环境变量方式
kubernetes.io/dockerconfigjson
用来存储私有 docker registry 的认证信息。
直接用 kubectl 命令来创建用于 docker registry 认证的 secret
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
查看
kubectl get secret myregistrykey -o yaml
可以直接读取 ~/.dockercfg
的内容来创建
$ kubectl create secret docker-registry myregistrykey \
--from-file="~/.dockercfg"
kubernetes.io/service-account-token
用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount
目录中。
$ kubectl run nginx --image nginx
deployment "nginx" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-3137573019-md1u2 1/1 Running 0 13s
$ kubectl exec nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
评论区