适用于 AI/ML 工作负载的有状态 KES

在此概念验证 (POC) 中,我们将探讨在 Kubernetes (k8s) 生态系统中安装和管理有状态密钥加密服务 (KES)。本指南促进了加密操作的无缝衔接,而不会将敏感的密钥材料暴露给使用型应用程序。

在 Kubernetes 中以有状态配置实现 KES 可确保加密密钥在 Pod 生命周期事件和重新启动期间的持久性。此设置提供了体系结构弹性,这在不依赖外部密钥管理系统 (KMS) 的环境中尤为重要。

当您有数百万亿个对象从 AI/ML 工作负载(例如LLMs)生成时,由于数百个应用程序同时访问它们,您需要确保数据加密/解密层不会成为瓶颈,并且尽可能快,因为每个对象都需要自己唯一的密钥。通过将这些潜在的数十亿个密钥存储在有状态的 KES 后端中,即使 KMS 长时间脱机,密钥也可以保存到 KES,直到 KMS 重新联机。

先决条件

在继续之前,请确保您具备:

  • 已安装并配置 Kubernetes CLI (kubectl)。

  • 使用适当的权限访问 Kubernetes 集群。

  • MinIO Operator 和 CLI (mc) 已准备好部署。

  • Kubernetes 和加密概念的基本知识。

部署 MinIO Operator

设置 Kubernetes 环境

删除上一个集群

若要避免冲突,请删除任何现有群集:

kind delete clusters kind
创建新集群

使用以下 kind-config.yaml 文件设置具有所需配置的全新 Kubernetes 集群:


kind create cluster --config ~/operator/testing/kind-config.yaml

部署 MinIO Operator

使用 kubectl 部署 MinIO Operator 以管理集群中的 MinIO 实例:


kubectl apply -k github.com/minio/operator/

部署 MinIO 租户

使用适合开发和测试目的的轻量级配置部署 MinIO 租户:


kubectl apply -k github.com/minio/operator/examples/kustomization/tenant-lite

配置密钥加密服务 (KES)

创建 Ubuntu Pod

部署 Ubuntu Pod 以在 MinIO 租户命名空间中托管 KES 服务:

cat <<EOF | kubectl apply -f -

apiVersion: v1

kind: Pod

metadata:

  name: ubuntu

  namespace: tenant-lite

  labels:

	app: ubuntu

spec:

  containers:

  - image: ubuntu

	command:

  	- "sleep"

  	- "604800"

	imagePullPolicy: IfNotPresent

	name: ubuntu

  restartPolicy: Always

EOF

安装 KES 和 mc

在 Ubuntu pod 中执行以下命令以安装 KES 和 MinIO 客户端 (mc):


apt update

apt install wget

wget https://github.com/minio/kes/releases/latest/download/kes-linux-amd64

mv kes-linux-amd64 kes

chmod +x kes

mv kes /usr/local/bin/kes

wget https://dl.min.io/client/mc/release/linux-amd64/mc

chmod +x mc

mv mc /usr/local/bin/mc

为 KES 配置持久性存储

持久性目录创建

在 Ubuntu pod 中为 KES 配置和数据文件创建一个目录,其中 KES 位于:

rm -rf ~/kes

mkdir ~/kes

cd ~/kes

touch init.yml

身份管理

生成 KES 和 MinIO 身份验证所需的必要标识:

cd ~/kes

kes identity new --key sys-admin.key --cert sys-admin.crt kes-sys-admin

kes identity new --key minio-admin.key --cert minio-admin.crt minio-admin

kes identity new --key minio.key --cert minio.crt minio

kes identity new --ip "10.244.2.7" localhost # will generate private.key and public.crt

                       	|

                       	|____ IP Address of the Ubuntu Pod.


预期有 4 个标识。

root@ubuntu:/# cd ~/kes

root@ubuntu:~/kes# ls

data  init.yml  minio-admin.crt  minio-admin.key  minio.crt  minio.key  private.key  public.crt  sys-admin.crt  sys-admin.key

                  	|           	|          	|      	|                                	|            	|

                  	|           	|          	|__________|___ minio                       	|________________|___ kes-sys-admin

                  	|           	|

                  	|_______________|___ minio-admin

