1 基础概念
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以通过 Volume 或者环境变量的方式使用。
在创建 Secret 对象时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。截至1.19版本,K8S提供了多种内置的类型,具体如下:
内置类型 |
用法 |
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 |
启动引导令牌数据 |
2 常见用法
2.1 创建 secret
- 通过文件创建 secret
% echo -n 'admin' > ./username
% echo -n 'kubernetes' > ./password
% kubectl create secret generic sec-data01 --from-file=./username --from-file=./password
secret/sec-data01 created
查看secret数据:
% kubectl get secrets sec-data01 -o go-template='{{.data}}'
map[password:a3ViZXJuZXRlcw== username:YWRtaW4=]%
- 手动加密
默认情况下使用base64进行加密,如下直接通过base64加密,其值和secret中的加密结果相同:
% echo -n 'admin'|base64
YWRtaW4=
% echo -n 'kubernetes'|base64
a3ViZXJuZXRlcw==
对加密数据进行解密:
% echo 'YWRtaW4='|base64 --decode
admin%
% vim sec-data01.yaml
apiVersion: v1
data:
password: a3ViZXJuZXRlcw==
username: YWRtaW4=
kind: Secret
metadata:
name: sec-data01
2.2 使用 secret
- pod卷挂载 secret
该方式会将secret信息挂载到指定的目录,然后让容器中的程序通过挂载目录的文件来读取secret的内容。% vim pod-sec-data01.yaml
apiVersion: v1
kind: Pod
metadata:
name: sec-data01
spec:
containers:
- name: busybo-sec
image: busybox:1.32
volumeMounts:
- name: config-volume
mountPath: /my-config
volumes:
- name: config-volume
secret:
secretName: sec-data01
创建pod:
% kubectl apply -f pod-sec-data01.yaml
pod/sec-data01 created
查看secret挂载情况:
/ # ls /my-config/
password username
/ # cat /my-config/username
admin/ #
/ # cat /my-config/password
kubernetes/ #
- pod环境变量使用 secret
该方式会将secret的key加载到pod的container env中,使用时需要通过 env[x].valueFrom.secretKeyRef 指定要包含的 Secret 名称和键名。% cat pod-env-sec-data02.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-sec-data01
spec:
containers:
- name: busybo-sec
image: busybox:1.32
command: ['sh', '-c', 'sleep 1000000']
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: sec-data01
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: sec-data01
key: password
创建pod:
% kubectl apply -f pod-env-sec-data02.yaml
pod/env-sec-data01 created
查看环境变量:
% kubectl exec -it env-sec-data01 -- env|grep SEC
SECRET_USERNAME=admin
SECRET_PASSWORD=kubernetes
``
2.3 imagePullSecret 控制镜像访问权限
to add
3 注意事项
- 除了基本的secret外,也可以通过 immutable: true 字段来创建不可更改的Secret
4 说明
概念->配置->Secret
github feiskyer/kubernetes-handbook/blob/master/concepts/secret