K8S Secret 快速开始

一、什么是 Secret

Kubernetes(K8s)中的 Secret 是一种用于存储和管理敏感信息(如密码、令牌、证书、API 密钥等)的资源对象。它避免了将敏感数据明文写入配置文件、镜像或代码中,提供了一种更安全的方式来处理机密信息。

二、主要用途

  • 安全需求:敏感信息(如数据库密码、API 令牌)不应以明文形式硬编码在配置文件或镜像中,否则可能导致泄露。
  • 解耦配置与代码:将敏感数据与应用逻辑分离,便于统一管理和更新。
  • 标准化管理:K8s 提供内置机制管理 Secret,支持通过 API 或命令行动态创建、更新和分发。

三、核心特性

  • 数据编码
  • 默认使用 Base64 编码存储数据(非加密,需结合其他加密手段,如 etcd 加密或外部密钥管理系统)。
  • 数据以键值对(Key-Value)形式存储,支持通过环境变量或 Volume 挂载到 Pod。
  • 作用域
  • Secret 属于特定 Namespace(命名空间),默认仅在所属 Namespace 内可见。
  • 类型
  • 常见三种内置 Secret 类型:
  • Opaque(通用型):用于存储任意键值对,默认类型。
  • kubernetes.io/service-account-token:自动为 ServiceAccount 生成的令牌,用于访问 API Server。
  • kubernetes.io/tls:用于存储 TLS 证书和私钥,供 Ingress、Service 等使用。

四、 创建 Secret 的常用方式

4.1. 通过 kubectl 命令创建

通过 kubectl 命令创建,需要为其设置命令参数。

bash 复制代码
kubectl create secret --help

  • generic:用来创建 Opaque类型的 Secret。用于存储任意键值对。
  • tls:用来创建 kubernetes.io/tls 类型的Secret。用于存储 TLS 证书和私钥。
  • docker-registry:若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创建。

4.1.1、直接指定字面量(适合小数据)

bash 复制代码
# 创建 Opaque 类型 Secret,键值对直接通过 --from-literal 指定
kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=123456

已用 Base64 编码。

4.1.2、从文件加载(适合文件型机密,如证书、密钥)

bash 复制代码
vim username.txt
# 输入 admin
vim password.txt
# 输入 123456

# 从单个文件创建(文件名作为键),值为文件内容
kubectl create secret generic db-credentials --from-file=username.txt --from-file=password.txt

4.1.3、从目录创建(目录下所有文件作为键值对)

bash 复制代码
mkdir dir
cd dir
vim usr.txt
# 输入 admin
vim pwd.txt
# 输入 123456

kubectl create secret generic app-secret --from-file=.

4.2、通过 YAML 清单创建

javascript 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: yml-secret
  namespace: default
type: Opaque  # 类型,可选 Opaque、service-account-token、tls 等
data:
  # 键值对需手动进行 Base64 编码
  username: YWRtaW4=  # 明文 "admin" 的 Base64 编码
  password: MTIzNDU2  # 明文 "123456" 的 Base64 编码
  • 编码方法:echo -n "明文" | base64
  • -n 不换行的意思。
  • echo -n "密文" | base64 -d
  • -d decode 的意思。

五、在 Pod 中使用 Secret

5.1、作为环境变量注入

javascript 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  restartPolicy: Never
  containers:
  - name: app
    image: alpine:latest  
    imagePullPolicy: IfNotPresent
    command: ["sleep", "3600"]
    env:
    - name: DB_USERNAME  # 环境变量名
      valueFrom:
        secretKeyRef:
          name: my-secret  # Secret 名称
          key: username    # Secret 中的键
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password
  • 进入容器查看环境变量
bash 复制代码
kubectl exec -it secret-env-pod -- /bin/sh
/ # env

5.2、作为 Volume 挂载

javascript 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  restartPolicy: Never
  volumes:
  - name: secret-volume
    secret:
      secretName: yml-secret  # 指定 Secret 名称
  containers:
  - name: app
    image: alpine:latest  
    imagePullPolicy: IfNotPresent
    command: ["sleep", "3600"]
    volumeMounts:
    - name: secret-volume # 跟卷的名称一致
      mountPath: "/etc/secrets"  # 挂载路径
      readOnly: true  # 必须设为只读
  • 进入容器查看挂载路径
bash 复制代码
kubectl exec -it secret-volume-pod -- /bin/sh

数据已帮我们解密。

相关推荐
风落无尘3 小时前
Stable Diffusion WebUI & ComfyUI 完整安装教程:官方部署+一键整合包+Docker容器化(2026最新)
docker·容器·stable diffusion
CodeMartain8 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
牛奶咖啡139 小时前
k8s容器编排技术实践——使用containerd作为容器运行时部署k8s集群
kubernetes·k8s的安装部署·开启系统的ipvs支持·安装containerd·containerd配置加速器·安装k8s的工具·安装calico网络插件
万里侯9 小时前
云原生数据备份与恢复:保障数据安全的最佳实践
微服务·容器·k8s
llrraa20109 小时前
配置docker国内镜像源
运维·docker·容器
阿里云云原生10 小时前
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
云原生
2301_7807896610 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
35岁程序员的自救之路11 小时前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生
珂玥c12 小时前
k8s集群ingress碎碎念
云原生·容器·kubernetes
佳杰云星12 小时前
如何给大模型集群选“大脑”?智算调度与管理平台 10 维选型指南(附选型评分表)
人工智能·kubernetes·大模型·云计算·gpu·算力调度·智算中心