root@ubuntu:~/kes#

创建 KES 解封密钥。


cat /dev/urandom | head -c 32 | base64 # put the result in the .bashrc

vi ~/.bashrc

export KES_UNSEAL_KEY=<VALUE-FROM-ABOVE-COMMAND>

source ~/.bashrc

echo $KES_UNSEAL_KEY # it should print the value

初始化 KES 部署

KES 配置 - 编辑/创建 KES 配置文件

通过设置必要的配置参数来配置 KES 服务:

cd ~/kes

echo "version: v1" > ~/kes/init.yml

echo "address: 0.0.0.0:7373" >> ~/kes/init.yml

echo "" >> ~/kes/init.yml

echo "tls:" >> ~/kes/init.yml

echo "  key: private.key" >> ~/kes/init.yml

echo "  cert: public.crt" >> ~/kes/init.yml

echo "  client:" >> ~/kes/init.yml

echo "	verify_cert: false" >> ~/kes/init.yml

echo "" >> ~/kes/init.yml

echo "system:" >> ~/kes/init.yml

echo "  admin:" >> ~/kes/init.yml

echo "	identity: $(kes identity of sys-admin.crt)" >> ~/kes/init.yml

echo "" >> ~/kes/init.yml

echo "unseal:" >> ~/kes/init.yml

echo "  environment:" >> ~/kes/init.yml

echo "	name: KES_UNSEAL_KEY" >> ~/kes/init.yml

echo "" >> ~/kes/init.yml

echo "enclave:" >> ~/kes/init.yml

echo "  default:" >> ~/kes/init.yml

echo "	admin:" >> ~/kes/init.yml

echo "  	identity: $(kes identity of minio-admin.crt)" >> ~/kes/init.yml

echo "	policy:" >> ~/kes/init.yml

echo "  	minio:" >> ~/kes/init.yml

echo "    	allow:" >> ~/kes/init.yml

echo "    	- /v1/api" >> ~/kes/init.yml

echo "    	- /v1/log/audit" >> ~/kes/init.yml

echo "    	- /v1/log/error" >> ~/kes/init.yml

echo "    	- /v1/key/create/*" >> ~/kes/init.yml

echo "    	- /v1/key/generate/*" >> ~/kes/init.yml

echo "    	- /v1/key/decrypt/*" >> ~/kes/init.yml

echo "    	- /v1/key/bulk/decrypt/*" >> ~/kes/init.yml
初始化

使用新创建的配置文件初始化 KES 服务器:


cd ~/kes # where init.yml is saved

kes init --config init.yml ~/kes/data

预期为


root@ubuntu:~/kes# cd ~/kes # where init.yml is saved

kes init --config init.yml ~/kes/data

TLS:

  · Private Key:  private.key

  · Certificate:  public.crt


System:

  · Identity:  1a65f6f86c3268b30528fe4aab88fc6994730346e1c1863052fa3fa192d77d3e


Unseal:

  · Environment:  KES_UNSEAL_KEY


╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮

│                                                    	Initialized KES v0.22.3 in /root/kes/data                                                    	│

╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

root@ubuntu:~/kes#

启动 KES 服务器

启动 KES 服务器并验证其是否正常运行:

kes server ~/kes/data

预期为:


root@ubuntu:~/kes# kes server ~/kes/data

Copyright  MinIO, Inc.  https://min.io

License	GNU AGPLv3   https://www.gnu.org/licenses/agpl-3.0.html

Version	v0.22.3  	linux/amd64


Endpoints  https://127.0.0.1:7373

       	https://10.244.4.2:7373


mTLS   	skip verify  Client certificates are not verified

Mem Lock   off      	Failed to lock RAM pages. Consider granting CAP_IPC_LOCK

使用 KES 配置 MinIO

分配策略

通过分配适当的策略和标识将 MinIO 和 KES 链接在一起。

在 KES 所在的 Ubuntu Pod 终端中:将 MinIO 标识分配给 MinIO 策略。

