【一起来学kubernetes】21、Secret使用详解


Secret 的详细介绍

Secret 是 Kubernetes 中用于存储和管理敏感信息(如密码、令牌、密钥等)的资源对象。Secret的设计目的是为了安全地存储和传输敏感信息,如密码、API密钥、证书等。这些信息通常不应该直接硬编码在配置文件或镜像中,而应通过Secret进行管理和使用。


1. Secret 的核心特性

敏感数据存储 :存储密码、API 密钥、TLS 证书、SSH 密钥等。

与 Pod 解耦 :Secret 独立于 Pod 定义,避免敏感信息硬编码。

Base64 编码 :数据默认以 Base64 编码存储(非加密,需配合集群安全策略)。

类型化支持 :支持多种预定义类型(如 Opaquedocker-registrytls 等)。


2. Secret 的常见类型
类型 用途
Opaque 默认类型,存储任意用户定义的敏感数据(键值对)。
kubernetes.io/dockerconfigjson 存储 Docker 镜像仓库的认证信息(用于 docker pull 鉴权)。
kubernetes.io/tls 存储 TLS 证书和私钥(用于 HTTPS 服务)。
kubernetes.io/service-account-token 服务账号令牌,用于 Pod 与 API Server 的认证。

3. 创建 Secret 的常用方法
(1) 通过 kubectl 命令行创建
bash 复制代码
# 从文件创建(自动 Base64 编码)
kubectl create secret generic my-secret \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

# 从字面量创建
kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password='S!B\*d$zDsb='

# 创建 Docker 仓库认证 Secret
kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=admin \
  --docker-password=123456 \
  --docker-email=user@example.com
(2) 通过 YAML 文件定义
yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque  # 默认为 Opaque
data:
  username: YWRtaW4=          # Base64 编码的 "admin"
  password: UyFCX2R6RHNiPQ==  # Base64 编码的 "S!B_d$zDsb="
(3) API

Kubernetes提供了丰富的API接口,可以通过编程方式创建和管理Secret。


4. 在 Pod 中使用 Secret
(1) 作为环境变量
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: my-secret    # Secret 名称
            key: username     # Secret 中的键
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: my-secret
            key: password
(2) 挂载为 Volume 文件
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: nginx
    volumeMounts:
      - name: secret-volume
        mountPath: "/etc/secret"
        readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret   # Secret 名称
      # 可选:指定 keys,默认挂载所有键
      items:
      - key: username
        path: my-username     # 文件名为 my-username
      - key: password
        path: my-password
(3) 命令行参数

敏感数据也可以作为命令行参数传递给容器,但这种方式相对容易在日志或命令行界面中暴露,因此应谨慎使用。


5. Secret 的安全管理

加密存储

• 默认情况下,Secret 数据以 Base64 编码存储在 etcd 中,未加密。

• 启用 etcd 加密 或使用 KMS 提供商 实现静态加密(需配置 Kubernetes 集群)。

RBAC 控制

通过 Role-Based Access Control (RBAC) 限制对 Secret 的访问权限。

最小权限原则

仅向 Pod 和用户授予必要的 Secret 访问权限。


6. 最佳实践
  1. 避免将 Secret 提交到版本控制系统

    使用 CI/CD 工具动态注入 Secret,或通过 Secret 管理工具(如 HashiCorp Vault)。

  2. 限制 Secret 的暴露范围

    • 使用 volumeMount 而非环境变量(环境变量可能被日志记录)。

    • 为不同服务分配不同的 Secret。

  3. 定期轮换 Secret

    更新 Secret 后,重启相关 Pod 以加载新数据(若使用环境变量需重启 Pod,Volume 挂载可能自动更新)。

  4. 使用 TLS Secrets 保护通信

    为 Ingress 或 Service 配置 TLS 证书。


7. 与 ConfigMap 的区别
特性 Secret ConfigMap
数据类型 敏感信息(Base64 编码) 非敏感配置(明文)
典型用途 密码、令牌、密钥 配置文件、命令行参数、环境变量
存储安全 建议加密存储 无需加密
YAML 字段 data(Base64)或 stringData(明文) data(明文)

8. 示例:使用 TLS Secret 配置 HTTPS
yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  tls.crt: <Base64 编码的证书>
  tls.key: <Base64 编码的私钥>

# 在 Ingress 中引用
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

通过合理使用 Secret,可以显著提升 Kubernetes 应用的安全性,确保敏感信息在存储、传输和使用过程中的机密性。

9. 拓展

【一起来学kubernetes】19、Pod使用详解
【一起来学kubernetes】11、Deployment使用详解

相关推荐
飞翔沫沫情1 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海7 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
摇滚侠8 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
我叫张小白。9 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠9 小时前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙9 小时前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生
Geek-Chow9 小时前
微服务认证与授权:08 — OPA(PDP)
微服务·云原生·架构
阿标在干嘛10 小时前
100+微服务的统一出入口:政策快报平台的API网关设计
微服务·云原生·架构
摇滚侠10 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 26-40
java·云原生·kubernetes
极***技10 小时前
2026云原生核心!Go高并发限流实战,从原理到落地
开发语言·云原生·golang