【一起来学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 \
  [email protected]
(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使用详解

相关推荐
菠萝炒饭pineapple-boss41 分钟前
在Kubernetes 1.26 上使用 StatefulSet 部署 MySQL8
mysql·云原生·容器·kubernetes
qq7590353662 小时前
2025 centos系统安装docker并迁移docker,docker安装到指定的目录以及文件迁移,docker迁移文件
docker·eureka·centos
SG.xf3 小时前
k8s中的通信与调度
云原生·容器·kubernetes
Gold Steps.3 小时前
K8S遇到过的比较深刻的Pod问题
云原生·容器·kubernetes·故障处理
曹天骄4 小时前
Kubernetes Init 容器:实现 Nginx 和 PHP 对 MySQL 的依赖检查
nginx·kubernetes·php
弧襪4 小时前
基于 kubekey -实现懒人一键部署K8S集群
云原生·容器·kubernetes·k8s部署
斯普信云原生组4 小时前
K8S-etcd备份还原操作手册
容器·kubernetes·etcd
极客先躯4 小时前
高级java每日一道面试题-2025年3月07日-微服务篇[Eureka篇]-Eureka Server和Eureka Client关系?
java·微服务·eureka
桂月二二5 小时前
云原生算力引擎:分布式推理的流体动力学
分布式·云原生
小刘爱喇石( ˝ᗢ̈˝ )6 小时前
k8s中service概述(一)ClusterIP
云原生·容器·kubernetes