适用于 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: v1kind: Podmetadata:name: ubuntunamespace: tenant-litelabels:app: ubuntuspec:containers:- image: ubuntucommand:- "sleep"- "604800"imagePullPolicy: IfNotPresentname: ubunturestartPolicy: AlwaysEOF
安装 KES 和 mc

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


apt updateapt install wgetwget https://github.com/minio/kes/releases/latest/download/kes-linux-amd64mv kes-linux-amd64 keschmod +x kesmv kes /usr/local/bin/keswget https://dl.min.io/client/mc/release/linux-amd64/mcchmod +x mcmv mc /usr/local/bin/mc

为 KES 配置持久性存储

持久性目录创建

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

rm -rf ~/kesmkdir ~/kescd ~/kestouch init.yml
身份管理

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

cd ~/keskes identity new --key sys-admin.key --cert sys-admin.crt kes-sys-adminkes identity new --key minio-admin.key --cert minio-admin.crt minio-adminkes identity new --key minio.key --cert minio.crt miniokes 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 ~/kesroot@ubuntu:~/kes# lsdata  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-adminroot@ubuntu:~/kes#

创建 KES 解封密钥。


cat /dev/urandom | head -c 32 | base64 # put the result in the .bashrcvi ~/.bashrcexport KES_UNSEAL_KEY=<VALUE-FROM-ABOVE-COMMAND>source ~/.bashrcecho $KES_UNSEAL_KEY # it should print the value

初始化 KES 部署

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

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

cd ~/kesecho "version: v1" > ~/kes/init.ymlecho "address: 0.0.0.0:7373" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "tls:" >> ~/kes/init.ymlecho "  key: private.key" >> ~/kes/init.ymlecho "  cert: public.crt" >> ~/kes/init.ymlecho "  client:" >> ~/kes/init.ymlecho "	verify_cert: false" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "system:" >> ~/kes/init.ymlecho "  admin:" >> ~/kes/init.ymlecho "	identity: $(kes identity of sys-admin.crt)" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "unseal:" >> ~/kes/init.ymlecho "  environment:" >> ~/kes/init.ymlecho "	name: KES_UNSEAL_KEY" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "enclave:" >> ~/kes/init.ymlecho "  default:" >> ~/kes/init.ymlecho "	admin:" >> ~/kes/init.ymlecho "  	identity: $(kes identity of minio-admin.crt)" >> ~/kes/init.ymlecho "	policy:" >> ~/kes/init.ymlecho "  	minio:" >> ~/kes/init.ymlecho "    	allow:" >> ~/kes/init.ymlecho "    	- /v1/api" >> ~/kes/init.ymlecho "    	- /v1/log/audit" >> ~/kes/init.ymlecho "    	- /v1/log/error" >> ~/kes/init.ymlecho "    	- /v1/key/create/*" >> ~/kes/init.ymlecho "    	- /v1/key/generate/*" >> ~/kes/init.ymlecho "    	- /v1/key/decrypt/*" >> ~/kes/init.ymlecho "    	- /v1/key/bulk/decrypt/*" >> ~/kes/init.yml
初始化

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


cd ~/kes # where init.yml is savedkes init --config init.yml ~/kes/data

预期为


root@ubuntu:~/kes# cd ~/kes # where init.yml is savedkes init --config init.yml ~/kes/dataTLS:· Private Key:  private.key· Certificate:  public.crtSystem:· Identity:  1a65f6f86c3268b30528fe4aab88fc6994730346e1c1863052fa3fa192d77d3eUnseal:· 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/dataCopyright  MinIO, Inc.  https://min.ioLicense	GNU AGPLv3   https://www.gnu.org/licenses/agpl-3.0.htmlVersion	v0.22.3  	linux/amd64Endpoints  https://127.0.0.1:7373https://10.244.4.2:7373mTLS   	skip verify  Client certificates are not verifiedMem Lock   off      	Failed to lock RAM pages. Consider granting CAP_IPC_LOCK

使用 KES 配置 MinIO

分配策略

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

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

cd ~/kesexport KES_SERVER=https://127.0.0.1:7373export KES_CLIENT_KEY=minio-admin.keyexport KES_CLIENT_CERT=minio-admin.crtkes policy assign -k minio $(kes identity of minio.crt)

预期:


