适用于 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 工作负载平稳运行,而不会出现依赖于基础架构中这一关键功能的中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值