cd ~/kes

export KES_SERVER=https://127.0.0.1:7373

export KES_CLIENT_KEY=minio-admin.key

export KES_CLIENT_CERT=minio-admin.crt

kes policy assign -k minio $(kes identity of minio.crt)

预期:


root@ubuntu:/# cd ~/kes

export KES_SERVER=https://127.0.0.1:7373

export KES_CLIENT_KEY=minio-admin.key

export KES_CLIENT_CERT=minio-admin.crt

kes policy assign -k minio $(kes identity of minio.crt)

root@ubuntu:~/kes#

root@ubuntu:~/kes#

root@ubuntu:~/kes#

root@ubuntu:~/kes#

root@ubuntu:~/kes#

root@ubuntu:~/kes# printenv | grep KES_SERVER

KES_SERVER=https://127.0.0.1:7373

root@ubuntu:~/kes#

服务器设置

在 MinIO 和 KES 之间建立连接,定义加密端点和凭据:

  • 创建 kes-minio 密钥

  • 将 ~/kes/minio.key 和 ~/kes/minio.crt 从 ubuntu pod 复制到您的笔记本电脑

下面的这两个文件来自以下行: kes identity new --key minio.key --cert minio.crt minio

# /Users/aj/minio/private.key is ~/kes/minio.key

# /Users/aj/minio/public.crt is ~/kes/minio.crt

kubectl create secret generic kes-minio -n tenant-lite --from-file=/Users/aj/minio/private.key --from-file=/Users/aj/minio/public.crt


  • 创建 kes-minio-public 密钥:

1 . 将 ~/kes/private.key 和 ~/kes/public.crt 从 ubuntu pod 复制到您的笔记本电脑

2 . 下面的这两个文件来自以下行:kes identity new --ip “10.244.2.7” localhost:


# /Users/aj/minio/private.key is ~/kes/private.key

# /Users/aj/minio/public.crt is ~/kes/public.crt

kubectl create secret generic kes-minio-public -n tenant-lite --from-file=/Users/aj/minio/private.key --from-file=/Users/aj/minio/public.crt


k edit tenant -n tenant-lite


apiVersion: minio.min.io/v2

kind: Tenant

metadata:

  name: storage

  namespace: minio-tenant

spec:

  # externalClientCertSecrets is to share the secret with the MinIO Pods:

  # Under: /tmp/certs/client-0 You will find:

  # client.crt and client.key

  # And we can use these files to setup KES in k8s

  externalClientCertSecrets:

  - name: kes-minio

	type: Opaque

  - name: kes-minio-public

	type: Opaque

  env:

	# Set MINIO_KMS_KES_ENDPOINT

	# It is the IP of the Ubuntu Pod.

	- name: MINIO_KMS_KES_ENDPOINT

  	value: "https://<IP-ADDRESS-OF-UBUNTU-POD>:7373"

	# Set MinIO Client Credentials, it comes from kes-minio secret

	- name: MINIO_KMS_KES_CERT_FILE

  	value: "/tmp/certs/client-0/client.crt"

	# Set MinIO Client Credentials, it comes from kes-minio secret

	- name: MINIO_KMS_KES_KEY_FILE

  	value: "/tmp/certs/client-0/client.key"

	# Set MinIO Default Key

	- name: MINIO_KMS_KES_KEY_NAME

  	value: "minio-default-key"

	# Trust the KES Server Certificate, it comes from kes-minio-public secret

	- name: MINIO_KMS_KES_CAPATH

  	value: "/tmp/certs/client-1/client.crt"

	# Root User

	- name: MINIO_ROOT_USER

  	value: minio

	# ROOT Password:

	- name: MINIO_ROOT_PASSWORD

  	value: minio123
    

加密操作

通过创建加密存储桶并配置服务器端加密来执行加密操作:

mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123

mc rb myminio/my-bucket --force # remove previous bucket to start fresh

mc mb myminio/my-bucket # create new bucket

mc admin kms key create myminio minio-my-bucket # create key

mc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucket

结果的验证和测试

