Kubernetes Secret
一、简介
Secret主要作用是保管私密数据,如密码,OAuth Tokens和 ssh key等,将这些信息放在Secret中比放在Pod的定义中或者docker镜像中来说更加灵活和安全
Secret有三种类型:
-
Opaque:
base64
编码格式的secret,用来存储密码、密钥等;但数据也可以通过base64-decode解码得到原始数据,所以加密下很弱 -
kubernetes.io/dockerconfigjson:用来存储
docker registry
的认证信息 -
kubernetes.io/service-account-token:用于被ServiceAccount引用,ServiceAccount创建时kubernetes会默认创建对应的secret。Pod如果使用了ServiceAccount,对应的secret会自动挂载到Pod目录/run/secrets/kubernetes.io/serviceaccount中
二、Opaque Secret
Opaque 类型的数据是一个map类型,要求value是base64编码格式,比如创建一个用户名为admin,密码为admin123的Secret对象,首先需要把这个用户名和密码做base64编码
# echo -n 'admin' | base64 YWRtaW4= # echo -n 'admin123'|base64 YWRtaW4xMjM=
编写secret-demo.yaml
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= password: YWRtaW4xMjM=
创建secret
# kubectl create -f secret-demo.yaml
secret/my-secret created
查看secret
# kubectl get secret my-secret -o wide NAME TYPE DATA AGE my-secret Opaque 2 20s # kubectl describe secret my-secret Name: my-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 8 bytes username: 5 bytes
三、使用Secret
3.1 环境变量
secret-pod.yaml
apiVersion: v1 kind: Pod metadata: name: secret-pod1 spec: containers: - name: secret-pod1 image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox command: - sleep - "600" env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
查看env环境变量
# kubectl exec -it secret-pod1 -- env | grep -Ei 'username|password' USERNAME=admin PASSWORD=admin123
3.2 volume挂载
secret-pod2.yaml
apiVersion: v1 kind: Pod metadata: name: secret-pod2 spec: containers: - name: secret-pod2 image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox command: ['/bin/sh','-c','ls /etc/secrets'] volumeMounts: - name: secrets mountPath: /etc/secrets volumes: - name: secrets secret: secretName: my-secret
创建Pod
# kubectl create -f secret-pod2.yaml
pod/secret-pod2 created
查看日志输出
# kubectl logs secret-pod2
password
username
四、 Kubernetes.io/dockerconfigjson
除了上面的Opaque这个类型外,还可以来创建用户docker registry
认证的 Secret,直接使用kubectl create
即可
# kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL secret "myregistry" created
五、Kubernetes.io/service-account-token
另外一种Secret
类型就是kubernetes.io/service-account-token
,用于被serviceaccount
引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的secret会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount
目录中。
六、Secret 与 ConfigMap对比
相同点:
-
key/value 的形式
-
属于某个特定的
namespace
-
可以导出到环境变量
-
可以通过目录/文件形式挂载
-
通过
volume
挂载的配置信息均可热更新
不同点:
-
Secret可以被ServerAccount关联
-
Secret可以存储
docker register
的鉴权信息,用在ImagePullSecret
参数中,用于拉去私有仓库的镜像 -
Secret支持
base64
加密 -
Secret分为 kubernetes.io / service-account-token、kubernetes.io/dockerconfigjson、Opaque三种类型,而ConfigMap不区分类型
-