root@ubuntu:/# cd ~/kesexport KES_SERVER=https://127.0.0.1:7373export KES_CLIENT_KEY=minio-admin.keyexport KES_CLIENT_CERT=minio-admin.crtkes 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_SERVERKES_SERVER=https://127.0.0.1:7373root@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.crtkubectl 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.crtkubectl 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/v2kind: Tenantmetadata:name: storagenamespace: minio-tenantspec:# 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 k8sexternalClientCertSecrets:- name: kes-miniotype: Opaque- name: kes-minio-publictype: Opaqueenv:# Set MINIO_KMS_KES_ENDPOINT# It is the IP of the Ubuntu Pod.- name: MINIO_KMS_KES_ENDPOINTvalue: "https://<IP-ADDRESS-OF-UBUNTU-POD>:7373"# Set MinIO Client Credentials, it comes from kes-minio secret- name: MINIO_KMS_KES_CERT_FILEvalue: "/tmp/certs/client-0/client.crt"# Set MinIO Client Credentials, it comes from kes-minio secret- name: MINIO_KMS_KES_KEY_FILEvalue: "/tmp/certs/client-0/client.key"# Set MinIO Default Key- name: MINIO_KMS_KES_KEY_NAMEvalue: "minio-default-key"# Trust the KES Server Certificate, it comes from kes-minio-public secret- name: MINIO_KMS_KES_CAPATHvalue: "/tmp/certs/client-1/client.crt"# Root User- name: MINIO_ROOT_USERvalue: minio# ROOT Password:- name: MINIO_ROOT_PASSWORDvalue: minio123

加密操作

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

mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123mc rb myminio/my-bucket --force # remove previous bucket to start freshmc mb myminio/my-bucket # create new bucketmc admin kms key create myminio minio-my-bucket # create keymc 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 minio123Added `myminio` successfully.root@ubuntu:/# mc rb myminio/my-bucket --force # remove previous bucket to start freshmc: <ERROR> Unable to validate target `myminio/my-bucket`. Bucket `my-bucket` does not exist.root@ubuntu:/# mc mb myminio/my-bucket # create new bucketBucket created successfully `myminio/my-bucket`.root@ubuntu:/# mc admin kms key create myminio minio-my-bucket # create keyCreated master key `minio-my-bucket` successfullyroot@ubuntu:/# mc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucketAuto encryption configuration has been set successfully for myminio/my-bucketroot@ubuntu:/#

最后的思考

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年华为OD机试真题-万能字符单词拼写-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 有一个字符串数组words和一个字符串chars。 假如可以用chars中的字母拼写出words中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。 words的字符仅由 a-z 英文小…

Spring Boot 3 整合 Redisson 实现分布式锁

Spring Boot 3 整合 Redisson 实现分布式锁 这篇博客详细介绍了如何在 Spring Boot 3 项目中使用 Redisson 实现分布式锁&#xff0c;包括依赖引入、Redis 配置、Redisson 配置、实现锁服务&#xff0c;以及测试控制器。希望对你有帮助&#xff01; 介绍 在分布式系统中&#…

Spring boot 单元测试类

在Spring Boot中&#xff0c;我们可以使用Spring Boot Test框架来进行单元测试。这是一个非常强大的工具&#xff0c;可以帮助我们模拟Spring环境&#xff0c;进行各种测试&#xff0c;如集成测试、容器测试等。 以下是一些Spring Boot 单元测试的示例。 基本的Spring Boot测…

【2024最新精简版】线程安全/多线程 面试篇

文章目录 一. 线程基础线程和进程什么是进程什么是线程 并发与并行的区别创建线程继承Thread类实现Runable接口实现Callable接口使用线程池 线程状态等待唤醒机制等待方法唤醒方法 二. 线程池线程池作用创建线程池线程池任务调度流程阻塞队列 BlockingQueue线程池拒绝策略核心线…

只有程序员才能看懂的笑话

哈喽&#xff0c;大家好&#xff0c;我是明智 今天又是周五摸鱼日&#xff5e; 咱们不聊技术&#xff0c;看点别的有意思的东西 往期摸鱼记录&#xff1a; 》》》程序员的那些经典段子 》》》写出bug不用怕&#xff0c;世界就是一个巨大的草台班子 【1】二进制 世界上有10种人&…

三维渲染计算阴影

在三维渲染中&#xff0c;计算阴影是提升场景真实感的关键步骤。阴影不仅提供了物体间的相对位置和空间关系&#xff0c;还增强了场景的立体感和深度感。计算阴影的方法多种多样&#xff0c;以下是几种主要的阴影计算技术及其实现原理。 1. 阴影映射&#xff08;Shadow Mappin…

