kubernetes secret
tags:对象,secret
文章目录
kubernetes secret
1. 概览
1.1 Pod 使用 Secret三种方式
1.2 secret 类型
2. kubectl 创建 Secret
3. 手动创建 Secret
3.1 data
3.2 stringData
3.3 data and stringdata
4 从生成器创建 Secret
4.1 从文件生成 Secret
4.2 基于字符串值来创建 Secret
5. 解码 Secret
6. 编辑 Secret
7. 使用 Secret
7.1 Pod Access Secrets Loaded in a Volume
7.2 将 Secret 键名映射到特定路径
7.3 Secret 文件权限
8. 挂载的 Secret 会被自动更新
9. 以环境变量的形式使用 Secrets
10. 案例
1. 概览
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。
要使用 Secret,Pod 需要引用 Secret。
1.1 Pod 使用 Secret三种方式
- 作为挂载到一个或多个容器上的 卷 中的文件。
- 作为容器的环境变量
- 由 kubelet 在为 Pod 拉取镜像时使用
1.2 secret 类型
创建 Secret 时,您可以使用typeSecret 资源的字段或某些等效的kubectl命令行标志(如果可用)指定其类型。在type一个秘密被用于促进各种机密数据的程序处理。
2. kubectl 创建 Secret
使用generic 子命令来指示OpaqueSecret 类型
# 创建本例中要使用的文件 echo -n 'admin' > ./username.txt echo -n '1f2d1e2e67df' > ./password.txt #第一种 # kubectl create secret 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象。 Secret 对象的名称必须是合法的 DNS 子域名。 kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt # 默认的键名是文件名。你也可以使用 [--from-file=[key=]source] 参数来设置键名。 #第二种 kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt #第三种 kubectl create secret generic dev-db-secret \ --from-literal=username=devuser \ --from-literal=password='S!B\*d$zDsb=' kubectl get secrets kubectl describe secrets/db-user-pass
说明:
特殊字符(例如 $、\、*、= 和 !)可能会被你的 Shell 解析,因此需要转义。 在大多数 Shell 中,对密码进行转义的最简单方式是使用单引号(')将其扩起来。
您无需对文件中保存(–from-file)的密码中的特殊字符执行转义操作。
3. 手动创建 Secret
3.1 data
$ echo -n 'admin' | base64 YWRtaW4= $ echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm
编写一个yaml
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
kubectl apply -f ./secret.yaml
在某些情况下,你可能希望改用 stringData 字段。 此字段允许您将非 base64 编码的字符串直接放入 Secret 中, 并且在创建或更新 Secret 时将为您编码该字符串。
3.2 stringData
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque stringData: config.yaml: |- apiUrl: "https://my.api.com/api/v1" username: {{username}} password: {{password}}
$ kubectl get secret mysecret -o yaml apiVersion: v1 kind: Secret metadata: creationTimestamp: 2018-11-15T20:40:59Z name: mysecret namespace: default resourceVersion: "7225" uid: c280ad2e-e916-11e8-98f2-025000000001 type: Opaque data: config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
3.3 data and stringdata
如果在 data 和 stringData 中都指定了某一字段,则使用 stringData 中的值:
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= stringData: username: administrator
secret 中的生成结果:
apiVersion: v1 kind: Secret metadata: creationTimestamp: 2018-11-15T20:46:46Z name: mysecret namespace: default resourceVersion: "7579" uid: 91460ecb-e917-11e8-98f2-025000000001 type: Opaque data: username: YWRtaW5pc3RyYXRvcg==
其中的 YWRtaW5pc3RyYXRvcg== 解码后即是 administrator。
data 和 stringData 的键必须由字母数字字符 ‘-’, ‘_’ 或者 ‘.’ 组成.
4 从生成器创建 Secret
Kubectl 从 1.14 版本开始支持使用 Kustomize 管理对象。 Kustomize 提供资源生成器创建 Secret 和 ConfigMaps。 Kustomize 生成器要在当前目录内的 kustomization.yaml 中指定。 生成 Secret 之后,使用 kubectl apply 在 API 服务器上创建对象。
4.1 从文件生成 Secret
cat <<EOF >./kustomization.yaml secretGenerator: - name: db-user-pass files: - username.txt - password.txt EOF
应用包含 kustomization.yaml 目录以创建 Secret 对象。
kubectl apply -k . kubectl get secrets
输出类似于:
NAME TYPE DATA AGE db-user-pass-96mffmfh4k Opaque 2 51s $ kubectl describe secrets/db-user-pass-96mffmfh4k Name: db-user-pass Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password.txt: 12 bytes username.txt: 5 bytes
4.2 基于字符串值来创建 Secret
cat <<EOF >./kustomization.yaml secretGenerator: - name: db-user-pass literals: - username=admin - password=secret EOF
应用包含 kustomization.yaml 目录以创建 Secret 对象。
kubectl apply -k . kubectl get secret mysecret -o yaml
5. 解码 Secret
输出类似于:
apiVersion: v1 kind: Secret metadata: creationTimestamp: 2016-01-22T18:41:56Z name: mysecret namespace: default resourceVersion: "164619" uid: cfee02d6-c137-11e5-8d73-42010af00002 type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
解码 password 字段:
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode 输出类似于: 1f2d1e2e67df