为什么要使用secret
- 以前一些数据库密码可能会写在配置文件中springboot工程中一般是application.yaml。有的会直接写明文,有的加密之后把密文写在配置文件中。
- k8s中secret是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
- Secret 类似于 ConfigMap 但专门用于保存机密数据。
Pod使用Secret
Pod有用三种方式来使用 Secret
configMap的使用也有前两种方式
- 作为挂载到一个或多个容器上的卷 中的文件。
- 作为容器的环境变量。
- 由 kubelet 在为 Pod 拉取镜像时使用
pod以文件的形式使用secret
如果你希望在 Pod 中访问 Secret 内的数据,一种方式是让 Kubernetes 将 Secret 以 Pod 中一个或多个容器的文件系统中的文件的形式呈现出来。
要配置这种行为,你需要:
- 创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。
- 更改 Pod 定义,在 .spec.volumes[] 下添加一个卷。根据需要为卷设置其名称, 并将 .spec.volumes[].secret.secretName 字段设置为 Secret 对象的名称。
- 为每个需要该 Secret 的容器添加 .spec.containers[].volumeMounts[]。 并将 .spec.containers[].volumeMounts[].readyOnly 设置为 true, 将 .spec.containers[].volumeMounts[].mountPath 设置为希望 Secret 被放置的、目前尚未被使用的路径名。
- 更改你的镜像或命令行,以便程序读取所设置的目录下的文件。Secret 的 data 映射中的每个主键都成为 mountPath 下面的文件名。
也可以写在Deployment中
apiVersion: apps/v1
kind: Deployment
metadata:
name: online-route
spec:
replicas: 1
spec:
imagePullSecrets:
- name: gitlab-registry
containers:
- name: online-route
image: CI_REGISTRY_IMAGE:CI_COMMIT_SHORT_SHA
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- name: secret
mountPath: "/etc/secrets"
volumes:
- name: secret
secret:
secretName: online-route-secret
defaultMode: 0400
pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: false # 默认设置,意味着 "mysecret" 必须已经存在
使用配置文件管理Secret
编辑secret.yaml文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
#1. data 字段用来存储 base64 编码的任意数据
data:
username: YWRtaW4= #base64编码之后的字符串
password: MWYyZDFlMmU2N2Rm #base64编码之后的字符串
#2. stringData 字段是为了方便,它允许 Secret 使用未编码的字符串
stringData:
PG_USER: test
PG_PASSWORD: '123456'
使用 kubectl apply 创建 Secret创建
kubectl apply -f ./secret.yaml