官方文档: Secret 配置
Secret
Secret 对象类型用来保存敏感信息,例如密码,OAuth 令牌和 SSH 密钥。将这些信息放在 Secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Secret 是一种包含少量敏感信息例如密码,令牌或密钥的对象。这样的信息可能会被放在 Pod 文件或者镜像中。用户可以创建 Secret,同时系统也创建了一些 Secret。
注意:Kubernetes Secret 默认情况下存储为 base64-编码的、非加密的字符串。 默认情况下,能够访问 API 的任何人,或者能够访问 Kubernetes 下层数据存储(etcd) 的任何人都可以以明文形式读取这些数据。
管理 Secret
使用 kubectl 管理 secret
创建 Secret
一个 Secret 可以包含 Pod 访问数据库所需的用户凭证。例如,由用户名和密码组成的数据库连接字符串。如下
1 | echo -n 'admin' > ./username.txt |
上面两个命令中的 -n
标志确保生成的文件在文本末尾不包含额外换行符。这一点很重要,因为当 kubectl 读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
使用 kubectl create secret
命令将这些文件打包成一个 Secret 并在 API 服务器上创建对象。
1 | # kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt |
默认密钥名称是文件名,可以选择使用 --fromfile=[key=]source
的方式来设置密钥名称。例如
1 | # kubectl create secret generic db-user-pass --from-file=username=./username.txt --from-file=password=./password.txt |
无需转义
--from-file
文件中的密码的特殊字符
还可以使用 --from-literal=<key>=<value>
标签提供 Secret 数据。可以多次使用此标签,提供多个键值对。请注意,特殊字符由 shell 解释执行,而且需要转义。如果使用单引号将数据引用起来,则不需要进行转义。如下
1 | # kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb=' |
验证 Secret
检查 secret 是否已创建
1
2
3# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 6m21s查看 secret 的描述
1
2
3
4
5
6
7
8
9
10
11
12# kubectl describe secrets db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
kubectl get 和 kubectl describe 命令默认不显示 secret 的内容。这是为了防止 secret 被意外暴露给旁观者或者存储在终端日志中。
解码 secret
要查看我们刚刚创建的 Secret 的内容,可以运行以下命令
以 json 或者 yaml 格式输出 secret 的内容,这里选择 json 格式输出
1
2
3# kubectl get secrets db-user-pass -o jsonpath='{.data}'
{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="}解压需要的内容,比如解码 password
1 | # echo "MWYyZDFlMmU2N2Rm" | base64 --decode |
清理 Secret
1 | # kubectl delete secrets db-user-pass |
使用配置文件管理 Secret
创建配置文件
可以先用 JSON 或 YAML 格式在文件中创建 Secret,然后创建该对象。Secret 资源包含2个键值对:data
和 stringData
。data 字段用来存储 base64 编码的任意数据。提供 stringData 字段时为了方便,它允许 Secret 使用未编码的字符串。data 和 stringData 的键必需由字母,数字,-
,_
或 .
组成。
编写一个 Secret 配置文件,如下所示
1
2
3
4
5
6
7
8apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm注意:Secret 数据的 JSON 和 YAML 序列化结果是以 base64 编码的。 换行符在这些字符串中无效,必须省略。 在 Darwin/macOS 上使用 base64 工具时,用户不应该使用
-b
选项分割长行。相反地,Linux 用户应该在 base64 地命令中添加-w 0
选项, 或者在-w
选项不可用的情况下,输入base64 | tr -d '\n'
。如果想使用 Secret 存储配置文件,然后在部署过程中,填入部分内容得到该配置文件,则可以如下所示
例如,如果你的应用程序使用以下配置文件
1
2
3apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"那么可以使用以下定义将其存储在 Secret 中
1
2
3
4
5
6
7
8
9
10apiVersion: v1
kind: Secret
metedata:
name: mysecret
type: Opaque
stringData:
config.yaml: |
apiUsr: "https://my.api.com/api/v1"
username: <user>
password: <password>
创建 Secret 对象
现在使用 kubectl apply
创建 Secret
1 | # kubectl apply -f ./my-secret.yaml |
检查 Secret
stringData 字段时只写的,获取 Secret 时,此字段永远不会输出。如下:
1 | # kubectl get secrets mysecret -o yaml |
命令 kubectl get
和 kubectl describe
默认不显示 Secret 的内容。 这是为了防止 Secret 意外地暴露给旁观者或者保存在终端日志中。
如果在 data
和 stringData
中都指定了一个字段,比如 username,那么字段值来自 stringData。 例如,下面的 Secret 定义:
1 | apiVersion: v1 |
生成的 Secret 内容如下
1 | apiVersion: v1 |
其中 YWRtaW5pc3RyYXRvcg==
解码后的内容为 administrator
。
Secret 的用途
ImagePullSecret: Pod 拉取私有镜像仓库时使用的账户密码,里面的账户信息会传递给 kubelet,然后 kubelet 就可以拉取有密码的仓库里面的镜像。
创建一个 docker registry 的 secret
1
2
3
4
5kubectl create secret docker-registry docker-secret \
--docker-server=hub.docker.com \
--docker-username=zx19904227511 \
--docker-password=DOCKER_PASSWORD \
--docker-email=2350686113@qq.com查看生成的 secret
1
2
3
4
5
6
7
8
9
10
11
12
13# kubectl get secrets docker-secret -oyaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJodWIuZG9ja2VyLmNvbSI6eyJ1c2VybmFtZSI6Inp4MTk5MDQyMjc1MTEiLCJwYXNzd29yZCI6ImZsenhfM1FDIUAjIiwiZW1haWwiOiIyMzUwNjg2MTEzQHFxLmNvbSIsImF1dGgiOiJlbmd4T1Rrd05ESXlOelV4TVRwbWJIcDRYek5SUXlGQUl3PT0ifX19
kind: Secret
metadata:
creationTimestamp: "2021-04-13T06:05:53Z"
name: docker-secret
namespace: default
resourceVersion: "3526905"
selfLink: /api/v1/namespaces/default/secrets/docker-secret
uid: 10d29b43-81aa-45dc-8b19-0b1fefe50f2f
type: kubernetes.io/dockerconfigjson.dockerconfigjson
字段的值是 Docker 凭证的 base64 表示形式。创建 Pod 时使用 Secret
1
2
3
4
5
6
7
8
9
10apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: test-pod-secret
image: zx19904227511/web:latest
imagePullSecrets:
- name: docker-secret创建一个 Pod 并查询 Pod 的状态
1
2
3
4
5
6# kubectl create -f pod-secret.yaml
pod/private-reg created
# kubectl get pod private-reg
NAME READY STATUS RESTARTS AGE
private-reg 1/1 Running 0 101s