惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
月光博客
月光博客
B
Blog RSS Feed
C
Check Point Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
GbyAI
GbyAI
H
Help Net Security
Y
Y Combinator Blog
I
InfoQ
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
美团技术团队
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
A
About on SuperTechFans
G
Google Developers Blog
爱范儿
爱范儿
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
人人都是产品经理
人人都是产品经理

博客园 - 张占岭

keycloak~通过用户ID直接置换token keycloak~缓存对象的介绍与作用 wso2-apim-mcp2改版分析 mcp1和mcp2对比 为什么前端项目使用ts比js要多了 多个IDP的用户联合方案的分析 apisix~forward-auth外部认证 apisix~response-rewrite响应头重写 springboot~关于构造方法注入和字段注入的选择 apisix~OpenResty各阶段的介绍 keycloak~aud受众字段的作用及如何生成 wso2~关于workbuddy中mcp在wso2中的授权端点 k8s~避免调度资源碎片化 WEB安全~csrf介绍 WEB安全~DPoP的介绍 WEB安全~csp的介绍 什么是中间人攻击 WEB安全~xss的介绍 k8s~pod资源限制和JVM的XMX配置 关于对wso2和keycloak的token交换的调研 keycloak~实现OAuth 2.0 Token Exchange backstage~实体的介绍及它们的关系 backstage~openapi的接入与protobuf的对比 backstage~将java服务添加到backstage backstage~对接github和gitlab backstage~开始一个backstage应用 apisix~graphQL的支持 wso2几个核心项目介绍 docker~BuildKit的介绍 算法~时间戳计算两个日期是否为同天同时同分
k8s~secret资源的使用
张占岭 · 2026-03-31 · via 博客园 - 张占岭

Kubernetes Secret 资源使用详解

1. Secret 基本概念

Secret 是 Kubernetes 中用于存储敏感信息的资源对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMap 类似,但 Secret 的数据是经过 base64 编码存储的。

2. Secret 类型

2.1 内置类型

  • Opaque:默认类型,存储任意用户定义的数据
  • kubernetes.io/service-account-token:服务账号令牌
  • kubernetes.io/dockerconfigjson:Docker 镜像仓库的认证信息
  • kubernetes.io/tls:TLS 证书和私钥
  • bootstrap.kubernetes.io/token:启动引导令牌

3. 创建 Secret 的方法

3.1 通过 kubectl 命令行创建

# 从文件创建
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

# 从文件内容创建
kubectl create secret generic ssh-key-secret \
  --from-file=id_rsa=~/.ssh/id_rsa \
  --from-file=id_rsa.pub=~/.ssh/id_rsa.pub

# 创建 Docker registry secret
kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=admin \
  --docker-password=secret \
  --docker-email=admin@example.com

3.2 通过 YAML 文件创建

# secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  username: YWRtaW4=  # base64编码的 "admin"
  password: c2VjcmV0MTIz
# 应用YAML文件
kubectl apply -f secret-demo.yaml

4. Secret 在 Pod 中的使用方式

4.1 作为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: myapp
    image: nginx
    env:
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: username
    - name: SECRET_PASSWORD
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: password

4.2 挂载为文件(推荐方式)

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: app-secret
      items:  # 可选:选择性挂载特定key
      - key: username
        path: my-username
      - key: password
        path: my-password

4.3 拉取私有镜像

apiVersion: v1
kind: Pod
metadata:
  name: private-reg-pod
spec:
  containers:
  - name: private-app
    image: registry.example.com/private-app:v1
  imagePullSecrets:
  - name: regcred

5. 高级使用技巧

5.1 自动挂载为文件

apiVersion: v1
kind: Pod
metadata:
  name: secret-automount
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secrets"
  volumes:
  - name: secret-volume
    secret:
      secretName: app-secret
      defaultMode: 0400  # 设置文件权限

5.2 使用 stringData 字段(自动base64编码)

apiVersion: v1
kind: Secret
metadata:
  name: stringdata-secret
type: Opaque
stringData:  # 无需手动base64编码
  username: admin
  password: secret123
  config.yaml: |
    database:
      host: localhost
      port: 3306

5.3 从多个 Secret 组合

apiVersion: v1
kind: Pod
metadata:
  name: multiple-secrets
spec:
  containers:
  - name: myapp
    image: nginx
    env:
    - name: DB_CONFIG
      valueFrom:
        configMapKeyRef:
          name: db-config
          key: connection-string
    envFrom:
    - secretRef:
        name: credentials-secret
  volumes:
  - name: secrets-vol
    secret:
      secretName: tls-secret

6. 管理操作

6.1 查看 Secret

# 列出所有 Secret
kubectl get secrets

# 查看详细信息
kubectl describe secret app-secret

# 解码查看内容
kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode

6.2 更新 Secret

# 方法1:编辑现有 Secret
kubectl edit secret app-secret

# 方法2:通过文件更新
kubectl apply -f updated-secret.yaml

6.3 删除 Secret

kubectl delete secret app-secret

7. 最佳实践和安全建议

7.1 安全最佳实践

  1. 加密存储

    # 启用 etcd 加密
    kubectl create secret generic test-secret \
      --from-literal=mykey=mydata \
      --namespace default
    
  2. RBAC 权限控制

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: secret-reader
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    
  3. 使用外部 Secret 管理

    • HashiCorp Vault
    • AWS Secrets Manager
    • Azure Key Vault
    • Google Cloud Secret Manager

7.2 使用建议

  1. 生命周期管理

    # 为 Secret 添加标签便于管理
    apiVersion: v1
    kind: Secret
    metadata:
      name: app-secret
      labels:
        app: myapp
        tier: backend
        environment: production
    type: Opaque
    data:
      password: c2VjcmV0
    
  2. 定期轮换

    # 自动轮换示例脚本
    #!/bin/bash
    NEW_PASSWORD=$(openssl rand -base64 32)
    kubectl patch secret app-secret \
      -p "{\"data\":{\"password\":\"$(echo -n $NEW_PASSWORD | base64)\"}}"
    

8. 注意事项

  1. Base64 不是加密:Secret 仅提供 base64 编码,不是加密
  2. etcd 安全性:确保 etcd 集群的安全性
  3. 访问权限:严格控制对 Secret 的 RBAC 权限
  4. 日志泄露:避免在日志中输出 Secret 内容
  5. Secret 大小限制:单个 Secret 最大 1MB

9. 故障排查

# 检查 Secret 是否被挂载
kubectl exec pod-name -- ls /etc/secrets

# 检查环境变量
kubectl exec pod-name -- env | grep SECRET

# 查看 Pod 事件
kubectl describe pod pod-name

# 验证 Secret 存在
kubectl get secret secret-name

通过合理使用 Secret 资源,可以有效管理 Kubernetes 集群中的敏感信息,提高应用程序的安全性。建议结合具体的业务场景选择合适的 Secret 类型和使用方式。