通过验证是否可以通过 MinIO 创建和访问密钥,确保您的设置正确:


root@ubuntu:/# mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123

Added `myminio` successfully.

root@ubuntu:/# mc rb myminio/my-bucket --force # remove previous bucket to start fresh

mc: <ERROR> Unable to validate target `myminio/my-bucket`. Bucket `my-bucket` does not exist.

root@ubuntu:/# mc mb myminio/my-bucket # create new bucket

Bucket created successfully `myminio/my-bucket`.

root@ubuntu:/# mc admin kms key create myminio minio-my-bucket # create key

Created master key `minio-my-bucket` successfully

root@ubuntu:/# mc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucket

Auto encryption configuration has been set successfully for myminio/my-bucket

root@ubuntu:/#

最后的思考

按照概述的步骤操作后,您已在 Kubernetes 集群中成功部署了有状态 KES。通过此配置,您可以管理集群中的加密密钥,从而简化部署并减少对外部 KMS 解决方案的依赖。这可确保您的 AI/ML 工作负载平稳运行,而不会出现依赖于基础架构中这一关键功能的中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Window和linux杀死进程的方式(命令行版)

在本文中&#xff0c;我们将探讨如何在Windows和Linux操作系统下高效地终止指定的进程&#xff0c;涵盖基本命令与高级技巧&#xff0c;确保您能灵活应对各种管理需求。 linux杀死进程 在终端中&#xff0c;我们通过下面命令找到端口运行的程序 lsof -i:72812. 然后输入下面…

见证数据的视觉奇迹——DataV Atlas

引言 前段时间一直沉迷于AI方向&#xff0c;几乎很久没碰大数据开发的相关内容了&#xff0c;今天突然看到阿里活动又推出DataV的体验了&#xff0c;我直接“啪”的一下就点进来了&#xff0c;很快啊&#xff01;本来之前开发数字孪生的时候就接触过基础的DataV操作了&#x…

北京BJ90升级新款迈巴赫大连屏四座头等舱行政四座马鞍

北京BJ90升级奔驰迈巴赫头等舱行政四座大联屏的内饰效果会非常出色&#xff0c;将为车辆带来更豪华、高端的内饰氛围。以下是升级后可能的效果&#xff1a; • 科技感提升&#xff1a;奔驰的中控系统一直以来都以其先进的科技和用户友好的界面而闻名。升级后&#xff0c;北京B…

Retrieval-Augmented Generation for Large Language Models A Survey

Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 文章目录 Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 Abstract背景介绍 RAG概述原始RAG先进RAG预检索过程后检索过程 模块化RAGModules部分Patterns部分 RAG…

TEMU自养号测评系统如何搭建,有哪些要求

TEMU全托管目前优点是全程不用去运营&#xff0c;只要做好选品&#xff0c;质检就可以了。缺点是无法自由决定产品的营销策略&#xff0c;这也是使得卖家会去通过自养号测评方式来为产品链接打造权重。 TEMU自养号测评的搭建是一个涉及多个步骤和细节的过程。以下是一个清晰的…

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍 进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法&#xff0c;具有较强的局部搜索能力。在每次迭代过程中&#xff0c;EGS方法首先用受进化启发的形式估计梯度方向&#xff0c;然后以最陡下降的方式执行实际的迭代步骤&…

QListView、QTableView或QTreeView截取滚动区域(截长图)

本文以QTreeView为例,理论上继承自QAbstractScrollArea的类都支持本文所述的方法。 一.效果 一共5个文件夹,每个文件文件夹下有5个文件,先把文件夹展开,然后截图。将滚动条拖到居中位置,是为了证明截图对滚动条无影响 下面是截的图 二.原理 将滚动区域的viewport设置为…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin&#xff0c;这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具&#xff0c;官网链接&#xff1a;Thonny, Python IDE for beginners。 参考博客:用M…

已解决javax.management.BadBinaryOpValueExpException异常的正确解决方法,亲测有效!!!

已解决javax.management.BadBinaryOpValueExpException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 分析错误日志 检查操作数合法性 确认操作数类型匹配 优化代码逻辑 增…

