K8S 之 Secret
摘要
-
本文介绍 K8S 的 Secret ,本文以 CentOS 8 为例。
Secret 介绍
-
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
-
由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将敏感数据写入非易失性存储。
-
Secret 类似于 ConfigMap 但专门用于保存机密数据。
-
每个 Secret 的尺寸最多为 1MiB
-
在 K8S 中,Secret 有多种类型:本文只讲解
Opaque
类型,其余类型参考[官网]((https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/)。
内置类型 | 用法描述 |
---|---|
Opaque |
用户自定义的任意数据(默认类型) |
kubernetes.io/service-account-token |
自动挂载的服务账号令牌,供 Pod 访问 API 使用 |
kubernetes.io/dockercfg |
序列化的 ~/.dockercfg 文件,用于私有仓库认证(旧格式) |
kubernetes.io/dockerconfigjson |
序列化的 ~/.docker/config.json 文件(推荐) |
kubernetes.io/basic-auth |
存储用户名和密码,用于 HTTP 基本认证 |
kubernetes.io/ssh-auth |
存储 SSH 私钥,用于 SSH 身份认证 |
kubernetes.io/tls |
存储 TLS 密钥和证书,用于 HTTPS 或服务加密通信 |
bootstrap.kubernetes.io/token |
用于 kubelet 加入集群的引导令牌 |
Secret 创建及使用
-
Secret 与 ConfigMap 创建及使用类似,都是存储键值对,但存储内容不同,Secret 存储的是 Base64 编码后的内容。
环境变量引用
-
yaml创建
1 | # mysevret.yaml |
-
命令行创建
1 | # key:value 方式创建,这里 value 值是 明文,k8s 会进行 base64 编码 |
-
将 Secret 中的全部数据作为环境变量使用
1 | # pod.yaml |
-
将 Secret 中的部分数据作为环境变量使用
1 | # pod2.yaml |
-
查看pod日志
1 | $ k logs pods/env-secret |
存储卷引用
-
yaml创建
1 | # secret-configfile.yaml |
-
命令行创建
1 | # 注意这里是 --from-file,作为文件配置,而非环境变量 |
-
Pod 挂载 Secret 为文件
1 | # secret-pod.yaml 文件内容如下: |
-
容器内的
/etc/config/
目录下会有两个文件:
1 | /etc/config/app.properties |
-
如果只想挂载 Secret 中的某些文件,可以通过
items
字段指定:
1 | # secret-pod2.yaml |
后记
-
Secret 的特点与使用方法与 ConfigMap 非常类似。
-
🔍 ConfigMap vs Secret 对比表:
特性 | ConfigMap | Secret |
---|---|---|
用途 | 存储非敏感配置信息(如环境变量、配置文件) | 存储敏感信息(如密码、证书、token) |
数据是否加密 | 否,明文存储(Base64 编码可读) | 否(默认 Base64 编码),可配置加密存储(如使用 KMS) |
字段名 | data / binaryData |
data (需 base64) / stringData (明文) |
可存储的最大大小 | 每个对象最多约 1MB | 每个对象最多约 1MB |
支持的挂载方式 | - 环境变量 - 卷(文件) |
- 环境变量 - 卷(文件) |
默认类型(type) | 无类型字段 | 默认为 Opaque |
可定义为多个文件挂载 | ✅ | ✅ |
默认 RBAC 访问控制强度 | 弱(多数用户/Pod 可读取) | 强(默认受限访问) |
支持的内置类型 | 无 | ✅ 如:kubernetes.io/tls 、kubernetes.io/basic-auth 等 |
是否适合存储密钥/密码 | ❌ 不推荐 | ✅ 推荐 |
可视化明文读取 | ✅ 直接读取 | ✅ 但 Base64 编码后需要解码 |
常见用途示例 | App 配置、日志级别、连接参数等 | 数据库密码、TLS 证书、API Token 等 |