当前位置: 首页 > article >正文

Kubernetes 中的 Secrets 配置管理

一、Secrets 概述

在 Kubernetes 中,Secrets 是一种包含敏感信息的 API 对象,例如密码、OAuth 令牌、SSH 密钥等。通过使用 Secrets,您可以安全地管理这些敏感信息,避免将它们直接写入 Pod 定义或 Docker 镜像中。

Secrets 具有以下特点:

  • 安全性:Secrets 以加密形式存储在 etcd 数据库中,只有授权的用户和系统组件才能访问。

  • 灵活性:Secrets 可以被挂载为文件或注入为环境变量,以供 Pod 使用。

  • 动态更新:Secrets 可以在不重启 Pod 的情况下更新,但需要重新创建 Pod 以应用新的 Secret。

二、Secrets 的类型

Kubernetes 支持多种类型的 Secrets,主要包括:

  1. Opaque:通用类型,用于存储任意敏感数据。这是最常用的 Secrets 类型。

  2. Service Account:自动创建,包含访问 Kubernetes API 的凭据。

  3. kubernetes.io/dockerconfigjson:用于存储 Docker Registry 的认证信息。

三、Secrets 的创建方式

Secrets 可以通过命令行或 YAML 文件创建。

3.1 命令行创建

使用 kubectl create secret 命令创建 Secrets:

# 创建一个包含用户名和密码的 Opaque Secret
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret

# 创建一个包含 Docker Registry 认证信息的 Secret
kubectl create secret docker-registry reg-secret \
  --docker-server=<registry-server> \
  --docker-username=<username> \
  --docker-password=<password> \
  --docker-email=<email>

3.2 YAML 文件创建

创建一个 YAML 文件定义 Secrets,然后使用 kubectl apply 命令应用:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=  # base64 编码的 admin
  password: c2VjcmV0  # base64 编码的 secret

保存为 db-secret.yaml,然后应用:

kubectl apply -f db-secret.yaml

四、Secrets 在 Pod 中的使用方式

使用 Secrets 作为环境变量挂载为卷以及用于 Docker 私有仓库认证

实验步骤

步骤 1:创建 Secrets

首先,创建一个包含用户名和密码的 Secret。

使用 base64 命令进行编码加密

echo -n "admin" | base64
echo -n "secret" | base64
  1. 创建一个名为 db-secret.yaml 的文件,内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=  # base64 编码的 admin
  password: cGFzc3dvcmQ=  # base64 编码的 secret

注释

  • apiVersion: v1:指定 Kubernetes API 的版本。

  • kind: Secret:指定资源类型为 Secret。

  • metadata.name: db-secret:定义 Secret 的名称。

  • type: Opaque:指定 Secret 的类型为 Opaque。

  • data:包含要存储的键值对,值需要经过 base64 编码。

  1. 应用 YAML 文件创建 Secret:

kubectl apply -f db-secret.yaml
  1. 验证 Secret 是否创建成功:

kubectl get secret db-secret

步骤 2:将 Secret 挂载为卷

  1. 创建一个名为 pod-with-secret-volume.yaml 的文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-secret-volume
spec:
  containers:
  - name: my-container
    image: busybox
    command: ["sh", "-c", "cat /etc/secrets/username && cat /etc/secrets/password && sleep 3600"]
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secrets
  volumes:
  - name: secret-volume
    secret:
      secretName: db-secret

注释

  • volumeMounts:定义容器挂载的卷。

  • mountPath: /etc/secrets:指定挂载路径。

  • volumes:定义卷。

  • secret:指定卷的类型为 Secret。

  • secretName: db-secret:引用的 Secret 名称。

  1. 应用 YAML 文件创建 Pod:

kubectl apply -f pod-with-secret-volume.yaml
  1. 查看 Pod 的日志,验证文件挂载是否成功:

kubectl logs pod-with-secret-volume

预期输出

admin
secret

步骤 3:将 Secret 注入为环境变量

  1. 创建一个名为 pod-with-secret-env.yaml 的文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-secret-env
spec:
  containers:
  - name: my-container
    image: busybox
    command: ["sh", "-c", "env && sleep 3600"]
    env:
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

