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 的安全性。

相关推荐
MickeyCV3 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
藥瓿亭4 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_809798324 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣4 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞5 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技7 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
江湖有缘7 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
猫咪老师19958 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
Nazi68 小时前
docker数据管理
运维·docker·容器
洛神灬殇10 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构