k8s存储介绍(二)Secret

Kubernetes(K8s)提供了一种安全的方式来存储和管理敏感信息,如密码、OAuth 令牌和 SSH 密钥,这就是 Secret。使用 Secret 可以避免将敏感数据硬编码到 Pod 规范或容器镜像中,从而提高安全性和可管理性。

1. Secret 的类型

K8s 支持多种类型的 Secret,主要包括:

2. 创建 Secret 的方式

K8s 支持三种主要方式创建 Secret:

2.1 使用 kubectl 命令创建 Secret

示例 1:创建 Opaque 类型的 Secret
复制代码
kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

上述命令创建了一个名为 my-secret 的 Secret,其中包含 usernamepassword 两个键值对。

示例 2:从文件创建 Secret
复制代码
echo -n "admin" > username.txt
echo -n "secret123" > password.txt
kubectl create secret generic my-secret-from-file \
  --from-file=username.txt \
  --from-file=password.txt

2.2 使用 YAML 清单创建 Secret

我们可以使用 YAML 文件定义 Secret,例如:

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: default
type: Opaque
data:
  username: YWRtaW4=  # "admin" 的 base64 编码
  password: c2VjcmV0MTIz  # "secret123" 的 base64 编码

然后使用 kubectl apply -f my-secret.yaml 创建该 Secret。

2.3 通过 API 或 SDK 创建 Secret

在编程环境中,我们可以使用 Kubernetes API 或者客户端 SDK(如 Python、Go 语言的 SDK)来创建 Secret。

3. 在 Pod 中使用 Secret

Secret 创建后,可以通过环境变量挂载为文件的方式供 Pod 使用。

3.1 通过环境变量使用 Secret

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: SECRET_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

3.2 以文件方式挂载 Secret

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secret"
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

这样,Secret 的数据会被挂载到 /etc/secret 目录下,每个键都会成为该目录下的一个文件,文件内容就是解码后的值。

4. 更新 Secret

Kubernetes 不支持直接更新 Secret,而是需要删除并重新创建。

复制代码
kubectl delete secret my-secret
kubectl create secret generic my-secret --from-literal=username=newadmin --from-literal=password=newsecret123

或者使用 kubectl apply -f my-secret.yaml 进行更新。

5. 保护 Secret 的最佳实践

  1. 使用 RBAC 控制访问:确保只有需要访问 Secret 的用户和服务账户才有权限。

  2. 避免直接暴露 Secret:尽量通过 Pod 挂载,而不是打印或存储到日志。

  3. 使用加密存储 Secret:启用 Kubernetes etcd 加密,以保护存储在 etcd 中的 Secret。

  4. 定期轮换 Secret:定期更新 Secret 并更新相关的 Pod。

  5. 使用外部 Secret 管理工具:如 HashiCorp Vault、AWS Secrets Manager 或 Azure Key Vault。

6. 结论

Kubernetes Secret 提供了一种安全、灵活的方式来管理敏感信息。通过不同的类型、创建方式和使用方式,可以满足不同的需求,同时遵循最佳实践可以确保 Secret 的安全性。

相关推荐
阿里云云原生3 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
蝎子莱莱爱打怪3 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀3 天前
Docker部署Nacos
docker·容器
缓解AI焦虑3 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
阿里云云原生3 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生3 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生3 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生3 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
1candobetter4 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
~莫子4 天前
Haproxy七层负载详解+实验详细代码
云原生