注释

  • env:定义环境变量列表。

  • name: DB_USERNAME:定义环境变量名为 DB_USERNAME

  • valueFrom.secretKeyRef:从 Secret 中引用键值。

  • name: db-secret:引用的 Secret 名称。

  • key: username:Secret 中的键名。

  1. 应用 YAML 文件创建 Pod:

kubectl apply -f pod-with-secret-env.yaml
  1. 查看 Pod 的日志,验证环境变量是否注入成功:

kubectl logs pod-with-secret-env

预期输出

DB_USERNAME=admin
DB_PASSWORD=secret

步骤 4:使用 Secret 进行 Docker 私有仓库认证

找到 config.json 文件后,将其内容进行 Base64 编码

ls ~/.docker/config.json
base64 ~/.docker/config.json
  1. 创建一个名为 reg-secret.yaml 的文件,内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: reg-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: eyJ2YWx1ZSI6I... # base64 编码的 docker config json

注释

  • type: kubernetes.io/dockerconfigjson:指定 Secret 的类型为 Docker 配置。

  • .dockerconfigjson:包含 Docker 配置的 base64 编码的 JSON 数据。

  1. 应用 YAML 文件创建 Secret:

kubectl apply -f reg-secret.yaml
  1. 创建一个使用私有仓库镜像的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: reg.admin.org/busybox/busybox:latest
    command: ["sh", "-c", "echo 'Hello from container'; sleep 3600"]
  imagePullSecrets:
  - name: reg-secret

注释

  • imagePullSecrets:定义用于拉取镜像的 Secret 列表。

  • name: reg-secret:引用的 Secret 名称。

补充:为什么有时候容器会自动退出: 

  • Kubernetes 会根据镜像的默认配置启动容器。对于 busybox 镜像,其默认行为是启动一个 Shell(通常是 /bin/sh)。因此,容器会启动一个 Shell,但如果没有其他命令或交互式操作,Shell 会立即退出,导致容器关闭。

  • 通过在 YAML 文件中显式指定命令(如 sleep 3600),可以防止容器立即退出

  1. 应用 YAML 文件创建 Pod:

kubectl apply -f pod-with-reg-secret.yaml
  1. 验证 Pod 是否成功拉取并运行:

kubectl get pods

预期输出

NAME         READY   STATUS    RESTARTS   AGE
my-pod       1/1     Running   0          ...

步骤 5:更新和删除 Secrets

更新 Secrets

更新 Secrets 需要删除并重新创建,因为 Secrets 的数据是不可变的。

  1. 删除现有的 Secret:

kubectl delete secret db-secret
  1. 创建一个新的 Secret:

kubectl create secret generic db-secret \
  --from-literal=username=newadmin \
  --from-literal=password=newsecret
删除 Secrets

删除不再需要的 Secrets:

kubectl delete secret db-secret

实验总结

通过本实验,您学习了如何在 Kubernetes 中创建、使用和更新 Secrets。Secrets 是 Kubernetes 中管理敏感信息的重要机制,通过合理使用 Secrets,您可以提高集群的安全性,避免敏感信息泄露。


http://www.kler.cn/a/582334.html

相关文章:

  • Django部署Filemanagement
  • 共享经济时代下,鲲鹏共享科技如何逆袭改命?
  • 操作系统知识总结(三)——内存
  • 【数据结构】3顺序表
  • 从零开始学机器学习——构建一个推荐web应用
  • 华为HCIE认证用处大吗?
  • 【A2DP】深入解析A2DP协议中的音频流处理
  • Redis实现高并发排行榜的功能
  • 侯捷 C++ 课程学习笔记:C++ 新标准11/14
  • 使用AI一步一步实现若依前端(8)
  • vue3 二次封装uni-ui中的组件,并且组件中有 v-model 的解决方法
  • Vue 实现AI对话和AI绘图(AIGC)人工智能
  • Excel多级联动下拉菜单设置
  • C盘清理技巧分享:释放空间,提升电脑性能
  • Networking Based ISAC Hardware Testbed and Performance Evaluation
  • [动手学习深度学习]13.丢弃法 Dropout
  • 修改jupyter notebook的工作空间
  • 二级Python通关秘籍:字符串操作符/函数/方法全解析与实战演练
  • Spike RISC-V ISA 模拟器
  • 三级嵌入式学习ing 考点25、26