在K8S中,Secret有哪些使用方式?

在 Kubernetes 中,Secret 是用于存储敏感数据(如密码、令牌、证书)的安全对象。以下是其核心使用方式及场景详解,用通俗比喻辅助理解:


一、创建 Secret 的四种方式

1. 手动声明(YAML 文件)

适用场景:预定义固定密钥或证书。

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque  # 通用类型
data:
  username: YWRtaW4=      # admin (base64编码)
  password: MWYyZDFlMmU=  # 1f2d1e2e (base64编码)

操作

echo -n "admin" | base64   # 生成编码值
kubectl apply -f secret.yaml

2. 命令行快速创建(kubectl create secret

适用场景:临时生成测试密钥。

# 创建通用密钥
kubectl create secret generic api-key \
  --from-literal=token=s3cr3t

# 从文件创建(如证书)
kubectl create secret tls tls-cert \
  --cert=server.crt --key=server.key

3. 从文件/目录生成

适用场景:批量加载配置文件或证书。

kubectl create secret generic config-files \
  --from-file=./configs/  # 加载整个目录

4. Kustomize 加密管理

适用场景:GitOps 中安全存储 Secret。

# kustomization.yaml
secretGenerator:
- name: app-secrets
  files:
    - db-password.txt

二、在 Pod 中使用 Secret 的核心方式

1. 作为环境变量注入

场景:应用代码直接读取环境变量(如数据库密码)。

env:
  - name: DB_USER
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: username

⚠️ 风险:环境变量可能被进程转储或日志记录(不推荐高敏感数据)。

2. 挂载为文件(Volume)

场景:安全传递证书、配置文件。

volumes:
  - name: secret-vol
    secret:
      secretName: tls-cert
containers:
  volumeMounts:
    - name: secret-vol
      mountPath: "/etc/certs"
      readOnly: true

文件结构

/etc/certs/
  ├── tls.crt    # 对应 Secret 中的 key
  └── tls.key

✅ 优势:避免内存泄露,文件权限可控。

3. 拉取私有镜像仓库认证

场景:从私有仓库(如 Harbor)拉取镜像。

# 创建 docker-registry 类型 Secret
kubectl create secret docker-registry reg-cred \
  --docker-server=registry.example.com \
  --docker-username=admin \
  --docker-password=passwd

在 Pod 中引用

imagePullSecrets:
  - name: reg-cred

4. Service Account 关联 Secret

场景:Pod 访问 Kubernetes API 的权限控制。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-admin
secrets:
  - name: api-token-secret  # 手动关联 Secret

三、特殊类型 Secret 及用途

Secret 类型 用途 示例字段
Opaque 通用敏感数据(默认) data: {key: value}
kubernetes.io/tls TLS 证书 tls.crt, tls.key
kubernetes.io/dockerconfigjson 私有镜像仓库认证 .dockerconfigjson
kubernetes.io/service-account-token Service Account 令牌 token, ca.crt
kubernetes.io/basic-auth 基础认证凭据 username, password

四、高级安全实践

1. 加密静态 Secret

目的:保护 etcd 中的存储数据。
方法:启用 KMS 或云提供商密钥加密

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources: ["secrets"]
    providers:
      - kms:  # 使用 AWS KMS
          key: "arn:aws:kms:us-east-1:123456789:key/abcd1234..."

2. 细粒度权限控制 (RBAC)

场景:限制特定命名空间访问 Secret。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]  # 仅允许读权限

3. 与外部系统集成

方案

  • Vault Agent:动态生成短期 Secret。
  • External Secrets Operator:从 AWS Secrets Manager/Hashicorp Vault 同步。
# 使用 ExternalSecret (第三方工具)
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
spec:
  secretStoreRef:
    name: vault-backend
  target:
    name: db-credentials
  data:
    - secretKey: password
      remoteRef:
        key: /dev/database
        property: password

五、使用 Secret 的注意事项

  1. 编码 ≠ 加密
    Base64 仅是编码,可通过 echo YWRtaW4= | base64 -d 轻松解码。
  2. 防日志泄露
    避免 kubectl get secret 暴露内容,使用 kubectl get secret -o yaml 查看编码值。
  3. 最小权限挂载
    挂载 Volume 时设置 readOnly: true
  4. 定期轮换
    结合 CI/CD 自动更新 Secret(如证书过期前更新)。
  5. 避免硬编码
    切勿在 Dockerfile 或代码中写入密钥。

六、替代方案对比

方案 适用场景 优势
Kubernetes Secret 简单密钥、TLS 证书 原生集成,易用
Hashicorp Vault 动态密钥、审计日志 短期租赁密钥、精细权限控制
Cloud Secrets Manager 云原生应用(如 AWS/Azure) 无缝集成 IAM 角色,自动加密

💡 总结
Secret 是 Kubernetes 敏感数据管理的基础工具,核心使用链:
创建 → 注入(环境变量/Volume)→ 访问控制 → 加密保护
生产环境务必结合 加密存储 + RBAC + 外部密钥管理 构建纵深防御!

posted @ 2025-08-16 21:56  天道酬勤zjh  阅读(68)  评论(0)    收藏  举报