如何发现Redis热Key,有哪些解决方案?

什么是 hotkey&#xff1f; 如果一个 key 的访问次数比较多且明显多于其他 key 的话&#xff0c;那这个 key 就可以看作是 hotkey&#xff08;热 Key&#xff09;。例如在 Redis 实例的每秒处理请求达到 5000 次&#xff0c;而其中某个 key 的每秒访问量就高达 2000 次&#x…

【HTTPS云证书部署】SpingBoot部署证书

这里以华为云证书为例。 1. 下载证书 2. 解压 3. 选择.top_Tomcat复制到SpringBoot的Resource/source下 4. 在.properties文件中进行配置 修改key-store和key-store-password

秋招突击——第八弹——Redis是怎么运作的

文章目录 引言正文Redis在内存中是怎么存储的面试重点 Redis是单线程还是多线程面试重点 内存满了怎么办&#xff1f;面试重点 持久化介绍面试重点 RDB持久化面试重点 AOF日志面试重点 总结 引言 差不多花了两天把redis给过了&#xff0c;早上也只背了一半&#xff0c;完成回去…

正则表达式与文本处理器

正则表达式 基础正大表达式 查看特定字符 grep grep-n the test.txt grep-in the test.txt-n 显示行号 -i 不区分大小写 -v 反转查找 [] &#xff1a;中括号里可以写元素&#xff0c;内容符合任意元素&#xff0c;就会过滤出来 ^ :写在中括号里&#xff0c;代表取反。以^开头&…

微信 小程序应用,页面,组件的生命周期

组件生命周期 组件的生命周期&#xff1a;指的是组件自身的一些钩子函数&#xff0c;这些函数在特定的时间节点时被自动触发 组件的生命周期函数需要在 lifetimes 字段内进行声明 最重要的生命周期是 created attached detached 包含一个组件生命周期流程的最主要时间点 定…

天马学航——智慧教务系统(移动端)开发日志三

天马学航——智慧教务系统(移动端)开发日志三 日志摘要&#xff1a;更新了学生选课模块、我的课程模块以及退课的功能&#xff0c;优化了后端数据库的缓存 1、学生选课模块 学生选课模块主要实现&#xff0c;学生根据需求进行选课操作&#xff0c;通过后端查询到所有教师的课…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-37微调

37微调 import os import torch import torchvision from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt from d2l import torch as d2l# 获取数据集 d2l.DATA_HUB[hotdog] (d2l.DATA_URL hotdog.zip,fba480ffa8aa7e0febbb511d181409f899b9baa5…

手撕RPC——前言

手撕RPC——前言 一、RPC是什么&#xff1f;二、为什么会出现RPC三、RPC的原理3.1 RPC是如何做到透明化远程服务调用&#xff1f;3.2 如何实现传输消息的编解码&#xff1f; 一、RPC是什么&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff…

RealityCheck™电机监测和预测性维护模型

RealityCheck™电机 一个附加的软件工具箱&#xff0c;可实现条件监测和预测性维护功能&#xff0c;而无需依赖额外的传感器。相反&#xff0c;它使用来自电机控制过程的电子信息作为振动和其他传感器的代理。凭借其先进的信号处理和机器学习(ML)模型&#xff0c;RealityCheck …

示例:推荐一个应用Adorner做的表单对话框

一、目的&#xff1a;开发过程中经常会修改和查看一个Model的数据&#xff0c;一般情况下会自定义一个控件或Window去显示Model数据&#xff0c;但这种数据如果比较多会增加很多开发工作&#xff0c;本文介绍一种通用的方式&#xff0c;应用表达Form控件去简化处理&#xff0c;…

ARM裸机:基础了解

ARM的几种版本号 ARM内核版本号 ARMv7 ARM SoC版本号 Cortex-A8 芯片型号 S5PV210 ARM型号的发展历程 m microcontroller微控制器 就是单片机 a application应用级处理器 就是手机、平板、电脑的CPU r realtime实时处理器 响应速度快,主要用在工业、航天等领域 soc 、cpu、…