在 K8S 中通过 configmap 保存了常用配置,但是因为是明文保存会导致安全问题,对于敏感信息可以通过 Secret 保存。
简介
通过 Secret 对象来保存数据量较小的敏感信息,例如密码、OAuth 令牌和 SSH 密钥等,默认只采用 Base64 进行加密,所以只要能访问 API 或者 ETCD 的用户都可以访问。
所以,如果要使用,建议为 Secret 启用静态加密;启用 RBAC 规则来限制对 Secret 的读写操作。但需要注意,任何被允许创建 Pod 的人都默认地具有读取 Secret 的权限。
针对不同的使用场景,K8S 提供的 Secret 包含了多种类型:
- Opaque 实际就是透明,如果用户没有加密,那么保存的就是明文。
----- 生成Base64编码,在YAML文件中使用
# echo -n 'my-app' | base64
# echo -n '39528$vdg7Jb' | base64
----- 这里的数据必须用Base64编码,否则会报错
# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: test-secret
data:
username: bXktYXBw
password: Mzk1MjgkdmRnN0pi
----- 也可以使用命令行添加
# kubectl create secret generic test-secret --from-literal='username=my-app' \
--from-literal='password=39528$vdg7Jb'
----- 直接查看ETCD保存数据,实际上是明文保存,可以通过 ETCDCTL_API=3 设置API版本
# etcdctl --endpoints=http://127.0.0.1:2379 get /registry/secrets/default/test-secret | hexdump -C
----- 启动一个Pod进行验证
# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- image: alpine:latest
name: alpine-app
imagePullPolicy: Never
command: ["/bin/sleep", "10000"]
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: test-secret
key: username
volumeMounts:
- mountPath: /etc/secret
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: test-secret
----- 可以验证输出
# kubectl exec -it secret-test-pod -- /bin/sh
#/ cat /etc/secret/username
#/ cat /etc/secret/password