Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Pod 可以用三种方式之一来使用 Secret:
1. 作为挂载到一个或多个容器上的 卷 中的文件。
2. 作为容器的环境变量
3. 由 kubelet 在为 Pod 拉取镜像时使用
内置 Secret:
Kubernetes 自动创建包含访问 API 凭据的 Secret,并以使用此类型的 Secret自动修改 Pod 。
自定义Secret:
使用Kubernetes创建secret:
创建本例中要使用的文件:
echo-n'admin'> ./username.txt
echo-n'1f2d1e2e67df'> ./password.txt
kubectl create secret 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象:
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
输出类似于:
secret "db-user-pass" created
默认的键名是文件名
检查刚创建的 Secret:
kubectl get secrets
其输出类似于:
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
查看 Secret 的描述:
kubectl describe secrets/db-user-pass
其输出类似于:
Name: db-user-pass
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
password.txt: 12 bytes
username.txt: 5 bytes
手动创建 Secret:
先以 JSON 或 YAML 格式文件创建一个 Secret,然后创建该对象。 Secret 包含两个映射:data 和 stringData。 data 字段用于存储使用 base64 编码的任意数据。 提供 stringData 字段允许用未编码的字符串提供机密数据。
如:
echo-n'1f2d1e2e67df'| base64
输出类似于:
MWYyZDFlMmU2N2Rm
写一个 Secret 对象:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
使用 kubectl apply 创建 Secret 对象:
kubectl apply -f ./secret.yaml
查看secret:
kubectl get secret mysecret -o yaml
从生成器创建 Secret:
使用 Kustomize 管理对象。 Kustomize 提供资源生成器创建 Secret 和 ConfigMaps。 Kustomize 生成器要在当前目录内的 kustomization.yaml 中指定。 生成 Secret 之后,使用 kubectl apply 在 API 服务器上创建对象。
从文件生成 Secret:
你可以通过定义基于文件 ./username.txt 和 ./password.txt 的 secretGenerator 来生成一个 Secret。
cat<
应用包含 kustomization.yaml 目录以创建 Secret 对象:
kubectl apply -k .
检查 Secret 是否创建成功:
kubectl get secrets
基于字符串值来创建 Secret:
通过定义使用字符串值 username=admin 和 password=secret 的 secretGenerator 来创建 Secret。
cat<
应用包含 kustomization.yaml 目录以创建 Secret 对象。
kubectl apply -k .
解码 Secret:
可以使用 kubectl get secret 命令获取 Secret。例如,获取创建的 secret:
kubectl get secret mysecret -o yaml
输出类似于:
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaquedata:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
解码 password 字段:
echo'MWYyZDFlMmU2N2Rm'| base64 --decode
输出类似于:
1f2d1e2e67df
编辑 Secret:
可以通过下面的命令可以编辑一个已经存在的 secret 。
kubectl edit secrets mysecret
使用 Secret:
Secret 可以作为数据卷被挂载,或作为环境变量 暴露出来以供 Pod 中的容器使用。也可以被系统的其他部分使用,而不直接暴露在 Pod 内。 例如,可以保存凭据,系统的其他部分将用它来代表你与外部系统进行交互。
1. 使用来自卷中的 Secret 值
在 Pod 中使用存放在卷中的 Secret:
创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。
1). 修改 Pod 定义,在 spec.volumes[] 下增加一个卷。可以给这个卷随意命名,spec.volumes[].secret.secretName为 Secret 对象的名字。
2). 修改你的 Pod 定义,在 spec.volumes[] 下增加一个卷。可以给这个卷随意命名, 它的 spec.volumes[].secret.secretName 必须是 Secret 对象的名字。
3). 将 spec.containers[].volumeMounts[] 加到需要用到该 Secret 的容器中。 指定 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 为你想要该 Secret 的目录
4.) 修改镜像并且/或者命令行,让程序从该目录下寻找文件。 Secret 的 data 映射中的每一个键都对应 mountPath 下的一个文件名。
如:
volumes:
-name: foo
secret:
secretName: mysecret
2. 以环境变量的形式使用 Secrets
在一个以环境变量形式使用 Secret 的容器中,Secret 键表现为常规的环境变量,其中 包含 Secret 数据的 base-64 解码值。
3.使用 imagePullSecret
imagePullSecrets 字段中包含一个列表,列举对同一名字空间中的 Secret 的引用。 你可以使用 imagePullSecrets 将包含 Docker(或其他)镜像仓库密码的 Secret 传递给 kubelet。kubelet 使用此信息来替你的 Pod 拉取私有镜像。