随机链表的复制 排序链表

随机链表的复制 题目 . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 思路&#xff1a; ①一个结点一个节点去拷贝&#xff0c;当拷贝了第一个节点的时候&#xff0c;把原节点与拷贝节点连接起来&#xff0c;直接到所有的节点拷贝完毕&#xff0c;这样做的目的…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST WebSock…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

怎么判断文件 fileoutPutStream已经拷贝成功? 项目需求是判断fileInputStream已经拷贝

要判断文件 fileoutPutStream 已经拷贝成功&#xff0c;可以通过以下几个步骤来实现&#xff1a; 1. **确保所有数据都已写入**: 使用 FileOutputStream 的 getFD().sync() 方法&#xff0c;这会强制将所有未写的数据写入到磁盘上。 2. **检查流是否关闭成功**: 在关闭…

一文讲解什么是内容可寻址寄存器(Content-Addressable Register)

内容可寻址寄存器&#xff08;Content-Addressable Register&#xff0c;CAR&#xff09;是一种根据内容而非地址来存取数据的存储单元。这种寄存器可以通过指定的数据值来查找对应的存储位置&#xff0c;显著提高了数据匹配和检索的效率&#xff0c;尤其适用于需要快速数据查找…

MLX5_SET_TO_ONES宏解析

看代码时&#xff0c;遇到一个非常复杂的宏MLX5_SET_TO_ONES&#xff0c;这个宏的主要作用是对特定的数据结构置位&#xff0c;宏的上下文如下&#xff1a; #define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0) #define __mlx5_bit_off(typ, fld) (offsetof(struc…

[程序员] 表达的能力

之前看CSDN的问答区&#xff0c;很多时候&#xff0c;感觉问题的描述所要表达的意思非常模糊&#xff0c;或者说描述不清。如果是想回答问题的人想回答问题&#xff0c;首先要搞清楚是什么问题&#xff0c;就需要再问问题主很多细节的东西。三来四去&#xff0c;才能搞清楚具体…

C++ 代码实现鼠标右键注册菜单,一级目录和二级目录方法

最近做的一个项目, 在使用windows的时候,我希望在右键菜单中添加一个自定义的选项, 该选项下有我经常使用的多个程序快捷方式, 直接上代码 头文件 #pragma once #include <Windows.h> #include <iostream> #include <string> using namespace std; …

面向服务的架构(Service-Oriented Architecture, SOA)

目录 前言1. SOA的基本概念1.1 定义和特点1.2 核心原则 2. SOA的优势与挑战2.1 优势2.2 挑战 3. SOA的实现技术3.1 Web服务3.2 微服务架构3.3 企业服务总线&#xff08;ESB&#xff09; 4. SOA在现代企业中的应用4.1 金融行业4.2 电子商务4.3 政府和公共服务4.4 医疗健康 结语 …

EE trade:炒伦敦金的注意事项及交易指南

在贵金属市场中&#xff0c;伦敦金因其高流动性和全球认可度&#xff0c;成为广大投资者的首选。然而&#xff0c;在炒伦敦金的过程中&#xff0c;投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格&#xff1a; 买价(B…

LeetCode 1-两数之和

LeetCode第1题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

力扣SQL50 各赛事的用户注册率 分组计数 双排序字段

Problem: 1633. 各赛事的用户注册率 &#x1f468;‍&#x1f3eb; 参考题解 Code select contest_id, ROUND(COUNT(user_id) * 100 / (select count(*) from users),2) as percentage from register group by contest_id order by percentage desc, contest_id asc

vue3自动导入---组件库elements-ui,vuetify以及scss样式的自动导入

自动导入 我们在使用第三方组件库和css样式文件时&#xff0c;都需要进行引入&#xff0c;可以在单个组件内单独引用&#xff0c;也可以在全局引入或一次引入所有组件&#xff1b;但是&#xff0c;一般情况下我们都不会全部引入&#xff0c;这会是打包的结果变大&#xff0c;而…

linux挂载硬盘(解决linux不显示硬盘问题)

目录 1.查看系统有几块硬盘2.查看挂载情况3.格式化硬盘4.创建挂载目录用于挂载硬盘5.将硬盘挂载到指定的挂载目录6.随系统自启动挂载查看配置文件&#xff0c;看是否已经把这条命令加入配置 帮同门解决挂载失败问题记录 参考视频&#xff1a;只要6步&#xff01;Linux系统下挂载…